Scrapy中如何有效捕获并处理各类异常情况?

2026-05-16 23:281阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计532个文字,预计阅读时间需要3分钟。

Scrapy中如何有效捕获并处理各类异常情况?

前言:使用scrapy进行大规模爬取任务的时候(爬取耗时以天为单位),不论主机网络速度多好,爬完之后总会发现scrapy日志中item_scraped_count不等于预先的种子数量,总有一部分种子爬取失败。

前言

使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy日志中“item_scraped_count”不等于预先的种子数量,总有一部分种子爬取失败,失败的类型可能有如下图两种(下图为scrapy爬取结束完成时的日志):

scrapy中常见的异常包括但不限于:download error(蓝色区域), www.TTTTT.com/hypernym/?q='] custom_settings = { 'DOWNLOADER_MIDDLEWARES': { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'TESTSpider.middlewares.ProcessAllExceptionMiddleware': 120, }, 'DOWNLOAD_DELAY': 1, # 延时最低为2s 'AUTOTHROTTLE_ENABLED': True, # 启动[自动限速] 'AUTOTHROTTLE_DEBUG': True, # 开启[自动限速]的debug 'AUTOTHROTTLE_MAX_DELAY': 10, # 设置最大下载延时 'DOWNLOAD_TIMEOUT': 15, 'CONCURRENT_REQUESTS_PER_DOMAIN': 4 # 限制对该网站的并发请求数 } def parse(self, response): if not response.url: #接收到url==''时 print('500') yield TESTItem(key=response.meta['key'], _str=500, alias='') elif 'exception' in response.url: print('exception') yield TESTItem(key=response.meta['key'], _str='EXCEPTION', alias='')

Note:该中间件的Order_code不能过大,如果过大就会越接近下载器,就会优先于RetryMiddleware处理response,但这个中间件是用来兜底的,即当一个response 500进入中间件链时,需要先经过retry中间件处理,不能先由我们写的中间件来处理,它不具有retry的功能,接收到500的response就直接放弃掉该request直接return了,这是不合理的。只有经过retry后仍然有异常的request才应当由我们写的中间件来处理,这时候你想怎么处理都可以,比如再次retry、return一个重新构造的response。

下面来验证一下效果如何(测试一个无效的URL),下图为未启用中间件的情况:

Scrapy中如何有效捕获并处理各类异常情况?

再启用中间件查看效果:

ok,达到预期效果:即使程序运行时抛出异常也能被捕获并处理。

到此这篇关于如何在scrapy中捕获并处理各种异常的文章就介绍到这了,更多相关scrapy 捕获处理异常内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

本文共计532个文字,预计阅读时间需要3分钟。

Scrapy中如何有效捕获并处理各类异常情况?

前言:使用scrapy进行大规模爬取任务的时候(爬取耗时以天为单位),不论主机网络速度多好,爬完之后总会发现scrapy日志中item_scraped_count不等于预先的种子数量,总有一部分种子爬取失败。

前言

使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy日志中“item_scraped_count”不等于预先的种子数量,总有一部分种子爬取失败,失败的类型可能有如下图两种(下图为scrapy爬取结束完成时的日志):

scrapy中常见的异常包括但不限于:download error(蓝色区域), www.TTTTT.com/hypernym/?q='] custom_settings = { 'DOWNLOADER_MIDDLEWARES': { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'TESTSpider.middlewares.ProcessAllExceptionMiddleware': 120, }, 'DOWNLOAD_DELAY': 1, # 延时最低为2s 'AUTOTHROTTLE_ENABLED': True, # 启动[自动限速] 'AUTOTHROTTLE_DEBUG': True, # 开启[自动限速]的debug 'AUTOTHROTTLE_MAX_DELAY': 10, # 设置最大下载延时 'DOWNLOAD_TIMEOUT': 15, 'CONCURRENT_REQUESTS_PER_DOMAIN': 4 # 限制对该网站的并发请求数 } def parse(self, response): if not response.url: #接收到url==''时 print('500') yield TESTItem(key=response.meta['key'], _str=500, alias='') elif 'exception' in response.url: print('exception') yield TESTItem(key=response.meta['key'], _str='EXCEPTION', alias='')

Note:该中间件的Order_code不能过大,如果过大就会越接近下载器,就会优先于RetryMiddleware处理response,但这个中间件是用来兜底的,即当一个response 500进入中间件链时,需要先经过retry中间件处理,不能先由我们写的中间件来处理,它不具有retry的功能,接收到500的response就直接放弃掉该request直接return了,这是不合理的。只有经过retry后仍然有异常的request才应当由我们写的中间件来处理,这时候你想怎么处理都可以,比如再次retry、return一个重新构造的response。

下面来验证一下效果如何(测试一个无效的URL),下图为未启用中间件的情况:

Scrapy中如何有效捕获并处理各类异常情况?

再启用中间件查看效果:

ok,达到预期效果:即使程序运行时抛出异常也能被捕获并处理。

到此这篇关于如何在scrapy中捕获并处理各种异常的文章就介绍到这了,更多相关scrapy 捕获处理异常内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!