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!~

最新文章

  1. iOS学习笔记——触控与手势
  2. 屏蔽Enter触发的事件
  3. SQLSERVER数据库表各种同步技术
  4. MVC 3个重要的描述对象之ControllerDescriptor
  5. 《Programming WPF》翻译 第7章 2.图形
  6. systemd的作用
  7. JAVA调用数据库存储过程
  8. 一个小时学会Maven
  9. openstack,docker,mesos,k8s关系
  10. Windows7安装程序无法定位现有系统分区,也无法创建新的系统分区
  11. memcached命令知识
  12. linux下切换python2和python3(转)
  13. jquery 复制文本到剪切板插件(非 flash)
  14. EF---延迟加载技术
  15. web 前端遇到的问题
  16. hadoop学习笔记(一):概念和组成
  17. LintCode——尾部的零
  18. 8个非常实用的PHP安全函数,你知道几个?
  19. Linux命令-压缩解压命令:zip、unzip
  20. Flask之请求和响应

热门文章

  1. BZOJ2217 [Poi2011]Lollipop 【贪心】
  2. 前端学习 -- Css -- 兄弟元素选择器
  3. 洛谷大宁的邀请赛~元旦祭F: U17264 photo(线段树)
  4. 团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)
  5. 利用RAP搭建可视化接口管理平台
  6. OpenStack 认证服务 KeyStone部署(三)
  7. Hadoop生态圈-phoenix(HBase)的索引配置
  8. C# list.ForEach用法
  9. HTTP协议(2)-------- 网络编程
  10. python3.6.4的importlib模块重载用法