我正在使用gevent下载一些html页面.
有些网站太慢,有些网站在一段时间后停止提供请求.这就是我必须限制一组请求的总时间的原因.为此,我使用gevent“超时”.
timeout = Timeout(10)
timeout.start()
def downloadSite():
# code to download site's url one by one
url1 = downloadUrl()
url2 = downloadUrl()
url3 = downloadUrl()
try:
gevent.spawn(downloadSite).join()
except Timeout:
print 'Lost state here'
但问题是当异常启动时我松开所有状态.
想象一下,我爬网站’www.test.com’.在网站管理员决定切换网络服务器进行维护之前,我已经设法下载了10个网址.在这种情况下,当异常触发时,我将丢失有关已爬网页面的信息.
问题是 – 即使Timeout发生,我如何保存状态和处理数据?
解决方法:
为什么不尝试类似的东西:
timeout = Timeout(10)
def downloadSite(url):
with Timeout(10):
downloadUrl(url)
urls = ["url1", "url2", "url3"]
workers = []
limit = 5
counter = 0
for i in urls:
# limit to 5 URL requests at a time
if counter < limit:
workers.append(gevent.spawn(downloadSite, i))
counter += 1
else:
gevent.joinall(workers)
workers = [i,]
counter = 0
gevent.joinall(workers)
您还可以在每个URL的dict或其他内容中保存状态,或者在不同的数组中附加失败的状态,以便稍后重试.