我在python中编写了一个爬虫,根据一些给定的网址从网站下载一些网页。我注意到我的程序偶尔挂在这行“conn.getresponse()”。没有例外被抛出,程序只是在那里等待。
conn = httplib.HTTPConnection(component.netloc)
conn.request("GET", component.path + "?" + component.query)
resp = conn.getresponse() #hang here
我读了api doc并且说(添加超时):
conn = httplib.HTTPConnection(component.netloc, timeout=10)
但是,它不允许我“重试”连接。超时后重试抓取的最佳做法是什么?
例如,我正在考虑以下解决方案:
trials = 3
while trials > 0:
try:
... code here ...
except:
trials -= 1
我是朝着正确的方向吗?
答案 0 :(得分:1)
但是,它不允许我“重试”连接。
是的,超时旨在将此政策推回到它所属的位置,在您的代码中(以及httplib
之外)。
超时后重试抓取的最佳做法是什么?
它非常依赖于应用程序。您的爬虫可以延迟多久推迟其他工作?您希望它能够深入到每个站点中吗?您是否需要能够忍受缓慢的超额订购服务器?那些遇到爬行器时有节流或其他对策的服务器呢?在我问的时候,你是否尊重robots.txt
?
由于这些问题的答案可能差异很大,因此根据您的抓取工具的需求,您倾向于抓取的网站(假设有趋势)以及您的WAN性能进行调整是有意义的。
答案 1 :(得分:0)
您可以为没有数据的情况添加超时。有趣的是,您需要将其添加到 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!
我还没有尝试过,但是似乎也可以像在this question中一样设置/更改超时时间
或者,如果即使从连接中接收到一些数据,如果响应时间太长,如果您想超时,则可以使用事件as in this example