如何在Python中实现异步的数据解析_结合BeautifulSoup与进程池提升效率

夏静酱_1947

夏静酱_1947

2026-05-30

799人浏览

原创

beautifulsoup 本身不支持异步,因其是纯 cpu 密集型解析器,无 i/o 操作;提速需分离网络请求(用 httpx.asyncclient 异步并发)与 html 解析(用 multiprocessing 同步分发),避免 gil 限制和事件循环开销。

如何在python中实现异步的数据解析_结合beautifulsoup与进程池提升效率

BeautifulSoup 本身不支持异步,强行套 asyncio 不会加速解析;真正要提速,得把「网络请求」和「解析」拆开,让请求异步化,解析仍用同步但走多进程分发。

为什么不能直接 await BeautifulSoup()

BeautifulSoup 是纯 CPU 密集型的 HTML 解析器,所有操作都在本地内存完成,不涉及 I/O。给它加 async 关键字或扔进 asyncio.create_task() 不会产生并发效果,反而因事件循环调度引入额外开销。常见错误是写成:

async def parse(html):
    soup = BeautifulSoup(html, "lxml")  # ❌ 这行仍是同步阻塞
    return soup.find("title").text

这类代码在 async 函数里跑,但实际执行时仍是逐个解析,毫无并发收益。

requests + asyncio 并发请求 + multiprocessing 解析

高效组合的关键在于职责分离:用 aiohttp 或 httpx.AsyncClient 并发拉取 HTML,拿到结果后,把大批量 html 字符串丢给 multiprocessing.Pool 或 concurrent.futures.ProcessPoolExecutor 做解析。这样既绕过了 GIL 对解析的限制,又避免了 requests 同步阻塞。

  • 不要用 requests.get() 配 asyncio —— 它不是协程,会阻塞整个 event loop
  • 推荐用 httpx.AsyncClient:API 接近 requests,原生支持 async,且可复用连接
  • 解析函数必须是普通同步函数,例如 def parse_page(html: str) -> dict:,才能被进程池安全调用
  • 注意 html 字符串大小:过大时跨进程传递有开销,必要时可传 URL + 共享 session key,让子进程自己 fetch(但需处理 Cookie/headers 同步)

multiprocessing.Pool 解析时的坑

子进程无法继承主进程的全局状态,比如已配置好的 requests.Session、全局 logger、或自定义的 BeautifulSoup 解析器实例。常见报错:

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
AttributeError: Can't pickle local object 'create_session.<locals>.session'</locals>

解决方式:

  • 所有依赖都通过参数显式传入,比如把 parser 类型("lxml" 或 "html.parser")作为参数,而不是传一个已初始化的 BeautifulSoup 对象
  • 避免在解析函数里 import 模块(虽通常不会错,但某些环境如 Windows 下 spawn 方式会重复 import,导致意外行为)
  • 若需共享配置(如 User-Agent),建议用 functools.partial 预设参数,而非闭包捕获
  • 进程数别盲目设高——超过 CPU 核心数太多反而因上下文切换拖慢整体速度;一般设为 os.cpu_count() or 4 较稳妥

完整流程示意(无框架精简版)

以下逻辑能跑通,不含异常重试、限速、UA 轮换等工程细节,但体现了核心分工:

import asyncio
import httpx
from multiprocessing import Pool
from bs4 import BeautifulSoup
<p>def parse_html(html: str) -> str:
soup = BeautifulSoup(html, "lxml")
return soup.title.string if soup.title else ""</p><p>async def fetch_all(urls):
async with httpx.AsyncClient(follow_redirects=True) as client:
tasks = [client.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [r.text for r in responses if r.is_success]</p><p>def main(urls):</p><h1>异步抓取</h1><pre class="brush:python;toolbar:false;">htmls = asyncio.run(fetch_all(urls))
# 多进程解析
with Pool(4) as pool:
    titles = pool.map(parse_html, htmls)
return titles

这个结构里,fetch_all 负责并发下载,parse_html 是纯 CPU 工作单元,Pool.map 自动分发到多个进程。两阶段之间用内存列表传递,简单直接。

最容易被忽略的是:解析函数不能依赖任何主进程中的对象状态,也不能调用任何带副作用的全局函数(比如写文件、改全局变量)。一旦跨进程边界,就只剩参数和返回值是可信的。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4564

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26957

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习