避免挂在conn.getresponse()上(httplib.HTTPConnection)

时间:2011-12-20 06:11:09

标签: python http timeout

我在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

我是朝着正确的方向吗?

2 个答案:

答案 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