我正在使用python-scrapy执行爬网过程。在爬行到下一页(通常在400-500之间)的随机迭代次数之后,蜘蛛失败,引发ConnectionError: ('Connection aborted.', BadStatusLine("''",))
。
我尝试了几种解决方案,比如使用带有随机用户代理的标头,而不是其他一些帖子中推荐的引用或代理,但蜘蛛仍然失败。
引发的错误是:
018-06-08 16:05:34 [scrapy.core.scraper] ERROR: Spider error processing <GET https://www... > (referer: None)
Traceback (most recent call last):
...
ConnectionError: ('Connection aborted.', BadStatusLine("''",))
2018-06-08 16:05:34 [scrapy.core.engine] INFO: Closing spider (finished)
迭代代码部分如下所示:
if self.counter <= self.limit:
ua = UserAgent(cache=False)
User_agent = ua.random
headers = {
'User-Agent': User_agent,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4',
'Referer':response.request.headers.get('Referrer', None),
'Content-Type': 'application/x-www-form-urlencoded'
}
yield scrapy.Request(next_page, callback=self.parse, dont_filter=True, headers=headers)
知道为什么会这样吗?
解决方案可以用于避免错误,或者在引发错误并恢复爬行过程后以某种方式重新启动蜘蛛。
答案 0 :(得分:0)
BadStatusLine
被引发,因为主机正在检测蜘蛛作为机器人,并故意断开它。由于您已经指定了UserAgent
,因此您可以使用像PhantomJS
这样的无头浏览器来模拟浏览器。
还有一个中间件可以执行此操作:scrapy-webdriver