文章

57K Star、比BS4快784倍!Scrapling:这个开源爬虫框架让你彻底告别页面改版恐惧症

Scrapling 爬虫框架深度评测:自动适应网站改版、绕过 Cloudflare 拦截、比 BeautifulSoup 快 784 倍,57K Star 的 Python 爬虫新星。

57K Star、比BS4快784倍!Scrapling:这个开源爬虫框架让你彻底告别页面改版恐惧症

一个能自动适应网站改版、绕过 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 个 Star5,549 个 Fork,被 221 人 Watch,累计提交超过 1000 次,issue 数量仅 26 个——这说明维护者响应及时,项目质量高。

它的定位很清晰:不是 BeautifulSoup 的又一个封装,也不是 Scrapy 的克隆品。Scrapling 从底层设计上就瞄准了现代 Web 爬取的三大核心难题——反爬绕过、页面变化适应、大规模爬取调度——给出了一套完整而统一的解决方案。

🏆 核心成绩单

维度数据一句话解读
GitHub Star57,1812024.10 创建,Python 爬虫类目增长最快项目
Fork5,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_allfind_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.py1381行Selector 类,自适应追踪核心
HTTP 引擎scrapling/engines/static.py783行curl_cffi 封装,TLS 指纹模拟
浏览器引擎scrapling/engines/_browsers/~1600行Playwright/Chrome 管理,隐身注入
爬虫引擎scrapling/spiders/~1900行调度器、检查点、会话管理
AI 集成scrapling/core/ai.py907行MCP Server,AI 辅助提取
CLIscrapling/cli.py661行命令行工具 + 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,以及正则搜索。我们构造了一个包含 idclass 属性的 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 lxml5.49ms1.2x
Scrapling6.55ms1.0x
BeautifulSoup (lxml)42.62ms0.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.dumps0.3932ms
orjson.dumps0.0505ms(~8x)

对于一次爬取几万条数据的场景,这个差距会被放大到秒级。8 倍的序列化加速不是一个可有可无的优化,而是直接决定了处理大规模数据时的体感流畅度。

实测 5:自适应元素追踪 —— 网站改版后的救星

我们模拟了 3 种真实世界中最常见的网站改版场景:

改版类型具体变化自适应找回
标签变更<div class="item"><p class="item">✅ 2/2 (100%)
结构嵌套直接子级 → 被 <section><div> 包裹✅ 2/2 (100%)
class 改名product-cardnew-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 解析,想替代 BS4pip install scraplingAPI 熟悉、速度快 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 负责”高效地爬下来”,各司其职。这个组合在数据采集、竞品分析、舆情监控等场景中的潜力非常大。


总结

爬虫这个领域从来不缺工具——从最早的 urllibrequests,从 BeautifulSouplxml,从 SeleniumPlaywright,每一代工具都在解决当时的问题。但 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


觉得有用?点个「在看」转发给同样写爬虫的朋友吧 💪

本文由作者按照 CC BY 4.0 进行授权