我用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,如本例