Python3 urllib3 爬虫 - 无法将最大连接限制为单个域



我使用python3urllib3来构建一个下载多个url的爬网程序。

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

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

我一次又一次地尝试提交同一个url,我在日志中看到它创建了很多到同一个域的连接。我已经尝试限制池的数量(num_pools=1),但它仍然会创建到同一url的多个连接。在文档中,我了解到,如果正在使用到同一域的其他连接,PoolManager将创建一个新连接。

我想限制连接到单个域的数量。正常浏览器最多使用2个不同的连接,因此是安全的。我该怎么做?

PoolManager(num_pools=20)将池限制为20个缓存的ConnectionPools实例,每个实例通常代表一个域。因此,您实际上限制为20个缓存的域池,每个域的连接要深一级。

我们可以使用maxsize=20指定每个ConnectionPool的限制。由于您使用池来限制爬网程序,因此您还需要使用block=True,这将防止创建超出限制的额外连接。使用block=False(默认值),将根据需要创建更多连接,但超过最大大小的连接将不会保存以供重复使用。

总之,你可能想要:

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

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

  • PoolManager(剩余部分传递给ConnectionPool)
  • ConnectionPool

相关内容

  • 没有找到相关文章

最新更新