避免在 conn.getresponse()(httplib.HTTPConnection)上挂起
我用Python写了一个爬虫程序,用来根据一些给定的网址下载网页。我发现有时候我的程序会在这一行“conn.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
我这样做方向对吗?
2 个回答
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!
我还没试过,但看起来超时时间也可以像在这个问题中那样设置或更改。
另外,如果你想在响应时间过长的情况下设置超时,即使你已经从连接中接收到一些数据,也可以使用eventlets,就像这个例子中展示的那样。
0
不过,它不让我“重试”连接。
是的,超时的设置是为了把这个问题留给你的代码去处理,而不是放在httplib
里。
在超时后,重试爬虫的最佳做法是什么?
这其实很依赖于具体的应用场景。你的爬虫能忍受多长时间不去做其他工作?你有多想深入每个网站进行爬取?你需要能应对那些慢得要命、用户过多的服务器吗?还有那些在遇到爬虫时会采取限制措施的服务器呢?顺便问一下,你有没有遵守robots.txt
的规定?
因为这些问题的答案可能差别很大,所以你最好根据你爬虫的需求、你常爬取的网站(如果有规律的话)以及你的网络性能来调整这些设置。