Scrapy项目之twisted.internet.error.DNSLookupError

时间:2018-07-14 11:57:31   收藏:0   阅读:4664

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

 

昨日写了一个爬虫程序,用来抓取新闻数据,但在抓取某网站数据时发生了错误:超时、重试……开始是超过默认等待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 = False
3 
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库,怎么会发生这样的问题呢!完全不应该的!

 

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

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中)。

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

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!