spider middleware(spider中间件)的认识
一、关于spider
中间件的认识
- 1、
spider
中间件是介入到scrapy
的spider
处理机制的钩子框架,可以用来处理发送给spider
的Response
及spider
产生的item
和request
; - 2、关于
spider
中间件在scrapy
中的位置图请查看第八章第二小节中; - 3、从图中可以看书,当
Downloaded middleware
生成的response
之后,response
会被发送给spider
,但是引擎和spider
中间有一层spider middleware
; - 4、
spider middleware
的主要作用:- 在
response
到达spider
之前可以对response
进行处理; - 在
spider
生成的request
到调度器之前可以对request
进行处理; - 在
spider
生成的item
发送给pipeline
之前对item
进行处理。
- 在
二、使用方式
1、必须先到
settings.py
中注册激活才能使用SPIDER_MIDDLEWARES = { 'blog_page1.middlewares.BlogPage1SpiderMiddleware': 543, }
三、关于scrapy
中内置的spider middleware
1、源码地址
2、引包地址及配置信息
from scrapy.spidermiddlewares.httperror import HttpErrorMiddleware from scrapy.spidermiddlewares.offsite import OffsiteMiddleware from scrapy.spidermiddlewares.referer import RefererMiddleware from scrapy.spidermiddlewares.urllength import UrlLengthMiddleware from scrapy.spidermiddlewares.depth import DepthMiddleware SPIDER_MIDDLEWARES = { 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500, 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700, 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800, 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900, }
3、有兴趣的可以自己阅读下源码
四、书写spider middleware
1、几个核心的方法(只要实现其中一个方法就可以称之为
spider middleware
)process_spider_input(respone, spider)
process_spider_output(respone, result, spider)
process_spider_exception(respone, exception, spider)
process_start_requests(start_requests, spider)
2、
process_spider_input(respone, spider)
当
respone
通过spider
中间件时候,该方法会被调用,处理respone
,应当返回None
或者抛出一个异常- 当返回
None
的时候,spider
会继续执行别的spider middleware
- 当产生一个异常的时候
scrapy
就不会调用任何其他中间件的process_spider_input
方法,并调用request
和errback
。errback
的输出将会以另一个方向被重新输入到中间链中,使用process_spider_output
方法来处理 - 当抛出一个异常的时候将会调用
process_spider_exception
方法
- 当返回
3、
process_spider_output
方法当
spider
处理respone
返回result
的时候触发4、
process_spider_exception
方法当
process_spider_input
抛出异常的时候触发的5、
process_start_requests
方法该方法在
spider
启动request
为参数被调用