在这种情况下,由于服务器似乎是一个限制因素,并发性并没有多大帮助。一种解决方案是发送带有超时间隔的请求,如果超过了该间隔,则在几秒钟后重试该请求。然后逐渐增加重试间隔时间,直到获得所需的数据。例如,您的代码可能如下所示:import time
import requests
def get_content(url, timeout):
# raise Timeout exception if more than x sends have passed
resp = requests.get(url, timeout=timeout)
# raise generic exception if request is unsuccessful
if resp.status_code != 200:
raise LookupError('status is not 200')
return resp.content
timeout = 5 # seconds
retry_interval = 0
max_retry_interval = 120
while True:
try:
response = get_content('https://example.com', timeout=timeout)
retry_interval = 0 # reset retry interval after success
break
except (LookupError, requests.exceptions.Timeout):
retry_interval += 10
if retry_interval > max_retry_interval:
retry_interval = max_retry_interval
time.sleep(retry_interval)
# process response
如果需要并发,可以考虑Scrapy项目。它使用了Twisted框架。在Scrapy中,您可以将time.sleep替换为reactor.callLater(fn, *args, **kw),或者使用数百个中间件插件中的一个。在