开始试用
返回

Python 异步请求:在不触发速率限制的前提下加速网络爬虫

用你偏好的 AI 总结本文
试用我们的高级代理

无限量测试我们的优质代理,畅享卓越质量。

  • 移动代理和住宅代理
  • ZIP 级别定位
  • 静态 IP 和轮换 IP
  • 内置质量过滤器
立即试用

Python 爬虫变慢的原因往往很简单:同步脚本要等到每个响应返回后,才会发起下一个请求。异步请求可以让多个网络请求同时进行,从而减少这种空闲等待时间。

速度也有上限。并发提升过快可能会压垮目标站点、触发 429 速率限制、产生连接错误,或返回不完整的页面。在 Apify 与 The Web Scraping Club 发布的《2026 年网络爬虫现状报告》, 65.8% 的受访爬虫从业者表示,他们在 2025 年使用的代理比前一年更多。这反映了一个常见的生产环境问题:扩展爬虫规模,也意味着要管理每个请求所使用的网络路由。对于公开页面, 轮换住宅代理 可以避免把所有请求都集中在同一个 IP 上。对于价格监测、本地商家信息等需要在整个运行过程中保持同一地区的工作流,粘性会话能让连接更加稳定。

本指南按照 一篇分步 aiohttp 教程:发送单个请求、并发运行多个请求、限制并发数、添加重试机制并保存结果。Requests、 asyncio.to_thread()、HTTPX 和 NodeMaven 抓取浏览器 会在后文作为针对不同工作流程的替代方案清晰标注。

扩展异步请求,减少失败请求

当 429 错误、不稳定的路由或单 IP 限制时,请添加干净的住宅代理,而不是一味提高并发数。使用 3.50 美元获取 750 MB 住宅和移动流量 来测试 NodeMaven,让每个请求都走更可靠的路由

立即试用

Python 异步请求:快速解答

  • 当您构建新的异步爬虫时,请按照 aiohttp 下方的教程 操作。
  • 保持 Python Requests 适用于简短的本地脚本或少量 URL。
  • 选择 asyncio.to_thread() 适用于您已有可用的 Requests 爬虫,并希望在不立即重写的情况下实现并发运行。
  • 选择 HTTPX 库 适用于您偏好类似 Requests 的 API 并需要原生异步支持的情况。
  • 当目标网站需要 JavaScript、滚动、点击、表单、截图或持久化浏览器状态时,请改用浏览器自动化。

先从较小的并发限制开始,验证返回的页面无误后再逐步提高。

为什么普通的 Python 请求会变慢

普通的 Requests 脚本是同步的。它发送一个请求,等待响应,然后才开始处理下一个 URL。

此示例 不属于异步教程的一部分。它展示了传统的 Requests 方式,即逐个下载 URL。

requests.get() 发送一个请求。 适用于 循环在上一个响应到达之前不会开始处理下一个 URL。 aiohttp 下面的教程通过同时保持多个请求处于进行中状态来改变这一行为。

选择合适的 Python 方案

Requests 库 适合一次性检查、小型本地脚本或简短的 URL 列表。

asyncio.to_thread() 在线程中运行现有的阻塞式 Requests 代码。它为旧的同步爬虫提供了一条无需完全重写即可实现并发的路径。Python 文档主要将其用于 I/O 密集型的阻塞函数,例如 HTTP 请求。

aiohttp 是本教程的主要库。它围绕 asyncio构建,可处理大量进行中的 HTTP 请求,并使用可复用的 ClientSession 实现连接池。 aiohttp 客户端快速入门 建议不要为每个请求都创建新的会话。

HTTPX 库 提供了另一种异步方案,其 API 与 Requests 相似。它的 异步文档 和 资源限制设置 涵盖了可复用客户端、连接数限制和保持连接(keep-alive)。

NodeMaven 抓取浏览器 用于基于浏览器的数据采集。它运行真实的云端浏览器,适用于需要 JavaScript 渲染、滚动、点击、表单、截图或保存浏览器会话的页面。一个 NodeMaven 账户最多可运行 50 个活跃浏览器会话 (默认设置)。

如需更全面地了解 Requests、解析、选择器和浏览器自动化,请阅读 NodeMaven 的 Python 网页抓取指南.

无需承担浏览器开销即可运行浏览器工作流

当异步请求无法渲染页面时,请开启 NodeMaven 代理试用,借助 Scraping Browser 最多可同时运行 50 个云端浏览器会话 ,配合 Scraping Browser 使用。 浏览器、配置文件和 CAPTCHA 求解器均不收取额外的浏览器费用:起步价 3.50 美元获取 750 MB 住宅和移动流量.

立即试用

分步教程:使用 aiohttp 构建异步网络爬虫

本教程使用 Books to Scrape,这是一个专为爬虫练习而创建的网站。示例先抓取一个页面,再抓取多个页面,然后加入并发限制和重试机制。

第 1 步:创建虚拟环境并安装 aiohttp

在您想要保存项目的文件夹中打开终端。

创建一个名为 async_scraper.py.

第 2 步:发送一个异步请求

先从单个页面开始。这样可以在引入并发之前,确认您的环境、连接和代码都能正常工作。

运行该文件:

终端应打印出页面 HTML 的开头部分。

ClientSession() 会维护一个连接池。复用同一个会话可以让爬虫重用连接,而不必为每个页面都新建连接。

第 3 步:使用 asyncio.gather() 抓取多个页面

将代码替换为可并发下载多个分类页面的版本。

asyncio.gather() 会同时启动所有请求任务,并等待它们全部完成。对于三个 URL 来说这没有问题,但面对大量 URL 列表时,就需要设置并发上限。

第 4 步:添加并发限制

信号量(semaphore)用于限制同时处于活动状态的请求数量。爬虫仍然可以处理大量 URL 列表,但同时保持打开的连接数只会是设定的数量。

在这里,爬虫有十个 URL,但每次只打开 五个请求。建议从 3、5 或 10 开始。只有在检查过响应质量和错误率之后,才逐步提高这个数字。

第 5 步:添加重试并将结果保存为 CSV

最终版本加入了超时设置、针对临时故障的指数退避重试,以及 CSV 输出文件。

再次运行:

该脚本会在同一文件夹中生成 scrape_results.csv 。在生产环境的爬虫中,请将 html_length 替换为您从每个响应中提取的字段,例如商品标题、价格、库存状态、列表 URL 或 JSON 数据。

扩大规模前先测试并发

不要把能达到的最高并发数当作正确的设置。一个可靠的爬虫追踪的是 成功且完整的响应,而不仅仅是已完成的请求。

用一小批 URL 样本在多个并发上限下进行测试:

并发需要记录的内容
1基准响应时间和响应质量
5成功率, 429 错误和超时
10重试或封锁是否上升
20+目标站点是否仍返回完整、有效的页面

记录 总运行时间、成功率、重试次数、 403 和 429 响应、超时以及不完整页面。当错误率上升或返回内容发生变化时,请停止提高并发数。

如果在找到安全的请求速率后,工作流仍需要更大的覆盖范围,请不要简单地把信号量调得更高。对于获得许可的公开数据采集, 轮换住宅代理 可以把相互独立的请求分散到多个干净 IP 上。对于特定地区的检查,或带有 Cookie 和分页的多页面流程,请使用 粘性住宅会话 ,这样爬虫在整个任务期间都能保持同一个稳定的位置。

一则关于 大批量 HTTPX 请求 的 GitHub 讨论表明,如果没有仔细配置客户端限制和连接池,数千个并发请求可能会引发连接问题。

扩展异步请求,减少失败请求

当 429 错误、不稳定的路由或单 IP 限制时,请添加干净的住宅代理,而不是一味提高并发数。使用 3.50 美元获取 750 MB 住宅和移动流量 来测试 NodeMaven,让每个请求都走更可靠的路由

立即试用

现有 Requests 脚本的替代方案:asyncio.to_thread()

您不必在第一天就重写一个能正常工作的 Requests 爬虫。 asyncio.to_thread() 可以并发运行阻塞式的 Requests 函数。

这是一种 过渡方案,而不是大规模场景下异步 HTTP 客户端的替代品。已经依赖 Requests 的爬虫可以先获得并发能力,之后在需要更精细地控制连接和请求行为时,再迁移到 aiohttp 或 HTTPX。

HTTPX AsyncClient:类似 Requests 的替代方案

HTTPX 与 Requests 类似,但原生支持异步请求。如果您的团队已经熟悉 Requests API,它是一个自然的选择。

整个批次保持共用一个 AsyncClient 。如果在每个请求内部都新建一个客户端,连接池的优势就会丧失。在一次 HTTPX 社区基准测试讨论中,复用客户端使该贡献者测试中的性能接近 aiohttp。请将其视为开发者示例,而非通用基准。

为异步 Python 请求添加代理

在小规模下,普通连接可能已经足够。但从云服务器或单一 IP 反复发送请求,可能会遇到 速率限制、位置不匹配或 IP 信誉检查.

对于彼此独立的公开页面, 轮换住宅代理 可以将请求分散到干净的消费者 IP 上。 住宅代理 配合粘性会话,适合在一次采集运行中需要保持一致的位置、Cookie 或地区的任务。

ISP 代理 适合需要长期保留同一个稳定 IP 的周期性监控。例如,一个每 15 分钟检查固定商品集合的价格跟踪器,不应在活动工作流中随机更换其网络身份。

HTTPX 可以通过代理发送请求:

对于异步代码,将相同的 代理 值传递给 httpx.AsyncClient。NodeMaven 的 适用于 Python 的代理 页面介绍了常见的 Python 路由模式,而 代理身份验证指南 则说明了凭据和身份验证方法。

只在获得访问许可的地方采集数据。代理并不授予您访问私密数据、绕过付费墙或无视网站规则的权限。

什么时候异步请求并不合适

当目标以 HTML 或 JSON 返回数据时,异步 HTTP 请求可以正常工作。但它们无法像浏览器那样与页面交互。

当工作流需要以下功能时,请改用浏览器自动化:

  • JavaScript 渲染的内容
  • 滚动、点击或表单提交
  • 截图或视觉检查
  • 登录状态和已保存的 Cookie
  • 在多次运行之间持久保留的浏览器配置文件

NodeMaven 抓取浏览器 提供搭载 NodeMaven 代理的云端浏览器,具备托管浏览器设置、持久化配置文件、CAPTCHA 支持、Live Browser 实时调试和会话录制功能。它为 不收取单独的浏览器使用费 符合条件的 NodeMaven 客户提供。您只需为会话期间传输的轮换代理流量付费。

对于以代码为先的浏览器工作流,请阅读 Playwright 爬虫指南。对于不需要渲染和视觉交互的页面,异步 HTTP 请求运行起来更加轻量。

Python 异步爬虫的常见错误

为每个请求创建新会话: 为整个批次创建一个 aiohttp.ClientSession 或 httpx.AsyncClient 即可。这样可以保留连接池,避免反复打开新连接。

一次性启动所有任务: asyncio.gather() 没有内置的速率限制。在运行大型 URL 列表之前,请先添加信号量。如果在降速之后,合规的工作流仍然需要更多独立的公开请求, 轮换住宅代理 可以将请求分散到多个干净的消费者 IP 上,而不是集中在同一条线路上。

对每个错误都重试: 仅对超时、连接问题、 429 响应以及临时性的 5xx 错误时应采用退避重试。不要在不更改请求的情况下反复重试 400, 401, 403,或 404 响应。一个 403 可能意味着权限问题、路由被封锁或反机器人控制。NodeMaven 的 403 Forbidden 指南 介绍了如何诊断这些情况。

忽略响应正文: A 200 OK 响应仍可能包含 CAPTCHA 页面、登录页面、拒绝访问提示、空结果或 错误的地区内容。在保存结果之前,请先验证预期的标题、JSON 字段或页面标记。干净的 住宅代理 还能减少在合规公开数据工作流中出现的 CAPTCHA 和验证提示,因为流量来自消费者网络的 IP 段,而不是明显的托管基础设施。当数据集需要特定位置时,住宅代理可以提供国家、地区、城市和 ZIP 级别的路由。

在有状态工作流中更换代理位置: 轮换适合彼此独立的请求。当爬虫依赖 Cookie、位置、分页或账户状态时,请保持一个稳定的会话。粘性 住宅代理 非常适合有明确范围的采集任务,而 ISP 代理 则适合从同一个静态 IP 进行的周期性监控。

把浏览器问题当作 HTTP 问题处理: 如果目标需要 JavaScript、滚动、点击或表单提交,提高异步并发数并不能让缺失的内容显现出来。 NodeMaven 抓取浏览器 运行真实的云端浏览器会话,配备托管代理、持久化配置文件、CAPTCHA 支持和 Live Browser 调试,让您可以检查渲染后的工作流,而不是仅凭 HTTP 响应猜测。

扩展异步请求,减少失败请求

当 429 错误、不稳定的路由或单 IP 限制时,请添加干净的住宅代理,而不是一味提高并发数。使用 3.50 美元获取 750 MB 住宅和移动流量 来测试 NodeMaven,让每个请求都走更可靠的路由

立即试用

结论

分层构建异步爬虫。先从 一个异步请求开始,然后再添加并发任务、信号量、超时、重试和响应验证。

关键检查点在于返回的页面是否 完整且正确。一个速度很快却收集到拦截页面、错误地区结果或缺失记录的爬虫,只会带来更多清理工作。

对于 HTML 和 JSON 端点, aiohttp 或 HTTPX 都能高效运行大批量工作负载。当您已设定安全的并发上限后错误率仍然上升时, 轮换住宅代理 可以将相互独立的公开请求分散到干净 IP 上。当 Cookie、地理位置、分页或定期监控需要稳定会话时,请使用 粘性住宅代理 或 ISP 代理 ,以应对 Cookie、位置、分页或周期性监控需要稳定会话的场景。

当目标需要 JavaScript、持久化浏览器状态或交互式页面行为时,请将工作流迁移到 NodeMaven 抓取浏览器。它提供托管云浏览器、代理路由、CAPTCHA 支持、持久化配置文件和 Live Browser 调试,并在每次会话传输的代理流量之外 不收取单独的浏览器使用费 ,除每次会话传输的代理流量外不再额外收费。

常见问题

Python 异步请求是指使用异步代码运行的 HTTP 请求。当一个请求在等待服务器响应时,事件循环可以启动或继续处理另一个请求。

aiohttp 可在单个异步事件循环中处理大量并发 HTTP 请求。对于小型同步脚本,Requests 更简单。正确的选择取决于请求量、目标行为,以及爬虫需要多大程度的连接控制。

HTTPX 拥有类似 Requests 的 API、原生异步支持、HTTP/2 支持和可配置的连接限制。aiohttp 则提供成熟的、专注于 asyncio 的客户端功能,以及对会话和连接的直接控制。请用您自己的目标站点和响应验证规则对两者进行测试。

从低并发开始,添加信号量,在可用时遵循 Retry-After 标头,使用退避策略重试,并验证响应。当重复的公开请求因单一 IP 而受限时,请将获准的工作流路由至 干净的住宅代理 而不是将每个请求都通过同一条线路发送。

小规模测试不需要。当爬虫需要获取特定地区的响应、反复发送公开请求、维持稳定的长期身份,或需要从云基础设施获得更可靠的线路时,才需要使用代理。

编号 aiohttp 只会下载服务器响应,不会执行页面中的 JavaScript。如果内容只有在渲染或交互之后才会出现,请使用 Playwright、Selenium 或 NodeMaven 抓取浏览器 ,以应对内容只有在渲染或交互后才出现的情况。

您可能还喜欢 这些文章

本网站使用 Cookie 文件 来提升您的使用体验。继续访问即表示您同意我们使用 Cookie。