57K Star、比BS4快784倍!Scrapling:这个开源爬虫框架让你彻底告别页面改版恐惧症
Scrapling 爬虫框架深度评测:自动适应网站改版、绕过 Cloudflare 拦截、比 BeautifulSoup 快 784 倍,57K Star 的 Python 爬虫新星。
一个能自动适应网站改版、绕过 Cloudflare 拦截、支持暂停续爬的 Python 爬虫框架。上线仅 19 个月,斩获 57,000+ GitHub Star,PyPI 日下载量持续攀升。
做爬虫开发的同学都有过这种经历:花了一下午写好的数据采集脚本,第二天网站一更新,class 名变了、DOM 结构调整了,所有选择器瞬间失效。你不得不重新打开浏览器开发者工具,一个元素一个元素地重新定位,改代码、调试、再改、再调,半天时间又搭进去了。
更让人头疼的是反爬系统。普通的 requests 请求早就被 Cloudflare 拦在门外,就算换上了 TLS 指纹模拟,遇到 Turnstile 验证码又得抓瞎。再加上动态加载的 SPA 页面、IP 封禁、验证码挑战……写爬虫这件事,从来没有”一把梭”那么简单。
Scrapling 就是为了解决这一整套问题而生的。
这个由埃及开发者 Karim Shoair 从 2024 年 10 月开始打造的项目,在不到两年的时间里已经成长为 Python 爬虫生态中最受关注的框架之一。截至 2026 年 6 月,Scrapling 在 GitHub 上获得了 57,181 个 Star、5,549 个 Fork,被 221 人 Watch,累计提交超过 1000 次,issue 数量仅 26 个——这说明维护者响应及时,项目质量高。
它的定位很清晰:不是 BeautifulSoup 的又一个封装,也不是 Scrapy 的克隆品。Scrapling 从底层设计上就瞄准了现代 Web 爬取的三大核心难题——反爬绕过、页面变化适应、大规模爬取调度——给出了一套完整而统一的解决方案。
🏆 核心成绩单
| 维度 | 数据 | 一句话解读 |
|---|---|---|
| GitHub Star | 57,181 | 2024.10 创建,Python 爬虫类目增长最快项目 |
| Fork | 5,549 | 社区参与度极高 |
| 测试覆盖率 | 92% | 完整类型标注 + PyRight/MyPy 双扫描 |
| 解析 5000 元素 | 2.02ms | 比 BeautifulSoup (lxml) 快 ~784 倍 |
| JSON 序列化 | 8倍 于标准库 | 内置 orjson 引擎 |
| 自适应找回率 | 标签变更 100% | 结构变动场景几乎完美找回 |
| Python 版本 | 3.10 ~ 3.13 | 全系兼容 |
| 许可证 | BSD-3-Clause | 商用无顾虑 |
| Docker 支持 | 开箱即用 | 每次发版自动构建推送 |
💡 以下实测数据均来自本机环境(ARM64 Linux,Python 3.12,100 次重复取平均),与官方基准可能有差异,但足以反映真实使用场景下的性能表现。
🤔 Scrapling 到底干了什么?
用一句话概括:它是一个”自适应”的 Web 爬取框架,覆盖从单次请求到全站爬取的所有环节。
传统的 Python 爬虫技术栈通常是这样的拼凑组合:requests / httpx 发请求 → BeautifulSoup / lxml 解析 → 手动写去重和调度逻辑 → 遇到反爬再上 Selenium / Playwright。每加一层,代码复杂度翻一倍,维护成本也同步飙升。
Scrapling 把这条链路整合成了三个层次分明但又无缝衔接的模块:
1. 获取层(Fetchers)—— 3 种引擎覆盖所有场景
这一层解决的是”怎么把网页拿下来”的问题。Scrapling 提供了三种引擎,分别对应不同难度的目标网站:
Fetcher:基于curl_cffi的纯 HTTP 引擎,能模拟 Chrome/Firefox/Safari 等主流浏览器的 TLS 握手指纹。支持 HTTP/3 协议和会话持久化,适合大多数常规网站。StealthyFetcher:在浏览器引擎之上增加了隐身模式,包括指纹随机化、WebDriver 痕迹抹除、自动 Cloudflare Turnstile 绕过。对付那些上了反爬手段的网站,这是主力武器。DynamicFetcher:完整浏览器自动化,基于 Playwright 的 Chromium 或 Google Chrome。适合需要完整 JS 渲染的 SPA 页面或交互密集型页面。
关键是,这三种引擎共享完全相同的 API 设计。你从 Fetcher 切换到 StealthyFetcher,只需要改一个类名,其余代码一行都不用动。这种设计对于初期用简单请求做原型、后期需要升级到隐身模式的爬虫项目来说,简直太友好了。
2. 解析层(Parser)—— 自适应元素追踪是灵魂
解析 HTML 的库很多,BeautifulSoup、lxml、Parsel、PyQuery……为什么还要用 Scrapling 的解析器?
答案在于它的 自适应元素追踪(Adaptive Element Tracking) 能力。简单来说:你第一次用 .product 这个选择器找到商品列表时,Scrapling 会把每个匹配元素的”指纹”保存到本地 SQLite 数据库中。这个指纹不是简单的 CSS 路径,而是包含了元素文本特征、属性组合、DOM 位置关系等多维度信息。
当目标网站改版后——比如 div.product 变成了 article.product-card——你再运行同样的代码,Scrapling 发现原来的选择器匹配不到了,就会自动在 DOM 树中搜索与之前保存的指纹最相似的元素,然后告诉你”它们在这儿,换了个马甲而已”。
这个功能的价值怎么强调都不过分。做过爬虫维护的人都知道,选择器失效重新定位的成本往往比写新爬虫还高。Scrapling 把这件事自动化了,这意味着一份爬虫代码的生命周期可以大幅延长。
此外,Scrapling 的解析器还支持:
- CSS 选择器(含 Scrapy/Parsel 风格的伪元素
::text、::attr) - XPath 选择器
- BeautifulSoup 风格的
find_all(find_all('div', class_='foo')) - 按文本内容搜索(
find_by_text('关键词', partial=True)) - 正则表达式搜索
- 自动选择器生成(选中元素 → 自动生成 CSS/XPath 路径)
3. 爬取层(Spiders)—— 不只是”能用”,是”好用”
如果只是解析 HTML,Scrapling 最多算一个”好用的解析器”。但加上 Spider 框架后,它就真正变成了一个可以与 Scrapy 正面竞争的爬虫框架。
Scrapling Spider 的几个设计亮点:
暂停续爬(Pause & Resume):这是 Scrapling 最受好评的特性之一。启动 Spider 时传入一个 crawldir 参数,Scrapling 会自动将爬取进度以检查点(checkpoint)的形式写入磁盘。运行时按 Ctrl+C,它不会粗暴退出,而是优雅地保存当前进度后再停止。下次用同样的 crawldir 启动,它直接从断点继续爬——已爬过的 URL 不会重复请求,未完成的继续处理。
多会话路由:一个 Spider 内部可以同时注册多个会话。比如注册一个快速的 HTTP 会话用于普通页面,再注册一个隐身浏览器会话用于受保护页面。在 parse 回调里,你通过 sid 参数就能把不同的请求路由到不同的会话。一个爬虫,两种策略,代码不分裂。
流式输出:async for item in spider.stream() 可以让爬取结果实时流出,而不是等整个爬虫跑完才拿到数据。这对需要做实时处理、写入数据库、或者展示进度的场景来说非常关键。
开发模式:这又是一个”用了就回不去”的特性。开启开发模式后,Spider 第一次运行时会正常请求目标网站,并把所有响应缓存到本地磁盘。之后的运行直接从缓存读取,不再请求远程服务器。这意味着你可以在完全不打扰目标服务器的情况下,反复调试 parse 回调里的解析逻辑。
🏗️ 架构一览
Scrapling 的代码组织非常清晰,25000+ 行 Python 代码被严格分层:
| 层级 | 模块 | 代码量 | 职责 |
|---|---|---|---|
| 解析引擎 | scrapling/parser.py | 1381行 | Selector 类,自适应追踪核心 |
| HTTP 引擎 | scrapling/engines/static.py | 783行 | curl_cffi 封装,TLS 指纹模拟 |
| 浏览器引擎 | scrapling/engines/_browsers/ | ~1600行 | Playwright/Chrome 管理,隐身注入 |
| 爬虫引擎 | scrapling/spiders/ | ~1900行 | 调度器、检查点、会话管理 |
| AI 集成 | scrapling/core/ai.py | 907行 | MCP Server,AI 辅助提取 |
| CLI | scrapling/cli.py | 661行 | 命令行工具 + IPython Shell |
| 工具箱 | scrapling/engines/toolbelt/ | ~4400行 | 代理轮换、广告域名屏蔽、导航工具 |
几个值得关注的技术选型:
orjson替代标准库json,序列化速度提升约 8 倍——在大量爬取结果的导出场景中效果显著curl_cffi提供浏览器级别的 TLS 指纹模拟,比纯 Python 方案更底层更可靠- SQLite 作为自适应追踪的存储后端,线程安全、零配置、单文件部署
- 全模块延迟加载(Lazy Import),不用的模块绝不加载,保持最小内存开销
🧪 实战演练
我们在本地环境中完整安装了 Scrapling,针对其核心功能做了 6 组实测。
安装与配置
1
2
3
4
5
6
# 基础安装(仅解析器)
pip install scrapling
# 完整安装(解析器 + 获取引擎 + AI + Shell)
pip install "scrapling[all]"
scrapling install # 下载浏览器依赖
安装非常顺畅,依赖解析干净,没有遇到版本冲突。基础包仅 6 个依赖,体量很小。
实测 1:多方式元素选择 —— 一份 DOM,四种写法
Scrapling 的解析器同时支持 CSS、XPath、BeautifulSoup 风格的 find_all,以及正则搜索。我们构造了一个包含 id 和 class 属性的 HTML 片段来测试:
1
2
3
4
CSS 选择器: Special Item
XPath 选择器: Special Item
find_all('span', id=..): Special Item
find_all + class 过滤: Special Item
四种方式全部命中同一个元素。这意味着团队成员不管习惯哪种选择器风格,都能无缝上手。从 BeautifulSoup 迁移到 Scrapling 的学习成本很低——find_all 的 API 签名几乎一样。
实测 2:文本搜索 + 相似元素自动发现
这是 Scrapling 区别于其他解析库的一个特色功能。给定一个包含多本书籍信息的页面,我们通过模糊搜索找到一个元素,然后让 Scrapling 自动找出页面上结构相似的其他元素:
1
2
3
4
5
6
7
8
搜索 'Gatsby'(模糊匹配):
→ 找到 <h3> "The Great Gatsby"
→ 耗时: 0.129ms
自动发现相似元素:
→ Pride and Prejudice
→ 1984
→ To Kill a Mockingbird
耗时不到 0.13 毫秒,并且准确找到了所有 3 本结构相同的书。find_similar() 这个 API 在写列表页爬虫时特别有用:你先手动定位一条数据,剩下的让 Scrapling 自动帮你找。
实测 3:性能基准 —— 比 BeautifulSoup 快 7 倍
构造 5000 个嵌套 div 元素的 HTML,测量各库提取所有元素文本的耗时(100 次平均):
| 库 | 平均耗时 | 相对速度 |
|---|---|---|
| Raw lxml | 5.49ms | 1.2x |
| Scrapling | 6.55ms | 1.0x |
| BeautifulSoup (lxml) | 42.62ms | 0.15x |
Scrapling 比 BeautifulSoup(同样使用 lxml 后端)快约 7 倍,与裸 lxml 性能几乎持平。考虑到 Scrapling 提供了远比裸 lxml 丰富的 API(自动选择器生成、文本搜索、相似元素发现等),这 1ms 的差距完全可以接受。
官方基准中 Scrapling 的这项数据是 2.02ms,接近 Parsel/Scrapy。差异来自硬件环境和 Python 版本,本机测试为 ARM64 架构。
实测 4:JSON 序列化 —— orjson 的威力
Scrapling 内部使用 orjson 进行所有 JSON 序列化(包括自适应元素的特征存储)。我们测试了 1000 条爬取结果(含标题、价格等字段)的序列化性能:
| 方案 | 平均耗时 |
|---|---|
| json.dumps | 0.3932ms |
| orjson.dumps | 0.0505ms(~8x) |
对于一次爬取几万条数据的场景,这个差距会被放大到秒级。8 倍的序列化加速不是一个可有可无的优化,而是直接决定了处理大规模数据时的体感流畅度。
实测 5:自适应元素追踪 —— 网站改版后的救星
我们模拟了 3 种真实世界中最常见的网站改版场景:
| 改版类型 | 具体变化 | 自适应找回 |
|---|---|---|
| 标签变更 | <div class="item"> → <p class="item"> | ✅ 2/2 (100%) |
| 结构嵌套 | 直接子级 → 被 <section><div> 包裹 | ✅ 2/2 (100%) |
| class 改名 | product-card → new-product-card | ⚠️ 部分找回 |
标签变更和结构嵌套两种场景,自适应引擎做到了 100% 找回。class 改名场景中需要元素保留足够的其他特征(如文本内容、DOM 位置),否则仅靠 class 名匹配确实困难——这也符合直觉:如果元素的所有特征都变了,那它确实不再是”同一个元素”了。
这个功能的实际价值:假设你维护着一个爬取某电商网站商品价格的脚本。某天网站把 div.price 改成了 span.product-price,传统做法是你收到告警、定位问题、重新写选择器、测试、部署——至少半小时。用 Scrapling,你只需要把 adaptive=True 传进去,它自动帮你搞定。
实测 6:自动选择器生成
选中页面上任意一个元素,Scrapling 可以自动反推出它的 CSS 选择器路径和 XPath 表达式:
1
2
3
4
5
6
目标元素: <h2> "Product A"
生成 CSS 选择器: body > main > div > article > h2
生成 XPath 路径: //body/main/div/article/h2
验证: 用生成的 CSS 选择器重新选中 → 1 个元素 ✓
这个功能在你需要”反向工程”一个复杂页面结构时非常实用。它生成的路径是可逆的——也就是说,用生成的路径去重新选择,一定能找回原始元素。
🎯 谁该用?选型指南
Scrapling 的模块化设计意味着它不是”要么全用要么别用”的类型。不同需求的用户可以按需取用:
| 你的使用场景 | 推荐方案 | 一句话理由 |
|---|---|---|
| 🆕 爬虫新手,想快速上手 | pip install scrapling[shell] | CLI 零代码提取 + IPython 交互式环境 |
| 📄 日常 HTML 解析,想替代 BS4 | pip install scrapling | API 熟悉、速度快 7x、功能更多 |
| 🛡️ 需要过 Cloudflare / 反爬 | scrapling[fetchers] + StealthyFetcher | 内置 Turnstile 绕过,开箱即用 |
| 🏭 大规模生产级爬取 | Spider 框架 + 暂停续爬 | 断点续传、多会话路由、流式输出 |
| 🤖 AI + 爬虫组合 | scrapling[ai] MCP Server | 让 Claude/Cursor 直接调用爬取能力 |
| 🔧 已有 Scrapy 项目 | 仅用 Parser 替换 Parsel | 兼容伪元素语法,性能持平,增加自适应 |
对于团队来说,Scrapling 还提供了 Docker 镜像(docker pull pyd4vinci/scrapling),包含所有浏览器依赖,每次发版自动构建推送。适合在 CI/CD 或容器化部署环境中使用。
特别值得一提的是 MCP Server 集成。Scrapling 提供了完整的 MCP(Model Context Protocol)服务器,让 Claude、Cursor 等 AI 工具可以直接调用 Scrapling 的爬取和解析能力。AI 负责”理解要爬什么”,Scrapling 负责”高效地爬下来”,各司其职。这个组合在数据采集、竞品分析、舆情监控等场景中的潜力非常大。
总结
爬虫这个领域从来不缺工具——从最早的 urllib 到 requests,从 BeautifulSoup 到 lxml,从 Selenium 到 Playwright,每一代工具都在解决当时的问题。但 Scrapling 做了一件之前没有人认真做好的事:把”反反爬”和”自适应解析”这两个爬虫维护中最耗时的环节,封装成了几行就能调用的 API。
它的核心价值可以用五个”一”来概括:
- 🎯 一个选择器走天下:CSS/XPath/BS4/文本/正则,喜欢哪个用哪个
- 🔄 一次保存,长期有效:自适应追踪让选择器在网站改版后仍然工作
- 🛡️ 一把梭过反爬:TLS 指纹 + 隐身浏览器 + Cloudflare 绕过,三件套齐全
- ⏯️ 一键暂停与续爬:Ctrl+C 优雅退出,重启后从断点继续
- 📦 一个库搞定全链路:获取 → 解析 → 调度 → 导出,不拼积木
57K Star 不是偶然。一个项目的爆发式增长,背后一定是它解决了一个足够痛、足够普遍的难题。Scrapling 做到了。
下次写爬虫的时候,试试 Scrapling。从 pip install scrapling 开始,体验一把什么叫”爬虫本该如此简单”。
项目地址:https://github.com/D4Vinci/Scrapling
官方文档:https://scrapling.readthedocs.io
许可证:BSD-3-Clause
当前版本:v0.4.8
作者:Karim Shoair
Discord 社区:https://discord.gg/EMgGbDceNQ
觉得有用?点个「在看」转发给同样写爬虫的朋友吧 💪