Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

时间:2021-07-05 20:25:46

Spider有以下属性:

Spider属性
name 爬虫名称,定义Spider名字的字符串,必须是唯一的。常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字命名为baidu
allowed_domains 允许爬取的域名,是可选配置,不在此范围的链接不会被跟进爬取。
start_urls

起始URL列表。如果没有实现start_requests()方法,默认会从这个列表开始爬取。

custom_settings 这是一个字典,是专属于Spider的配置。它会覆盖项目全局的设置。此设置必须在初始化前被更新,必须定义成类变量。
crawler 由from_crawler()方法设置的,代表的是本Spider类对应的Crawler对象。Crawler包含了很多项目组件,如Settings,利用它可以获取项目的一些配置信息。
settings 它是一个Settings对象,利用它我们可以直接获取项目的全局设置变量。
start_requests() 此方法用于生成初始请求,它必须返回一个可迭代对象。此方法会默认使用start_urls里面的URL来构造Request,而且Request是Get请求方式,如果我们想在启动时以POST方式访问某个站点,可以直接重写这个方法,发送POST请求使用FormRequest即可。
parse() 当Response没有指定回调函数时,该方法默认会被调用。它负责处理Response,处理返回结果,并从中提取出想要的数据和下一步的请求。然后返回。该方法需要返回一个包含Request或Item的可迭代对象。
closed() 当Spider关闭时,该方法会被调用,在这里一般会定义释放资源的一些操作或其他收尾操作。

 

 

 

 

Downloader Middleware即下载中间件,它是处于Scrapy的Request和Response之间的处理模块。Downloader的作用有两个:1.在Scheduler发送Request给Downloader之前修改Request。2。在Response发送给Spider之前对其进行修改。

Scrapy已经内置了许多Downloader Middleware,如果想要添加自己定义的Downloader Middleware,需要在Settings.py中将DOWNLOADER_MIDDLEWARES部分取消注释,修改为自己想要添加的Downloader Middleware,冒号后的数字即优先级,数字越小优先级越高。

Downloader Middleware有三个核心方法:

  1. process_request(request,spider)
  2. process_response(request,response,spider)
  3. process_exception(request,exception,spider)

至少需要实现其中的一个方法才可以定义自己的Downloader Middleware。接下来介绍这三个方法:

Request被Engine发送给Downloader之前,process_request()方法会被调用,返回值为None,Response对象、Request对象之一,或者抛出IgnoreRequest异常。

process_request()
返回None 调用优先级更低的Downloader Middleware的process_request()方法进行处理
返回Response 依次调用所有的Downloader Middleware的process_response()方法进行处理
返回Request 返回值进入Scheduler调度队列直到下一次被调度
抛出异常 依次调用所有的Downloader Middleware的process_exception()方法进行处理

Downloader 在执行下载之后,会得到对应的Response,Engine会把Response发送给Spider进行解析之前,process_response()方法会被调用,返回值为Request对象、Response对象之一,或者抛出IgnoreRequest异常。

process_request()
返回Request 返回值进入Scheduler调度队列直到下一次被调度
返回Response 调用优先级更低的Downloader Middleware的process_response()方法进行处理
抛出异常 Request的errorback()方法回调,若该异常仍未被处理,那么它会被忽略。

当Downloader或process_request()方法抛出异常时,process_exception()方法会被调用,返回值为None,Response对象、Request对象之一。

process_exception()
返回None 调用优先级更低的Downloader Middleware的process_exception()方法进行处理
返回Response 依次调用所有的Downloader Middleware的process_response()方法进行处理
返回Request 返回值进入Scheduler调度队列直到下一次被调度

 

 

 

Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架。Spider Middleware有以下3个作用:1.在Downloader发送Response给Spider之前对其进行处理。2.在Spider发送Request给Scheduler之前对其进行处理。3.在Spider发送Item给Item Pipeline之前对其进行处理。

跟Downloader Middleware一样,Scrapy已经内置了许多Spider Middleware,如果想要添加自己定义的Spider Middleware,需要在Settings.py中将SPIDER_MIDDLEWARES部分取消注释,修改为自己想要添加的Spider Middleware。

Spider Middleware有以下4个核心方法:

  • process_spider_input(response,spider)
  • process_spider_ouput(response,result,spider)
  • process_spider_exception(response,exception,spider)
  • process_start_requests(start_requests,spider)

至少需要实现其中的一个方法才可以定义自己的Spider Middleware。接下来介绍这四个方法:

当Downloader发送Response给Spider解析时,process_spider_input()方法被调用,返回值为None或者抛出一个异常。

process_spider_input()
返回None 调用优先级更低的Spider Middleware的process_spider_input()方法进行处理
抛出异常 调用Request的errback()方法,errback()的输出将会重新输入到中间件中,使用process_spider_output()方法来处理,若抛出异常则调用process_spider_exception()处理

当Spider发送Item给Item Pipeline时,process_spider_ouput()方法被调用,返回值为Request或Item对象的可迭代对象。

当Spider或process_spider_input()方法抛出异常时,process_spider_exception()方法被调用,返回值为None或包含Response或Item对象的可迭代对象。

process_spider_exception()
返回None 调用优先级更低的Spider Middleware的process_spider_exception()方法进行处理
返回一个可迭代对象 依次调用所有的Spider Middleware的process_spider_ouput()方法进行处理

process_start_requesrs()方法以Spider启动的Request为参数被调用,返回一个包含Request对象的可迭代对象。

 

 

 

当Spider解析完Response后,会new一个Item对象发送到Item Pipeline。Item Pipeline的作用有:

  • 清理HTML数据
  • 验证爬取数据,检查爬取字段
  • 查重并丢弃重复内容
  • 将爬取结果保存到数据库

若要自定义Item Pipeline ,必须实现Item Pipeline的process_item(item,spider)方法。下面介绍Item Pipeline的常用方法:

process_item(item,spider)

process_item(item,spider)是必须实现的方法,Item Pipeline默认调用该方法对Item进行处理,返回值为Item对象或者抛出DropItem异常。

process_item(item,spider)
返回Item 调用优先级更低的Item Pipeline的process_item(item,spider)方法进行处理
抛出异常 丢弃该Item,不进行处理

open_spider(self,spider)

open_spider(self,spider)在Spider开启时自动调用,可以在这里进行一些初始化操作。

close_spider(spider)

close_spider(spider)Spider关闭时自动调用,可以在这里进行收尾操作。

from_crawler(cls,crawler)

from_crawler(cls,crawler)是一个类方法,用@classmethod进行标识,它的参数是crawler,通过它可以拿到Scrapy的所有核心组件,然后创建一个Pipeline实例。参数cls就是Class,最后返回一个Class类型。