aiohttp:设置每秒最大请求数

新手上路,请多包涵

如何使用 aiohttp 在客户端设置每秒最大请求数(限制它们)?

原文由 v18o 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

我在这里找到了一种可能的解决方案:http: //compiletoi.net/fast-scraping-in-python-with-asyncio.html

同时执行 3 个请求很酷,但是执行 5000 个请求就不太好了。如果您尝试同时执行太多请求,连接可能会开始关闭,或者您甚至可能会被禁止访问该网站。

为避免这种情况,您可以使用信号量。它是一种同步工具,可用于限制在某个时刻执行某项操作的协程数量。我们将在创建循环之前创建信号量,将我们希望允许的同时请求数作为参数传递:

 sem = asyncio.Semaphore(5)

然后,我们只需替换:

 page = yield from get(url, compress=True)

通过同样的事情,但受信号量保护:

 with (yield from sem):
    page = yield from get(url, compress=True)

这将确保最多可以同时完成 5 个请求。

原文由 v18o 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然它并不是对 每秒 请求数的精确限制,但请注意,自 v2.0 以来,当使用 ClientSessionaiohttp 时,自动将并发连接数限制为 100。

您可以通过创建自己的 TCPConnector 并将其传递到 ClientSession 来修改限制。例如,要创建一个限制为 50 个并发请求的客户端:

 import aiohttp

connector = aiohttp.TCPConnector(limit=50)
client = aiohttp.ClientSession(connector=connector)

如果它更适合您的用例,还有一个 limit_per_host 参数(默认情况下关闭),您可以传递该参数以限制同时连接到同一“端点”的数量。根据文档:

limit_per_host ( int ) – 限制同时连接到同一端点。如果端点具有相等的 (host, port, is_ssl) 三重,则端点相同。

用法示例:

 import aiohttp

connector = aiohttp.TCPConnector(limit_per_host=50)
client = aiohttp.ClientSession(connector=connector)

原文由 Mark Amery 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题