鱼C论坛

 找回密码
 立即注册
查看: 2797|回复: 5

[技术交流] Scrapy学习篇06--Scrapy的middlewares-爬虫中间件介绍

[复制链接]
发表于 2020-1-6 23:18:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Stubborn 于 2020-1-7 16:42 编辑

middlewares(爬虫中间件介绍)



如果你有阅读前面一篇,下载中间件,这个理解起来就不是很难。爬虫中间件的用法与下载器中间件非常相似,只是它们的作用对象不同。下载器中间件的作用对象是请求request和返回response;爬虫中间件的作用对象是爬虫,更具体地来说,就是写在spiders文件夹下面的各个文件。



011.png

爬虫中间件SpiderMiddleware(上图6,7号标记处为下载中间件)

Spider官网,对齐爬虫中间键,解释如下:
Spider中间件是介入到Scrapy的spider处理机制的钩子框架,您可以添加代码来处理发送给 Spiders 的response及spider产生的item和request。


爬虫中间键位于爬虫文件和Scrrapy引擎中间,所以它能处理的是一些,爬虫文件上面的问题,比如爬虫文件没有写完善,出现的Error,你有不能一直盯着电脑,又希望知道是那个url引起的报错 ,就可以用它处理。

同样的,爬虫中间件,有如下几个函数,被Scrapy管理:

  • def process_spider_input(self, response, spider):

    参数介绍:

    • response (Response 对象) – 被处理的response
    • spider (Spider 对象) – 该response对应的spider


    注意事项:
    • 当response通过spider中间件时,该方法被调用,处理该response。
    • process_spider_input() 应该返回 None 或者抛出一个异常。
      • 如果其返回 None ,Scrapy将会继续处理该response,调用所有其他的中间件直到spider处理该response。
      • 如果其跑出一个异常(exception),Scrapy将不会调用任何其他中间件的 process_spider_input() 方法,并调用request的errback。 errback的输出将会以另一个方向被重新输入到中间件链中,使用 process_spider_output() 方法来处理,当其抛出异常时则带调用 process_spider_exception() 。



  • def process_spider_output(self, response, result, spider):

    参数介绍:
    • response (Response 对象) – 生成该输出的response
    • result (包含 Request 或 Item 对象的可迭代对象(iterable)) – spider返回的result
    • spider (Spider 对象) – 其结果被处理的spider

    注意事项:
    • 当Spider处理response返回result时,该方法被调用。
    • process_spider_output() 必须返回包含 Request 或 Item 对象的可迭代对象(iterable)

  • def process_spider_exception(self, response, exception, spider):

    参数介绍:
    • response (Response 对象) – 异常被抛出时被处理的response
    • exception (Exception 对象) – 被跑出的异常
    • spider (Spider 对象) – 抛出该异常的spider

    注意事项:
    • 当spider或(其他spider中间件的) process_spider_input() 跑出异常时, 该方法被调用。
    • process_spider_exception() 必须要么返回 None , 要么返回一个包含 Response 或 Item 对象的可迭代对象(iterable)。
      • 如果其返回 None ,Scrapy将继续处理该异常,调用中间件链中的其他中间件的 process_spider_exception() 方法,直到所有中间件都被调用,该异常到达引擎(异常将被记录并被忽略)。
      • 如果其返回一个可迭代对象,则中间件链的 process_spider_output() 方法被调用, 其他的 process_spider_exception() 将不会被调用。



  • def process_start_requests(self, start_requests, spider):

    参数介绍:
    • start_requests (包含 Request 的可迭代对象) – start requests
    • spider (Spider 对象) – start requests所属的spider

    注意事项:
    • 该方法以spider 启动的request为参数被调用,执行的过程类似于 process_spider_output() ,只不过其没有相关联的response并且必须返回request(不是item)。
    • 其接受一个可迭代的对象(start_requests 参数)且必须返回另一个包含 Request 对象的可迭代对象。
    • 当在您的spider中间件实现该方法时, 您必须返回一个可迭代对象(类似于参数start_requests)且不要遍历所有的 start_requests。 该迭代器会很大(甚至是无限),进而导致内存溢出。 Scrapy引擎在其具有能力处理start request时将会拉起request, 因此start request迭代器会变得无限,而由其他参数来停止spider( 例如时间限制或者item/page记数)。



总结下爬虫中间件在什么时候会被触发,或者调用。
  • 当运行到yield scrapy.Request()或者yield item的时候,爬虫中间件的process_spider_output()方法被调用。
  • 当爬虫本身的代码出现了Exception的时候,爬虫中间件的process_spider_exception()方法被调用。
  • 当爬虫里面的某一个回调函数parse_xxx()被调用之前,爬虫中间件的process_spider_input()方法被调用。
  • 当运行到start_requests()的时候,爬虫中间件的process_start_requests()方法被调用。


下面是一个示例Demo(假如,你的爬虫文件产生错误,比如Xpath到空数据,出现IndexError, 或者请求异常,status不是200):

游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

  • · scrapy|主题: 1, 订阅: 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 09:15:11 | 显示全部楼层
这个有用吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 22:17:02 | 显示全部楼层
点赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-12 17:28:32 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-12 17:29:03 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 17:24:52 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 02:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表