Python 3.x Python3,Urllib3:对单个站点的快速服务器友好请求,大约100000个请求?
我试图通过web API获取整个旧Bailey在线存档的子集 我的问题是,我的实现不仅速度慢,而且服务器相当迅速地停止为我的请求提供服务(大约10分钟) 目前,我将urllib3的开发版本用作:Python 3.x Python3,Urllib3:对单个站点的快速服务器友好请求,大约100000个请求?,python-3.x,urllib3,Python 3.x,Urllib3,我试图通过web API获取整个旧Bailey在线存档的子集 我的问题是,我的实现不仅速度慢,而且服务器相当迅速地停止为我的请求提供服务(大约10分钟) 目前,我将urllib3的开发版本用作: import urllib3 retry = urllib3.util.Retry(total=1000, read=200, connect=200, backoff_factor=0.5) timeout = urllib3.util.Timeout(connect=2.0, read=4.0) h
import urllib3
retry = urllib3.util.Retry(total=1000, read=200, connect=200, backoff_factor=0.5)
timeout = urllib3.util.Timeout(connect=2.0, read=4.0)
http=urllib3.PoolManager(retry=retry, timeout=timeout, maxsize=10)
然后我用这个http池运行所有请求。我选择的数字相当荒谬,但最好的是8(
每年,我需要在243年内针对不同的场景提出70个并发请求。
我曾在一年内同时使用@shazow的workerpool(根据修改为与python3.4一起使用),多线程年,但效果也不太好。主要原因是服务器超时和我的无知
DNS查找是否有明显的延迟?我不能使用Ip,因为域是apache虚拟主机(或者我可以吗?)
Soo.真正的问题是:我如何才能从同一台服务器上“很好地”及时地下载数十万次?我仍然认为这需要一天左右的时间8)听起来服务器可能会因为太频繁地发出太多请求而限制/禁止您的IP 首先,我建议检查域上的robots.txt,看看是否有关于自动请求频率的指导。如果没有,你可以要求网站所有者建议如何最好地抓取网站。否则,您可能需要通过实验确定速率限制 要限制您的请求,您可以使用类似.RateLimiter*()的内容。它看起来像这样:
from apiclient import RateLimiter
from urllib3 import PoolManager
lock = RateLimiter(max_messages=30, every_seconds=60)
http = PoolManager(...)
...
for url in crawl_list:
lock.acquire()
r = http.request(...)
你可以做的另一件事是抓取网站的缓存版本,如果可以通过Google或archive.org获得的话
[*]免责声明:我很久以前也写过apiclient。它没有很好的记录。我怀疑如果您发现缺少其他类似的模块,您可以使用这些模块,但是源代码应该很容易理解和扩展。No robots.txt,也不在父站点上。让apiclient更好地与python3.4一起工作主要是urllib->urllib.parse。应该很容易。。。只有轻微的成功改变了周围的数字。