避免挂起connect .getresponse() (httplib. js).HTTPConnection)



我用python写了一个爬虫,根据一些给定的url从一个网站下载一些网页。我注意到我的程序偶尔会挂在"connect .getresponse()"这一行。没有抛出异常,程序只是永远在那里等待。

conn = httplib.HTTPConnection(component.netloc)
conn.request("GET", component.path + "?" + component.query)
resp = conn.getresponse() #hang here

我读了api文档,它说(添加超时):

conn = httplib.HTTPConnection(component.netloc, timeout=10)

但是,它不允许我"重试"连接。超时后重试爬行的最佳实践是什么?

例如,我正在考虑以下解决方案:

trials = 3
while trials > 0:
    try:
        ... code here ...
    except:
        trials -= 1

我走对方向了吗?

但是,它不允许我"重试"连接。

是的,超时被设计为将此策略推回到它所属的位置,在您的代码中(并且不在httplib中)。

超时后重试爬行的最佳实践是什么?

它非常依赖于应用程序。多久你的履带站推迟其他工作吗?你有多想让它深入到每个站点?您是否需要能够忍受缓慢、超额订阅的服务器?当服务器遇到爬虫程序时,有油门或其他对策的服务器怎么办?当我问,你尊重robots.txt吗?

由于这些问题的答案可能差异很大,因此您有必要根据爬虫的需求、您倾向于爬行的站点(假设存在趋势)和您的WAN性能对其进行调整。

您可以在没有获得数据的情况下添加超时。有趣的是,您需要将其添加到HTTPConnection而不是请求中,如下所示:

conn = httplib.HTTPConnection(component.netloc, timeout=10)
conn.request("GET", component.path + "?" + component.query)
resp = conn.getresponse() #now this will timeout if the other side hangs!

我没有尝试过,但似乎超时也可以像这个问题一样设置/更改

或者,如果您想在响应花费太长时间时超时,即使您正在从连接接收一些数据,您可以使用eventlets,如本例

相关内容

  • 没有找到相关文章