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

Chu*_*ieh 5 python timeout http

我用 python 编写了一个爬虫,根据一些给定的网址从网站下载一些网页。我注意到我的程序有时会挂在“conn.getresponse()”这一行。没有抛出任何异常,程序只是永远在那里等待。

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

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

conn = httplib.HTTPConnection(component.netloc, timeout=10)
Run Code Online (Sandbox Code Playgroud)

但是,它不允许我“重试”连接。超时后重试爬网的最佳做法是什么?

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

trials = 3
while trials > 0:
    try:
        ... code here ...
    except:
        trials -= 1
Run Code Online (Sandbox Code Playgroud)

我的方向正确吗?

Bri*_*ain 0

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

是的,超时旨在将此策略推回其所属位置,在您的代码中(以及在 之外httplib)。

超时后重试爬网的最佳做法是什么?

这非常依赖于应用程序。你的爬虫可以忍受推迟其他工作多久?您有多希望它深入到每个网站?您是否需要能够忍受缓慢且超额订阅的服务器?那么遇到爬虫时有节流或者其他对策的服务器呢?当我问的时候,你尊重吗robots.txt

由于这些问题的答案可能差异很大,因此您可以根据爬网程序的需求、您倾向于爬网的网站(假设有趋势)以及您的 WAN 性能进行调整。