0

我正在尝试通过 Web API 获取整个 Old Bailey Online 档案的一个子集。

我的问题是我的实现不仅速度很慢,而且服务器很快(大约 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)
http=urllib3.PoolManager(retry=retry, timeout=timeout, maxsize=10)

然后我用这个 http 池运行我的所有请求。我选择的数字相当荒谬,但最好的数字是 8(

每年,我需要针对不同的场景发出 70 个并发请求,超过 243 年。我尝试使用@shazow 的workerpool(根据https://stackoverflow.com/a/24046895/398969修改为与python3.4 一起使用),同时在一年内,多线程年内,这也不是很好。主要是由于服务器超时和我的无知。

DNS 查找是否引入了明显的延迟?我不能使用 Ip,因为域是 apache 虚拟主机(或者我可以吗?)

苏。真正的问题:我怎样才能从同一台服务器“很好地”及时地下载数十万次?我仍然希望它需要一天左右 8)

4

1 回答 1

1

听起来服务器可能会因为过于频繁地发出过多请求而限制/禁止您的 IP。

首先,我建议检查域中的 robots.txt,看看是否有关于自动请求频率的指导。如果没有,您可以请网站所有者就如何最好地抓取该网站提供建议。否则,您可能需要通过实验确定速率限制。

要限制您的请求,您可以使用apiclient .RateLimiter* ( source ) 之类的东西。它看起来像这样:

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。它没有很好的记录。我怀疑如果您发现缺少其他类似的模块,您可以使用它,但源代码应该相当容易理解和扩展。

于 2014-10-29T17:33:13.867 回答