Scrapy项目之User timeout caused connection failure(异常记录)
Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0,
提示:此文存在问题,真正测试, 请勿阅读,
07-14 14:26更新:
经过两个多小时的测试,发现此问题的原因是 昨天编写爬虫程序后,给爬虫程序添加了下面的属性:
download_timeout = 20
此属性的解释:
The amount of time (in secs) that the downloader will wait before timing out.
在获取某网站的子域名的robots.txt文件时,需要的时间远远超过20秒,因此,即便有三次重试的机会,也会最终失败。
此值默认为180,因为某网站是国内网站,因此,孤以为它的文件全部都会下载的很快,不需要180这么大,于是更改为20,谁知道,其下子域名的robots.txt却需要这么久:
测试期间更改为30时,状况好了,目前已取消设置此值,已能抓取到需要的数据。
可是,为什么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改为下面两种形式(最后会使用第二种)进行测试——以为和子域名有关系:仍然失败。
#allowed_domains = ['www.163.com', 'money.163.com', 'mobile.163.com',
# 'news.163.com', 'tech.163.com'] allowed_domains = ['163.com']
后来又在settings.py中关闭了robots.txt协议、开启了Cookies支持:仍然失败。
# Obey robots.txt rules
ROBOTSTXT_OBEY = False # Disable cookies (enabled by default)
COOKIES_ENABLED = True
此时,依靠着之前的知识储备是无法解决问题的了!
使用scrapy shell对获取超时的网页进行测试,结果得到了twisted.internet.error.DNSLookupError的异常信息:
scrapy shell "http://money.163.com/18/0714/03/DML7R3EO002580S6.html"
但是,使用ping命令却可以得到上面失败的子域名的IP地址:
twisted作为一个很常用的Python库,怎么会发生这样的问题呢!完全不应该的!
求助网络吧!最终找到下面的文章:
How do I catch errors with scrapy so I can do something when I get User Timeout error?
最佳答案!中文什么意思:在Request实例中定义errback!(请读三遍)
这么简单?和处理DNSLookupError错误有什么关系呢?为何定义了回调函数就可以了呢?
没想明白,不行动……
继续搜索,没有更多了……
好吧,试试这个方法,更改某网站的爬虫程序如下:
增加了errback = self.errback_163,其中,回调函数errback_163的写法和上面的参考文章中的一致(后来发现其来自Scrapy官文Requests and Responses中)。
yield response.follow(item, callback = self.parse_a_new,
errback = self.errback_163)
准备就绪,使用scapy crawl测试最新程序(在将之前修改的配置还原后——遵守robots.txt协议、禁止Cookies、allowed_domains设置为163.com):成功抓取了想要的数据!
好了,问题解决了。可是,之前的疑问还是没有解决~后续再dig吧!~“神奇的”errback!~
最新文章
- iOS学习笔记——触控与手势
- 屏蔽Enter触发的事件
- SQLSERVER数据库表各种同步技术
- MVC 3个重要的描述对象之ControllerDescriptor
- 《Programming WPF》翻译 第7章 2.图形
- systemd的作用
- JAVA调用数据库存储过程
- 一个小时学会Maven
- openstack,docker,mesos,k8s关系
- Windows7安装程序无法定位现有系统分区,也无法创建新的系统分区
- memcached命令知识
- linux下切换python2和python3(转)
- jquery 复制文本到剪切板插件(非 flash)
- EF---延迟加载技术
- web 前端遇到的问题
- hadoop学习笔记(一):概念和组成
- LintCode——尾部的零
- 8个非常实用的PHP安全函数,你知道几个?
- Linux命令-压缩解压命令:zip、unzip
- Flask之请求和响应
热门文章
- BZOJ2217 [Poi2011]Lollipop 【贪心】
- 前端学习 -- Css -- 兄弟元素选择器
- 洛谷大宁的邀请赛~元旦祭F: U17264 photo(线段树)
- 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)
- 利用RAP搭建可视化接口管理平台
- OpenStack 认证服务 KeyStone部署(三)
- Hadoop生态圈-phoenix(HBase)的索引配置
- C# list.ForEach用法
- HTTP协议(2)-------- 网络编程
- python3.6.4的importlib模块重载用法