Python3 urllib3 爬虫 - 无法限制单个域的最大连接数
Python3 urllib3 crawler - can't limit max connections to aa single domain
我正在使用 python3 urllib3 来构建一个爬虫来下载多个 urls。
在我的主 activity 上,我使用我的 Downloader
class 的 相同(一个)实例 创建了 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
指定每个连接池的限制。由于您正在使用池来限制爬虫,因此您还需要使用 block=True
来防止创建超出限制的额外连接。使用 block=False
(默认值),将根据需要创建更多连接,但不会保存超出最大大小的连接以供重复使用。
总而言之,您可能想要:
def __init__(self):
self.manager = PoolManager(maxsize=20, block=True)
关于可用参数的更多文档:
- PoolManager(余数传递给 ConnectionPool)
- ConnectionPool
我正在使用 python3 urllib3 来构建一个爬虫来下载多个 urls。
在我的主 activity 上,我使用我的 Downloader
class 的 相同(一个)实例 创建了 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
指定每个连接池的限制。由于您正在使用池来限制爬虫,因此您还需要使用 block=True
来防止创建超出限制的额外连接。使用 block=False
(默认值),将根据需要创建更多连接,但不会保存超出最大大小的连接以供重复使用。
总而言之,您可能想要:
def __init__(self):
self.manager = PoolManager(maxsize=20, block=True)
关于可用参数的更多文档:
- PoolManager(余数传递给 ConnectionPool)
- ConnectionPool