【Scrapy 框架】「版本2.4.0源码」Spider中间件(Spider Middleware)详解篇

全部源码解析文章索引目录传送门

【Scrapy 框架】版本 2.4.0 源码篇:全部配置目录索引

内容介绍

Spider中间件是Scrapy的Spider处理机制的一个挂钩框架,您可以在其中插入自定义功能,以处理发送到Spider进行处理的响应以及处理从Spider生成的请求和项目。

激活蜘蛛中间件

要激活Spider中间件组件,请将其添加到 SPIDER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序。

SPIDER_MIDDLEWARES = {
    
    
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}

全部中间件设置

SPIDER_MIDDLEWARES_BASE = {
    
    
    '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,
}

自定义Spider中间件

class scrapy.spidermiddlewares.SpiderMiddleware

process_spider_input(self, response, spider)

对于通过spider中间件并进入spider的每个响应,都会调用此方法进行处理。process_spider_input()应该返回None或提出异常。

  1. 如果它返回None,Scrapy将继续处理此响应,执行所有其他中间件,直到最后,响应被交给spider进行处理。
  2. 如果它引发异常,Scrapy将不会调用任何其他spider中间件的process_spider_input(),将调用请求errback(如果有的话),否则它将进入process_spider_exception()。

参数:

  • response(Responseobject) - 正在处理的响应
  • spider(Spiderobject) - 此响应所针对的spider

process_spider_output(self, response, result, spider)

在处理完响应之后,使用Spider返回的结果调用此方法。
process_spider_output()必须返回一个可迭代的 Request,dict或Item 对象。

参数:

  • response(Responseobject) - 从spider生成此输出的响应
  • result(可迭代的Request,dict或Item对象) - spider返回的结果
  • spider(Spiderobject) - 正在处理其结果的spider

process_spider_exception(self, response, exception, spider)

当spider或process_spider_output() 方法(来自先前的spider中间件)引发异常时,将调用此方法。process_spider_exception()应该返回一个None或一个可迭代的Request,dict或 Item对象。

  1. 如果它返回None,Scrapy将继续处理此异常,执行process_spider_exception()以下中间件组件中的任何其他组件,直到没有剩余中间件组件并且异常到达引擎(它被记录并丢弃)。
  2. 如果它返回一个iterable,那么process_spider_output()管道将从下一个spider中间件开始启动,并且不会process_spider_exception()调用其他任何一个 。

参数:

  • response(Responseobject) - 引发异常时正在处理的响应
  • exception(异常对象) - 引发异常
  • spider(Spiderobject) - 引发异常的spider

process_start_requests(self, start_requests, spider)

当spider运行到start_requests()的时候,爬虫中间件的process_start_requests()方法被调用,接收一个iterable(在start_requests参数中)并且必须返回另一个可迭代的Request对象。

参数:

  • start_requests(可迭代Request) - 开始请求
  • spider(Spiderobject) - 启动请求所属的spider

from_crawler(cls, crawler)

这个类方法通常是访问settings和signals的入口函数

spider中间件总结

  1. spider开始start_requests()时,调用spider中间件的process_start_requests()。

  2. response成功后,返回 spider 回调函数 parse,调用process_spider_input()。

  3. 当spider yield scrapy.Request()或者yield item 时,调用 spider 中间件的process_spider_output()方法。

  4. 当 spider 出现了 Exception 时,调用 spider 中间件的process_spider_exception() 方法。

内置Spider中间件参数参考

DepthMiddleware(深度中间件)

用于跟踪要抓取的站点内每个请求的深度。

class scrapy.spidermiddlewares.depth.DepthMiddleware

spider.py中的设置

request.meta['depth'] = 0

参数:

  • DEPTH_LIMIT 任何网站将允许爬网的最大深度。如果为零,则不施加限制。
  • DEPTH_STATS_VERBOSE 是否收集每个深度的请求数。
  • DEPTH_PRIORITY -是否根据请求的深度确定请求的优先级。

HttpErrorMiddleware(错误响应中间件)

筛选不进行处理的不成功的(错误的)HTTP响应。

class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware

spider.py中的设置

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]

参数:

HTTPERROR_ALLOWED_CODES = [] # 不处理的包含非200状态代码的所有响应。
HTTPERROR_ALLOW_ALL = False # 传递所有响应,无论其状态码如何,默认Fasle

OffsiteMiddleware(过滤作用域中间件)

过滤掉spider涵盖的域之外的URL请求。

classscrapy.spidermiddlewares.offsite.OffsiteMiddleware

spider.py中的设置

allowed_domains = ['http://xxxx.com'] # 只抓取该域名下内容

RefererMiddleware(请求来源中间件)

Referer根据生成请求的响应的URL填充请求标头。

class scrapy.spidermiddlewares.referer.RefererMiddleware

spider.py中的设置

REFERER_ENABLED = True # 是否启用引用中间件。
REFERRER_POLICY = "scrapy-default"
选项 使用的方法类
“scrapy-default” (default) scrapy.spidermiddlewares.referer.DefaultReferrerPolicy
“no-referrer” scrapy.spidermiddlewares.referer.NoReferrerPolicy
“no-referrer-when-downgrade” scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy
“same-origin” scrapy.spidermiddlewares.referer.SameOriginPolicy
“origin” scrapy.spidermiddlewares.referer.OriginPolicy
“strict-origin” scrapy.spidermiddlewares.referer.StrictOriginPolicy
“origin-when-cross-origin” scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy
“strict-origin-when-cross-origin” scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy
“unsafe-url” scrapy.spidermiddlewares.referer.UnsafeUrlPolicy

UrlLength中间件

过滤出网址长度超过URLLENGTH_LIMIT的请求。

class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware

spider.py中的设置

URLLENGTH_LIMIT = 200 # 允许抓取的URL的最大URL长度。

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/113543492