Python3 urllib3 crawler - 不能限制到单个域的最大连接数

时间:2016-07-16 11:20:55

标签: python urllib urllib3

我正在使用python3 urllib3来构建一个爬虫来下载多个网址。

在我的主要活动中,我使用我的Downloader类的相同(一个)实例创建20个线程,该类使用PoolManager的一个实例:

def __init__(self):
    self.manager = PoolManager(num_pools=20)

我尝试过一遍又一遍地提交相同的网址,我在日志中看到它创建了很多与同一域名的连接。我试图限制池的数量(num_pools=1),它仍然创建到同一个URL的多个连接。在我理解的文档中,PoolManager如果正在使用到同一域的其他连接,则会创建新连接。

我想限制与单个域的连接数。使用最多2个不同的连接是普通浏览器使用的,因此它是安全的。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

PoolManager(num_pools=20)会将池限制为20个ConnectionPools缓存实例,每个实例通常代表一个域。因此,您有效地限制了20个缓存域池,每个域的连接更深一层。

我们可以使用maxsize=20指定每个ConnectionPool的限制。由于您正在使用池来限制您的抓取工具,因此您还希望使用block=True,这将阻止创建超出限制的其他连接。使用block=False(默认值),将根据需要创建更多连接,但超出maxsize的连接将不会保存以供重复使用。

总而言之,您可能想要:

def __init__(self):
    self.manager = PoolManager(maxsize=20, block=True)

关于哪些参数可用的更多文档: