我是靠谱客的博主 轻松往事,最近开发中收集的这篇文章主要介绍scrapy重试机制_Scrapy项目之User timeout caused connection failure(异常记录),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0,html

提示:此文存在问题,真正测试, 请勿阅读,shell

07-14 14:26更新:cookie

通过两个多小时的测试,发现此问题的缘由是 昨天编写爬虫程序后,给爬虫程序添加了下面的属性:网络

download_timeout = 20dom

此属性的解释:scrapy

The amount of time (in secs) that the downloader will wait before timing out.函数

在获取某网站的子域名的robots.txt文件时,须要的时间远远超过20秒,所以,即使有三次重试的机会,也会最终失败。测试

此值默认为180,由于某网站是国内网站,所以,孤觉得它的文件所有都会下载的很快,不须要180这么大,因而更改成20,谁知道,其下子域名的robots.txt却须要这么久:网站

测试期间更改成30时,情况好了,目前已取消设置此值,已能抓取到须要的数据。spa

但是,为何robots.txt会下载这么慢呢?

删除Request中定义的errback进行测试,也能够获取到须要的数据。

那么,在Request中定义errback有什么用呢?

如今,再次在项目内、项目外执行下面的命令都不会发生DNSLookupError了(测试过)(但是,上午怎么就发生了呢?):

scrapy shell "http://money.163.com/18/0714/03/DML7R3EO002580S6.html"

--------能够忽略后面部分--------

昨日写了一个爬虫程序,用来抓取新闻数据,但在抓取某网站数据时发生了错误:超时、重试……开始是超过默认等待180秒的时间,后来本身在爬虫程序中改成了20秒,因此下图显示为20 seconds。

彻底不知道怎么回事!上面是使用Scrapy项目内的基于CrawlerRunner编写的程序运行的,看不到更多数据!

尝试将爬虫中的allowed_domains改成下面两种形式(最后会使用第二种)进行测试——觉得和子域名有关系:仍然失败。

1 #allowed_domains = ['www.163.com', 'money.163.com', 'mobile.163.com',

2 #'news.163.com', 'tech.163.com']

3

4 allowed_domains = ['163.com']

后来又在settings.py中关闭了robots.txt协议、开启了Cookies支持:仍然失败。

1 #Obey robots.txt rules

2 ROBOTSTXT_OBEY =False3

4 #Disable cookies (enabled by default)

5 COOKIES_ENABLED = True

此时,依靠着以前的知识储备是没法解决问题的了!

使用scrapy shell对获取超时的网页进行测试,结果获得了twisted.internet.error.DNSLookupError的异常信息:

scrapy shell "http://money.163.com/18/0714/03/DML7R3EO002580S6.html"

可是,使用ping命令却能够获得上面失败的子域名的IP地址:

twisted做为一个很经常使用的Python库,怎么会发生这样的问题呢!彻底不该该的!

求助网络吧!最终找到下面的文章:

最佳答案!中文什么意思:在Request实例中定义errback!(请读三遍)

这么简单?和处理DNSLookupError错误有什么关系呢?为什么定义了回调函数就能够了呢?

没想明白,不行动……

继续搜索,没有更多了……

好吧,试试这个方法,更改某网站的爬虫程序以下:

增长了errback = self.errback_163,其中,回调函数errback_163的写法和上面的参考文章中的一致(后来发现其来自Scrapy官文Requests and Responses中)。

1 yield response.follow(item, callback =self.parse_a_new,2 errback = self.errback_163)

准备就绪,使用scapy crawl测试最新程序(在将以前修改的配置还原后——遵照robots.txt协议、禁止Cookies、allowed_domains设置为163.com):成功抓取了想要的数据!

好了,问题解决了。但是,以前的疑问仍是没有解决~后续再dig吧!~“神奇的”errback!~

最后

以上就是轻松往事为你收集整理的scrapy重试机制_Scrapy项目之User timeout caused connection failure(异常记录)的全部内容,希望文章能够帮你解决scrapy重试机制_Scrapy项目之User timeout caused connection failure(异常记录)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部