2014-10-29 21 views
0

我想通过Web API获取整个Old Bailey Online归档的子集。Python3,Urllib3:快速服务器友好的请求,以100,000个请求的顺序到单个站点?

我的问题是我的实现不仅速度慢,而且服务器也立即停止服务我的请求(大约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(修改为工作python3.4根据https://stackoverflow.com/a/24046895/398969),同时在一年内,多线程年,这也没有工作太好,主要是由于服务器超时和我的无知

是否有明显的延迟引入的DNS查找?我不能使用IP作为域是一个Apache虚拟主机(或可以吗?)

Soo。真正的问题:我如何下载数十万次相同的服务器'很好',及时?我仍然期待它需要一天左右的时间8)

回答

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(...) 

你可以做的另一件事是抓取网站的缓存版本,如果一个可通过谷歌或archive.org。

[*] 声明:我也很早就写了一些适合的文章。它没有超好记录。我怀疑还有其他类似的模块,如果你发现它缺乏,你可以使用,但源应该是相当容易理解和扩展。

+0

没有robots.txt,也没有在父网站上。将有更好的去获得python3.4的工作主要是urllib - > urllib.parse的东西。应该很容易...只有轻微的成功改变周围的数字。 – SpmP 2014-10-30 10:28:49