Spider Middleware
Spider Middleware是介入到Scrapy 的 Spider 处理机制的钩子框架,当Downloader 生成 Response 之后,Response 会被发送给 Spider,在发送给 Spider 之前,Response会首先经过 Spider Middleware 处理,当 Spider处理生成 Item 和 Request 之后,Item 和Request 还会经过 Spider Middleware 的处理。
Spider Middleware有下面几个作用:
- 可以在 Downloader 生成的 Response 发送给 Spider 之前,也就是在 Response 发送给 Spider之前对 Response 进行处理
- 可以在 Spider 生成的 Request 发送给 Schedule 之前,也就是在 Request 发送给 Schedule 之前对 Request进行处理
- 可以在 Spider 生成的 Item 发送给 Item Pipeline 之前,也就是在 Item 发送给 Item Pipeline 之前对 Item 进行处理
1 | class SpiderMiddleware(object): |
使用说明
其实 Scrapy 已经提供了许多的 Spider Middleware ,它们在default_settings.py文件中被SPIDER_MIDDLEWARES_BASE变量所定义。
1 | SPIDER_MIDDLEWARES_BASE = { |
和 Downloader Middleware 一样,Spider Middleware 首先加入到SPIDER_MIDDLEWARES设置中,该设置会和 Scrapy 中的SPIDER_MIDDLEWARES_BASE 定义的 Spider Middleware 合并,然后根据键值得数字优先排序,得到一个有序列表。需要注意的是越小代表越靠近Scrapy引擎,数字越大越靠近Spider
核心方法
每个Spider Middleware 是一个定义了以下一个或多个方法的Python类 ,核的方法有下面四个:
1 | process_spider_input(self,response, spider) |
process_spider_input(self,response, spider)
- 当 Response 被 Spider Middleware 处理时被调用
- process_spider_input()方法返回 None 或者抛出一个异常
- 如果返回None,Scrapy 将会继续处理该 Response,调用所有其他的 Spider Middleware,直到 Spider处理该 Response。
- 如果抛出一个异常, Scrapy 将不会调用任何其他 Spider Middleware 的process_spider_input()方法,而调用 Request 的 errback() 方法,errback 的输出将会被重新输入到中间件中,使用process_spider_output()方法来处理,当其抛出异常时则调用process_spider_exception()方法来处理
- 参数:
response (Response 对象)
– 被处理的 Responsespider (Spider 对象)
– 该Response 对应的 Spider
process_spider_output(self,response, result, spider)
- 当 Spider 处理 Response 返回结果时被调用
- process_spider_output()方法必须返回以下其中一个:包含Request 或者 Item 对象的可迭代对象
- 参数:
response (Response 对象)
– 生成该输出的 Responseresult(包含Request或Item对象的可迭代对象)
– Spider 返回的结果spider (Spider 对象)
– 其结果对应的 Spider
process_spider_exception(self,response, exception, spider)
- 当 Spider 或 Spider Middleware 的 process_spider_input()方法抛出异常时被调用
- process_spider_exception()方法必须返回以下其中一种:None、包含 Response 或 Item对象的可迭代对象
- 如果返回None,Scrapy 将继续处理该异常,调用其他 Spider Middleware 中的process_spider_exception()方法,直到所有 Spider Middleware 都被调用。
- 如果返回时一个可迭代对象,那么其他 Spider Middleware 的process_spider_exception()方法不会被调用,而是调用process_spider_output()方法
- 参数:
response (Response 对象)
– 异常被抛出时被处理的 Responseexception(Exception对象)
– 被抛出的异常spider (Spider 对象)
– 抛出该异常的 Spider
process_start_requests(self,start_requests, spider)
- 当爬虫启动时调用
- process_start_requests()方法必须返回包含Request 对象的可迭代对象
- 参数:
start_requests (包含Request的可迭代对象)
– Start Requestsspider (Spider 对象)
– Start Requests 所属 Spider