18、python网路爬虫之Scrapy框架中的CrawlSpider详解

CrawlSpider的引入:  

   提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?

   方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法)。

   方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效)

CrawlSpider的简介:

  CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能。其中最显著的功能就是”LinkExtractors链接提取器“。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。

CrawlSpider的使用:

  CrawlSpider的使用和Spider使用差不多,只有在爬虫文件的时候有所有区别

  1.创建scrapy工程:scrapy startproject projectName

  2.切换到当前的工程目录下  cd projectName

   创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com

    --此指令对比以前的指令多了 "-t crawl",表示创建的爬虫文件是基于CrawlSpider这个类的,而不再是Spider这个基类。

   执行爬虫文件 scrapy crawl projectName

  3.观察生成的爬虫文件

     自动生成的爬虫文件 

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule

    class CsSpider(CrawlSpider):
        name = ‘cs‘
        # allowed_domains = [‘www.xxx.com‘]
        start_urls = [‘http://www.xxx.com/‘]

      rules = (
          Rule(LinkExtractor(allow=r‘Items/‘), callback=‘parse_item‘, follow=True),
      )

      def parse_item(self, response):
          i = {}
          #i[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).extract()
          #i[‘name‘] = response.xpath(‘//div[@id="name"]‘).extract()
          #i[‘description‘] = response.xpath(‘//div[@id="description"]‘).extract()
          return i

通常将爬虫文件更改成下面的形式

  # -*- coding: utf-8 -*-
  import scrapy
  from scrapy.linkextractors import LinkExtractor
  # 导入CrawlSpider相关模块
  from scrapy.spiders import CrawlSpider, Rule

  # 表示该爬虫程序是基于CrawlSpider类的
  class CsSpider(CrawlSpider):
      # 爬虫文件名
      name = ‘cs‘
      # allowed_domains = [‘www.xxx.com‘]
      # 起始的url
      start_urls = [‘http://www.xxx.com/‘]

      # 将链接提取器从rules规则解析器中提取出来,
      # 链接提取器:有一个前提(follow=False),作用就是提取起始url对应页面中符合要求的链接
      link = LinkExtractor(allow=r‘Items/‘)  #allow后面跟的是一个正则表达式(符合条件要求或规则)
      # 在rules这个元祖中存放的都是规则解析器
      # 规则解析器的作用:将链接提取器提取的 链接对应的页面源码数据 根据指定要求进行解析     # follow = True: 让链接提取器继续作用在 链接提取器提取出来的 所对应的页面源码中
      rules = (
          Rule(link, callback=‘parse_item‘, follow=True),
          # callback指定解析方式
      )

      def parse_item(self, response):
          i = {}
          #i[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).extract()
          #i[‘name‘] = response.xpath(‘//div[@id="name"]‘).extract()
          #i[‘description‘] = response.xpath(‘//div[@id="description"]‘).extract()
          return i

CrawlSpider的代码详解:

  1. 导入CrawlSpider相关模块

     from scrapy.linkextractors import LinkExtractor

       from scrapy.spiders import CrawlSpider, Rule

  2.LinkExtractor:顾名思义,链接提取器。

    LinkExtractor(

         allow=r‘Items/‘,# 满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。

         deny=xxx,  # 满足正则表达式的则不会被提取。

         restrict_xpaths=xxx, # 满足xpath表达式的值会被提取

         restrict_css=xxx, # 满足css表达式的值会被提取

         deny_domains=xxx, # 不会被提取的链接的domains。 

        )

    - 作用:提取response中符合规则的链接。

  3.Rule : 规则解析器。根据链接提取器中提取到的链接,根据指定规则提取解析器链接网页中的内容。

     Rule(LinkExtractor(allow=r‘Items/‘), callback=‘parse_item‘, follow=True)

    - 参数介绍:

      参数1:指定链接提取器

      参数2:指定规则解析器解析数据的规则(回调函数)

      参数3:是否将链接提取器继续作用到链接提取器提取出的链接网页中。当callback为None,参数3的默认值为true。

  4. rules=( ):指定不同规则解析器。一个Rule对象表示一种提取规则。

  5. callback指定的是解析方式,默认是parse_item

  6. follow参数

     - follow=False  链接提取器 提取起始url对应页面中符合要求的链接

       - follow = True  让链接提取器继续作用在 链接提取器提取出的来链接 所对应的页面源码中

CrawlSpider整体爬取流程:

   a)爬虫文件首先根据起始url,获取该url的网页内容

   b)链接提取器会根据指定提取规则将步骤a中网页内容中的链接进行提取

   c)规则解析器会根据指定解析规则将链接提取器中提取到的链接中的网页内容根据指定的规则进行解析

   d)将解析数据封装到item中,然后提交给管道进行持久化存储

示例:爬取抽屉新热榜首页中所有的页面  

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
# 导入CrawlSpider相关模块
from scrapy.spiders import CrawlSpider, Rule

# 表示该爬虫程序是基于CrawlSpider类的
class CsSpider(CrawlSpider):
    # 爬虫文件名
    name = ‘cs‘
    # allowed_domains = [‘www.xxx.com‘]
    # 起始的url
    start_urls = [‘https://dig.chouti.com/all/hot/recent/1‘]

    # 将链接提取器从rules规则解析器中提取出来,
    # 链接提取器:有一个前提(follow=False),作用就是提取起始url对应页面中符合要求的链接
    link = LinkExtractor(allow=r‘/all/hot/recent/\d+‘)  #allow后面跟的是一个正则表达式(符合条件要求或规则)
    # 在rules这个元祖中存放的都是规则解析器
    # 规则解析器的作用:将链接提取器提取的 链接对应的页面源码数据 根据指定要求进行解析
    # follow=True:让链接提取器继续作用在 链接提取器提取出的来链接 所对应的页面源码中
    rules = (
        Rule(link, callback=‘parse_item‘, follow=False),
        # callback指定解析方式
    )

    def parse_item(self, response):
        print(response)
        # response对应的是对拿到的每一个链接发请求拿到的响应对象

详细代码

一个特殊的情况:

示例:爬取糗事百科糗图板块的所有页码数据

  # 表示该爬虫程序是基于CrawlSpider类的
  class CsSpider(CrawlSpider):
      # 爬虫文件名
      name = ‘cs‘
      # allowed_domains = [‘www.xxx.com‘]
      # 起始的url
     start_urls = [‘https://www.qiushibaike.com/pic/‘]

      # 将链接提取器从rules规则解析器中提取出来,
      # 链接提取器:有一个前提(follow=False),作用就是提取起始url对应页面中符合要求的链接
      link = LinkExtractor(allow=r‘/pic/page/\d+\?‘) #s=为随机数
      link1 = LinkExtractor(allow=r‘/pic/$‘) #s=为随机数
      # 在rules这个元祖中存放的都是规则解析器
      # 规则解析器的作用:将链接提取器提取的 链接对应的页面源码数据 根据指定要求进行解析
      # follow=True:让链接提取器继续作用在 链接提取器提取出的来链接 所对应的页面源码中
      rules = (
          Rule(link, callback=‘parse_item‘, follow=False),
          Rule(link1, callback=‘parse_item‘, follow=True),
          # callback指定解析方式
      )
      def parse_item(self, response):
          print(response)
          # response对应的是对拿到的每一个链接发请求拿到的响应对象

原文地址:https://www.cnblogs.com/mwhylj/p/10274156.html

时间: 2024-10-10 23:13:36

18、python网路爬虫之Scrapy框架中的CrawlSpider详解的相关文章

Python网络爬虫之Scrapy框架(CrawlSpider)

目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). CrawlSpider使

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider)

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider) 引入 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). 今日概要 CrawlSpider简介 CrawlSpider使用 基于CrawlSpider爬虫文件的创建 链接提取器 规则解析器 今日详

Scrapy框架中的CrawlSpider

小思考:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). 一.简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著的功能就是”LinkExtractors链接提取器“.Spider是所有爬虫的基

Python爬虫从入门到放弃(十三)之 Scrapy框架的命令行详解

这篇文章主要是对的scrapy命令行使用的一个介绍 创建爬虫项目 scrapy startproject 项目名例子如下: localhost:spider zhaofan$ scrapy startproject test1 New Scrapy project 'test1', using template directory '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/scra

python爬虫之Scrapy框架中的Item Pipeline用法

当Item在Spider中被收集之后, 就会被传递到Item Pipeline中进行处理. 每个item pipeline组件是实现了简单的方法的python类, 负责接收到item并通过它执行一些行为, 同时也决定此item是否继续通过pipeline, 或者被丢弃而不再进行处理. item pipeline的主要作用 : 1. 清理html数据 2. 验证爬取的数据 3. 去重并丢弃 4. 将爬取的结果保存到数据库中或文件中 编写自己的item pipeline : process_item

python unittest框架中addCleanup函数详解

接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)? Add a function to be called after tearDown() to cleanup resources used during the test. Functions will be called in reverse order to the order they are a

Python分布式爬虫必学框架Scrapy打造搜索引擎

Python分布式爬虫必学框架Scrapy打造搜索引擎 未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自然语言处理.医疗病例分析……越来越多的工作会基于数据来做,而爬虫正是快速获取数据最重要的方式,相比其它语言,Python爬虫更简单.高效 具体的学习scrapy之前,我们先对scrapy的架构做一个简单的了解,之后所有的内容都是基于此架构实现的,在初学阶段只需要简单的了解即可,之后的学习中,你会对此架构有更深的理解.下面是scrapy官网给出的最新的架构图示. 基本组件 引擎

网络爬虫之scrapy框架详解,scrapy框架设置代理

twisted介绍 Twisted是用Python实现的基于事件驱动的网络引擎框架,scrapy正是依赖于twisted, 它是基于事件循环的异步非阻塞网络框架,可以实现爬虫的并发. twisted是什么以及和requests的区别: request是一个python实现的可以伪造浏览器发送Http请求的模块,它封装了socket发送请求 twisted是基于时间循环的异步非阻塞的网络框架,它也封装了socket发送请求,但是他可以单线程的完成并发请求. twisted的特点是: 非阻塞:不等待

python中threading模块详解(一)

python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一.Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行. 这里对使用多线程并发,和不适用多线程并发做