crawl 连接网页超时,HTTP 599

unbuntu , pyspider

抓的是某宝的商品详情页,出现问题,始终连接不上。 上一级,商品的列表页,没有问题,也是使用了js的。

错误提示信息:[E 160630 14:21:42 base_handler:195] HTTP 599: Operation timed out after 120001 milliseconds with 0 bytes receive -- 加了 fetch_type='js'时

[E 160630 14:45:33 base_handler:195] HTTP 599: Failed to connect to item.taobao.com port 443: Connection timed out -- 没有fetch_type='js'时

都算是没连上网站,而用urllib2的urlopen是可以读到网页信息的。

有一条比较可疑的提示,但是我不会解释。。
图片描述

在其他电商网站有成功过了,逻辑都差不多。但这边就是不行。
因为不懂的点有些多,问题都有点找不到,如果您有思路的话,可否指点一下 :)

阅读 11.8k
2 个回答

我也碰到过一样的问题,先抛出解决方法;

解决:

        self.crawl('xxxxx',
                   callback=self.list_page,
                   fetch_type = 'js',
                   connect_timeout = 50,
                   timeout = 200
                   )

原因

  1. 最可能的是网速问题(在公司爬取出现问题,在家里没出现 —— 100M 光纤);

  2. 爬取的网页中图片等较多,加载速度偏慢;

  3. pyspider 默认的连接时间为 20, 抓取时间为 120。
    配置参数,增大时间限制

根据现象中的
“after 120001 milliseconds with 0 bytes receive”
和我遇到的
“after 120000 milliseconds with 1723300 out of 2343850 bytes received 120.00s”
是一个意思,同一种错误类型
-》意思是:超时了(超过设置的最大超时时间了),但是只下载了总共数据的其中一部分
->重点是后半句,意思是可以下载到数据的,只是直到超时都还没下载完全
-》这种情况的最大可能原因就是:网速太慢
-》所以

解决办法

根本办法:换个更快的网络

比如,我公司是1MB/s的网络,家里是10MB/s的网络,换到家里下载,就不会出现这个问题了。

临时的规避的缓解的办法:增大延迟timeout ( +增大其他容错参数connect_timeout, retries

  • 给单个self.crawl增大参数:
self.crawl(urlToDownload,
    callback=self.downloadFileCallback,
    connect_timeout=100,
    timeout=600,
    retries=15,
    save=fileInfo)

或者

  • 增大全局参数:
class Handler(BaseHandler):
    crawl_config = {
        "connect_timeout": 100,
        "timeout": 600,
        "retries": 15,
    }

备注

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏