🟡 进阶

Scrapling 是什么、它和 BS4/Scrapy/Playwright 差在哪

Scrapling 是一个自称「自适应」的 Python 爬虫框架——意思是,网站改版、你原来写的「找元素的代码」失效了,它会用相似度算法自己去找回那些元素。这篇不教你成为爬虫工程师,教你判断:在 BS4 / Scrapy / Playwright / Scrapling 这四个名字之间,你这个项目该选谁、什么时候别选 Scrapling,以及选完之后要替工程师守住哪几条线(尤其是法律那条)。

📅 更新于 2026-09-30 · 本文校对于 Scrapling @ 0.4.15(2026-08-23 发布)· 官方源:github.com/D4Vinci/Scrapling

0.4.15
本文校对时的最新版(2026-08-23 发布)
53 个
自 2024-10-13 首次发布以来的累计版本数——活跃度参考
≈ 785×
同一个解析任务,它比 BeautifulSoup + lxml 快多少倍(官方 benchmark)
3 类
三种 Fetcher,决定你的爬虫能不能看穿 JS 渲染与反爬

0030 秒速览:三句话,和你的第一个动作

读完这一篇,你能做到三件事:① 在 BS4 / Scrapy / Playwright / Scrapling 四个名字之间说出各自的位置、什么时候该用谁;② 看到工程师装 Scrapling 时,知道该让他走哪条命令(避开 pip install scrapling 这种"装了一半"的姿势);③ 在动手之前,知道这条线背后有法律和网站服务条款这两条硬线,无论选哪个都绕不过去。

如果只记三句话

🎯 记住了,后面都是细节

① Scrapling 是 BS4 / Scrapy 那一族里的新成员,名字和 Scrapy 像但不是一回事。Scrapy 是「整站遍历」的工业流水线;Scrapling 是「一个更快的、带自适应能力的解析器 + 一套能对抗反爬的请求工具」。它比 BeautifulSoup 在同一任务上快几百倍,它的核心卖点是自适应(adaptive)——网站改版后,原来的选择器失效,它能自动把元素找回来(详见 §07)。

② 它是给「程序员的工具」,不是给「不写代码的人」的工具——但你用得到它的前提是判断三件事:要不要 JS 渲染、要不要对付反爬、要不要长期维护同一个爬虫。三件事全是「不」→ 用更简单的 BeautifulSoup;后两件是「是」→ Scrapling 是合乎直觉的选择;中间情况逐项看 §03 的选型地图。

③ 「能爬到」≠「可以爬」。装上 Scrapling 不等于拿到一张合法通行证。robots.txt、目标网站的服务条款、当地的数据保护法律——这三条任何一条卡住,爬得越快越麻烦。这一节不讲的法律事,§09 讲。

接下来 60 秒:你的第一个动作

如果你打算今天就让工程师上手,先让他敲这两条命令(先把 pip 这条不够的事纠正掉,再装对的——§04 详细说明):

# 第一步:装带浏览器和反爬能力的完整版(不要只敲 pip install scrapling)
pip install "scrapling[fetchers]"

# 第二步:下载浏览器本体(必须再跑这一条,否则任何 StealthyFetcher/DynamicFetcher 都起不来)
scrapling install

# 验证装好没:进 Python,import 不报错就说明解析器那一半就绪
python3 -c "from scrapling.parser import Adaptor; print('parser ok')"

这两条命令看着平淡,但第二步是新手最常踩的坑。只装不下载浏览器,等于买了辆车但没拿钥匙——程序会照常报错 ModuleNotFoundError 或 browser not found,而你不知道发生了什么。

⚠️ 这篇假设你手上有这几样

① 一台装好 Python 3.10 或更高版本的电脑。Python 3.9 装不上当前版 Scrapling。检查命令 python3 --version,看到 Python 3.10.x 以上的版本号就够格。低于 3.10,先按本仓的 Python 快速上手 把 Python 装好。
② 一个能敲命令的地方(终端)。macOS 自带「终端」;Windows 用 PowerShell。
③ 一个目标网站——以及你愿意花 60 秒去查一眼它的服务条款(ToS)和 robots.txt。这一条最容易被省,省了之后会反复咬回来(§09)。

关键数字(先有个量级感)

0.4.15本文校对时的最新版,2026-08-23 在 PyPI 发布。从 2024-10-13 首次发版 0.1 算起,53 个版本,节奏很快
≈ 785×官方 benchmark:同一份嵌套 HTML 解析任务(5,000 个嵌套元素),Scrapling 用 1.99 ms,BeautifulSoup + lxml 用约 1,562 ms。数值来自官方 README 的性能表
3 类三种 Fetcher:Fetcher(最轻)、StealthyFetcher(绕过 Cloudflare 等反爬)、DynamicFetcher(跑一个真浏览器,能看 JS 渲染)。§06 给决策树
≈ 30 秒「从 pip install 到第一次抓回东西」的真实耗时——前提是 Python 环境已经装好且不带坑
2024-10-13Scrapling 在 GitHub 首次发布的日子,作者 Karim Shoair(D4Vinci),许可证 BSD-3-Clause

如果你只有半小时:按你的处境直接跳

你现在的状态直接看这里为什么
完全没碰过爬虫,先想知道它是什么01 它是什么 → 03 选型地图不搞清楚它和 BS4/Scrapy 的关系,后面每一个判断都会偏
已经在用 BeautifulSoup,但爬虫老挂02 它解决什么 → 07 自适应「老挂」通常是选择器失效或被反爬挡了——这两件事正是 Scrapling 的卖点
要在几个工具里选一个03 选型地图一张表把四个工具的位置摆齐
已经决定用 Scrapling,今天就想跑通04 装好 → 05 最小例子十分钟装好、十分钟跑通第一条
工程师在用 Scrapling,需要替他把关06 三个 Fetcher + 09 法律与 ToS前者决定能不能爬到,后者决定能不能做
看完一篇要决定要不要上项目11 一页纸里面有「该不该用」四问,能直接拿去对照你的项目
📖 这篇为什么值得读(它和别处的 Scrapling 教程差在哪)

网上的 Scrapling 入门文章几乎都写给「会写 Python 的人」:默认你懂 CSS 选择器、懂异步、懂 HTTP。这篇的起点不一样——它假设你懂行业、不写代码,手上可能已经有几个半途停下的项目,正在判断「AI 建议我用 Scrapling,这话能不能信」。所以它把重点放在三样别处不容易凑齐的东西上:四个工具(BS4 / Scrapy / Playwright / Scrapling)的位置与权衡、「自适应」到底是黑魔法还是一组合法的相似度算法,以及一篇爬虫教程通常不会写、但一定会卡你的法律与服务条款现实。

01它是什么:名字像 Scrapy,但完全是另一件事

第一件事必须先破掉一个错想:看到名字里有「scrap」就以为是 Scrapy。它不是。

Scrapling ≠ Scrapy,看名字也想得到

✗ Scrapy

2008 年开始的整站爬虫框架:你给它一批起始地址,它自己管理请求队列、限速、去重、持久化,把整站抓回来。PyPI 上目前累计下载量过亿。它的强项是「几百上千万页面」级别的大工程;代价是学习曲线陡,配置一大堆。[3]

✓ Scrapling

2024-10 才出现的轻量爬虫工具集:主打解析器比 BeautifulSoup 快几百倍、自带反爬绕过的 Fetcher、以及「网站改版后能自己找回元素」的自适应选择器。它不做「整站流水线」那种工业级框架,而是把「抓页面 + 找元素 + 改版存活」三件事做精。[1][2]

它俩的关系更接近「重型卡车」和「越野自行车」:都能送东西,但场景不同。需要抓一两百页、且页面老改版、且可能被反爬挡——这是 Scrapling 的地盘;要稳定抓百万级页面、配齐工程化流水线——选 Scrapy 更稳。

它不是这四样东西

✗ 它不是浏览器

它能调用浏览器(通过 DynamicFetcher),但它本身不是浏览器。它是一段 Python 代码在跑的进程。你看到「真浏览器」是因为它替你启动了一个无头浏览器(headless browser——一种没有可视窗口的浏览器模式)。

✗ 它不是 AI 工具

它里面有一项 AI 集成(scrapling[ai] 装的是 MCP server——一种让 AI 助手能直接调用它的协议),但它本身不靠大模型工作。解析页面用的是确定性的选择器与相似度算法,没有「让 AI 自己猜」。

✗ 它不是「绕过反爬的万能钥匙」

它的 StealthyFetcher 在很多 Cloudflare 验证前能过,但反爬系统在持续升级;它官网原话是「handling Cloudflare Turnstile/Interstitial with automation」,「with automation」三个字要读出来——自动化通过≠所有情况都通过。[1]

✗ 它不是「合法爬取」的通行证

它的 README 自带一段免责声明,原话:库仅供教育与研究用途,使用者必须遵守当地的数据爬取与隐私法律,并尊重目标网站的服务条款与 robots.txt。[1] 这不是套话——§09 会把这条线展开。

那它是什么:一句话定义

🎯 一句话定义

Scrapling 是一个 Python 写的「爬虫工具集」:一个比 BeautifulSoup 快几百倍的解析器(解析器=从网页 HTML 里把你要的元素挑出来的程序),加上三个能应对不同网络环境的 Fetcher(请求页面并把内容拿回来的组件),加一个能整站爬的 Spider,加一个「网站改版后能自己找回元素」的自适应选择器。它不是框架——你用它的方式更接近「一个超强的第三方库」,而不是「一套要遵守的项目结构」。

这句话里有四个词要拆开——拆完就没有生词了。

「解析器」是什么,为什么「比 BS4 快 785 倍」听着像吹牛

解析器的工作很简单:你给它一份网页 HTML(也就是浏览器「右键 → 查看源代码」看到的那一长串带尖括号的文字),它帮你把里面的「标题」「价格」「链接」这种结构化信息挑出来。BeautifulSoup 是这个领域二十年的老前辈,几乎所有 Python 爬虫教程都从它开始。Scrapling 的解析器叫 Adaptor,基于 Cython(一种把 Python 翻译成 C 代码以提升速度的工具)实现,所以同一份任务能快几百倍——这不是营销话术,是算法复杂度加底层语言的差距。

但快不等于「你应该用 Scrapling 替换 BS4」。如果你只爬一两个页面、偶尔用一次,BS4 慢几十毫秒你根本感觉不到;差距在你爬的页面多、改版频繁时才有意义。§03 的选型地图会告诉你什么时候这点速度值得换。

「Fetcher」是什么,为什么会有三个

解析器只负责「拿到 HTML 之后怎么办」。「怎么把 HTML 拿回来」是 Fetcher 的事。同一个网站,你可以用三种姿势去拿——

三个怎么挑,§06 是一棵决策树。

「自适应」到底是什么

这是 Scrapling 最大的卖点,也是最多人被「自适应」两个字唬住的地方。它不是 AI、不是魔法,是一个确定性的相似度算法。具体在 §07 拆——这一节先让你知道「网站改版之后选择器失效」这件事到底是什么样子,下一节再给解法。

如果只能带走一句:Scrapling = 一个超快的解析器 + 三个能应付不同环境的 Fetcher + 一个「网站改版后还能找对元素」的自适应选择器 + 一个能整站爬的 Spider。它的位置是「BS4 太弱、Scrapy 太重」中间那一档。

02它解决什么:爬虫最常死的三种姿势

「它解决什么问题」这个问题,最好的问法是反过来问:不用它,爬虫会死在哪?答案是三种姿势,每一种都是工程师已经在群里骂过的具体痛。

死法一:网站改版,你写的「找价格的那行代码」失效了

你(或工程师)写了一段看起来人畜无害的代码:

# 工程师原话:「从商品页里把所有价格拿出来」
prices = page.css('.product .price::text').getall()

代码的意思是「把所有 class 叫 product 的元素里,class 叫 price 的元素的文字拿出来」。问题是 这套 CSS 选择器(用特定语法从 HTML 里挑元素的写法)依赖网站前端的代码——它哪天把 .price 改成 .price-tag,或者把 .product 包了一层 .product-card,你的脚本就一个价格也拿不到了。

普通解析器(BeautifulSoup、parsel)会沉默地返回空列表——没有报错、没有提示,第二天你才发现数据全空了。Scrapling 的自适应模式会把这个元素「记住」:下次再爬时,它按相似度找附近结构最像的节点,把价格拿回来。[1]

死法二:被反爬挡住,返回的是「验证你是人」那个页面

很多网站(尤其是电商、票务、新闻聚合)会部署反爬系统:检测到「访问速度不像人」「请求头不像浏览器」,就给你返回一个验证页面,而不是真实内容。BeautifulSoup 解析这种页面只会解析出 Cloudflare 的验证码,而不是你想要的数据。

Scrapling 的 StealthyFetcher 默认就能过 Cloudflare 的 Turnstile(Cloudflare 推出的一种「我不是机器人」验证)和 Interstitial(插入式「请检查你的浏览器」中间页)。它能过是因为它在请求时模拟了真实浏览器的指纹——浏览器和普通脚本在「打招呼」(握手)的细节上有一堆微妙差别,比如连接建立时的 TLS 握手信息、用 HTTP/2 还是 HTTP/1.1 发请求、Header 字段的顺序。普通脚本请求这些细节都是「裸」的,反爬系统一看就知道「这不是人」。Scrapling 把这些细节伪装成浏览器的样子。[1]

死法三:页面要 JavaScript 渲染,原始 HTML 里根本没有你要的东西

现代网站大量用 JavaScript 在浏览器里「拼出」最终内容。你打开「查看源代码」看到的是一堆空壳 div,价格、评论、商品列表都是浏览器跑完 JS 才填进去的。普通 Fetcher 拿到的是没跑 JS 的版本——什么都看不到。

Scrapling 的 DynamicFetcher 解决这个问题:它启动一个真实的浏览器进程(通过 Playwright),等 JS 跑完、页面真的「长出」内容了,再把 HTML 拿回来。代价是慢(启动浏览器要几秒,每页几秒),且占内存。

这三种死法,分别对应它哪一项能力

死法表现Scrapling 的对应武器
使用门槛
改版后选择器失效返回空列表,没报错自适应选择器(adaptive=True)需要先存一次「正确版本」
被反爬挡住返回验证码页面StealthyFetcher中等:装浏览器本体
JS 渲染内容HTML 里没数据DynamicFetcher高:装完整 Chromium
🔍 但有一条它不解决

Scrapling 不解决「账号登录后才有内容」——也就是必须先登录、要 Cookie(网站写在你浏览器里的小票据,用来记住「你已经登过」)或 Session 才能拿到的页面。它的 StealthyFetcher 可以带 Cookie,但登录本身(输入用户名密码、处理验证码)通常得你自己接 Selenium(另一个浏览器自动化工具)或 Playwright 的脚本层。这不是 Scrapling 的能力短板,而是爬虫领域的共性难题——任何一个工具碰到登录墙都得绕。

03选型地图:在 BS4 / Scrapy / Playwright / Scrapling 之间

这一节是全文最重要的一节——选错了工具,后面所有工作都白干。先记一句话:四个工具不是「新一代淘汰老一代」,是四个位置上各管一摊事。

四个工具的位置

工具它管什么什么时候用它 · 别当什么用
BeautifulSoup (BS4)纯解析器。从 HTML 里按标签挑元素页面少、不改版、不需要绕过反爬——新手从这里开始,永远不亏。别拿它去爬 JS 渲染的页面
Scrapy整站爬虫框架。管理请求队列、限速、去重、导出要稳定抓百万级页面、配齐工程化流水线时。学习曲线陡,新手项目不优先
Playwright浏览器自动化。能模拟人在浏览器里点、输、滚动需要 JS 渲染、需要交互(点击、滚动、登录)、需要做 UI 测试。用它来爬静态页面是杀鸡用牛刀
Scrapling超快解析器 + 三种 Fetcher + 自适应选择器 + Spider页面要应对反爬或 JS 渲染、且需要长期维护同一批页面(抗改版)时。它不是 BS4 的「替代品」,是 BS4 的「加强版」——大部分 BS4 能干的事它能干得更快

三问决策法:拿这三句去问你的项目

🎯 直接拿去问

① 要抓的页面需要 JavaScript 跑完才显示内容吗?
「需要」→ DynamicFetcher 或 Playwright;「不需要」→ 进下一问。

② 目标网站有没有反爬墙(Cloudflare、人机验证、限速)?
「有」→ StealthyFetcher;「没有」→ 进下一问。

③ 你要长期维护这个爬虫、且目标网站会改版吗?
「是」→ Scrapling 的自适应能力值得;「否,只跑一次」→ BeautifulSoup 加 requests 就够了。

四个工具跑同一份任务,速度量级差多少

这是 Scrapling 官方 README 给的 benchmark,对照任务是从 5,000 个嵌套元素的 HTML 里挑文字:

工具耗时相对 Scrapling
Scrapling1.99 ms1×
Parsel(Scrapy 自带的解析器)2.06 ms≈ 1×
PyQuery约 24 ms约 12× 慢
Selectolax约 197 ms约 99× 慢
BS4 + lxml约 1,562 ms约 785× 慢

这数字反着读更重要:Parsel(Scrapy 自带)和 Scrapling 几乎一样快——所以如果你的瓶颈只在解析速度,从 BS4 升级到 Scrapling 收益很大,从 Parsel 升级到 Scrapling 收益微乎其微,应该看的是别的东西(自适应、Fetcher)。[1]

🔍 公平地说,反过来也成立

如果你要的只是「一次性抓几十页、慢慢跑也不在乎」,BeautifulSoup + requests 的组合更轻、更熟、更容易找到答案。Scrapling 的速度优势只有在「页面数量多」或「对响应时间敏感」时才值得。

04装好:避开三个坑

安装是这一篇最容易翻车的环节——倒不是因为命令复杂,而是因为有三种常见姿势看着都像对的,但只有一种是对的。

三种安装姿势的区别

命令装了什么够用吗什么时候用
pip install scrapling只有解析器(Adaptor)❌ 不够千万别只敲这一条——任何 from scrapling.fetchers import ... 都会报 ModuleNotFoundError
pip install "scrapling[fetchers]"解析器 + 三个 Fetcher + 浏览器驱动⚠️ 接近够装完了还得跑 scrapling install,否则浏览器没下到本地
pip install "scrapling[all]"全部可选组件(fetcher + AI + RAG + shell)✅ 够啥都想要、且不在意多装几百兆依赖时

正确的完整流程(macOS / Linux)

# 第 1 步:检查 Python 版本(Scrapling 要求 3.10 或更高)
python3 --version

# 第 2 步:装带 Fetcher 的版本(带引号避免 shell 把 [] 解释成通配)
pip install "scrapling[fetchers]"

# 第 3 步:下载浏览器本体(StealthyFetcher / DynamicFetcher 都需要)
scrapling install

# 第 4 步:验证三个 Fetcher 都就位
python3 -c "from scrapling.fetchers import Fetcher, StealthyFetcher, DynamicFetcher; print('all ok')"

第一个坑:Python 版本不够

Scrapling 0.4.15 的官方元数据明确写明:requires_python_version ≥ 3.10。[2] Python 3.9 装不上当前版本。3.8 或以下更不用想。如果你电脑上只有 3.9,按本仓的 Python 快速上手 把 Python 升级到 3.11 或 3.12(当前推荐版)。

第二个坑:只装包不下浏览器

pip install "scrapling[fetchers]" 装的是「能调用浏览器」的代码,不包含浏览器本体。你必须再跑 scrapling install,它会从 Playwright 的 CDN 下载一个约 200 MB 的 Chromium。这一步没做就调用 StealthyFetcher 或 DynamicFetcher,会报 Executable doesn't exist at ... 之类的错。

第三个坑:在 Docker 之外的环境里 Windows 上用 bash 风格的引号

如果你用 Windows 的 PowerShell,"scrapling[fetchers]" 里的双引号也得留着——[fetchers] 是 pip 的「额外组件」语法,不加引号 shell 可能把它当成通配符。PowerShell 里的正确写法一样是双引号包起来。

如果你不想在本地装:Docker 一行

官方维护了一个把「包 + 浏览器 + 系统依赖」全装好的镜像:

docker pull pyd4vinci/scrapling
docker run --rm -it pyd4vinci/scrapling

这一行把镜像拉下来、起一个临时容器、进去就能用。适合「我就要试一下、不想污染本机环境」的场景。

🔍 一个常见但无伤大雅的迷惑

装完之后你可能看到 pip 警告「scrapling install 需要系统级依赖(apt-get 上的那一堆 so 库)」。这不是错,是 Debian/Ubuntu 系的提示——macOS 用 Homebrew 装 Chromium 时通常不报。多数情况下 scrapling install 自己会装齐;只有当它报「缺 .so 文件」时,才需要回到系统包管理器补。

05最小例子:10 行抓 quotes.toscrape.com

quotes.toscrape.com 是爬虫教程的「靶场」——一个专门为练习写的、不会反爬的、名言警句站点。Scrapling 的官方 README 就用它做最小例子。[1]

整段代码(10 行)

from scrapling.fetchers import Fetcher

page = Fetcher.get('https://quotes.toscrape.com/')

# 拿到所有「名言」的文字(每条名言都包在 .quote 里的 .text 标签里)
quotes = page.css('.quote .text::text').getall()

# 拿到所有作者
authors = page.css('.quote .author::text').getall()

for q, a in zip(quotes, authors):
    print(f'{q}  —— {a}')

每一行在说什么(逐行翻译)

代码它在做什么(用人话)
from scrapling.fetchers import Fetcher把最轻的那种请求工具拉进来
Fetcher.get('https://...')发一个 HTTP GET 请求(GET 就是浏览器地址栏敲回车的意思),拿到那页 HTML
page.css('.quote .text::text')从 HTML 里把所有「.quote 里的 .text」元素的文字内容挑出来(::text 是 CSS3 里的伪元素,表示「我要的是文字本身、不是元素本身」)
.getall()把「所有匹配项」装成一个列表(一个能装一串东西的盒子)返回
zip(quotes, authors)把「名言」和「作者」两个列表一一配对,像拉拉链一样
print(f'...')把每条名言按「内容 —— 作者」的格式打到屏幕上

你将看到什么

运行后终端会印出一长串类似这样的行:

“The world as we have created it is a process... —— Albert Einstein”
“It is our choices, Harry, that show what we truly...” —— J.K. Rowling”

如果你看到这一行行打出来,最小闭环就通了。后面所有进阶能力都只是在这个闭环上加东西。

下一步:把它存成文件,而不是只打到屏幕

工程师拿到数据通常要存下来,不是只看着。存 CSV(一行一条数据、用逗号分隔的表格文件,Excel 能直接打开)的最小改动:

import csv
from scrapling.fetchers import Fetcher

page = Fetcher.get('https://quotes.toscrape.com/')
quotes = page.css('.quote .text::text').getall()
authors = page.css('.quote .author::text').getall()

with open('quotes.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['名言', '作者'])
    for q, a in zip(quotes, authors):
        writer.writerow([q, a])

print(f'已写入 {len(quotes)} 条到 quotes.csv')

运行后你会得到一份 quotes.csv,Excel / WPS / Numbers 都能直接打开。

06三个 Fetcher 该用哪个:决策树

三个 Fetcher 不是「高低档」关系,是「不同场景用不同」。挑错既会白费力气,也会莫名其妙地失败。第一步永远是先用 Fetcher 试,跑通再换——别上来就挑最重的。

决策树(直接照抄)

开始
目标页面有没有「右键查看源代码看不到、但浏览器能看到」的内容?
→
没有
先试 Fetcher(最轻)
→
有
用 DynamicFetcher(启动真浏览器)
Fetcher 失败?
返回 403 / 验证码页面 / 空内容
→
换 StealthyFetcher
伪装浏览器指纹,能过 Cloudflare Turnstile
→
还不通?
检查 ToS(你可能根本不该爬)

三个 Fetcher 的速查表

Fetcher它干什么耗时量级(每页)适合场景
Fetcher普通 HTTP 请求0.1 ~ 1 秒公开页面、博客、文档站、没有反爬的内容
StealthyFetcher伪装浏览器指纹1 ~ 5 秒被 Cloudflare、人机验证挡住的页面
DynamicFetcher启动真浏览器,等 JS 跑完3 ~ 15 秒JS 渲染的 SPA(单页应用)、需要交互的页面

用 StealthyFetcher 的最小例子

from scrapling.fetchers import StealthyFetcher, StealthySession

# 用「会话」模式:保持同一个浏览器实例,爬多页时比反复启动快
with StealthySession(headless=True, solve_cloudflare=True) as session:
    page = session.fetch('https://nopecha.com/demo/cloudflare')
    data = page.css('#padded_content a').getall()
    print(f'抓到 {len(data)} 条链接')

用 DynamicFetcher 的最小例子

from scrapling.fetchers import DynamicFetcher

page = DynamicFetcher.fetch('https://quotes.toscrape.com/')
data = page.css('.quote .text::text').getall()
print(f'抓到 {len(data)} 条')
🔍 怎么判断「页面要 JS 渲染」

三步判断法:① 在浏览器里打开页面,按 F12 看 Network(网络)面板,刷新一下,看「XHR / Fetch」请求有没有大段 JSON 数据——有的话页面大概率是 JS 拼出来的;② 右键 → 查看源代码,搜你要的信息(比如价格、评论),搜不到就是 JS 渲染的;③ 装个 Chrome 插件「View Rendered Source」,它显示的是 JS 跑完后的真实 HTML。判断完再选 Fetcher,别上来就用最重的 DynamicFetcher。

⚠️ 一个关于「会话」的实用提醒

同一个 Fetcher 抓很多页时,用 Session 而不是反复 .get()。前者保持同一个 TCP 连接(一条与目标服务器保持的通信通道)和 Cookie 池,速度快几倍、对目标服务器的负担也更稳定。频繁开关连接反而是触发反爬的行为之一——爬虫的基本礼仪就是「像个真人一样慢慢翻」。

07自适应到底是什么:网站改版后,它怎么找对元素

这是 Scrapling 最容易被误读的一项能力。「自适应」三个字听起来像 AI——它不是。它是一组确定性的相似度算法,加一个「上次对的选择器」的本地存档。下面用一个完整的场景把它讲透。

场景:你的爬虫上周还活着,今天全死了

上周你(或工程师)写了一段代码,从商品页抓价格:

# 上周的「正确版本」
prices = page.css('.product .price::text').getall()

今天电商网站前端改版——把 .product 改成了 .product-card,把 .price 改成了 .price-tag。你这段代码依然「成功跑完」,但返回的是空列表——因为它要找的元素不在了。

普通解析器在这件事上是「哑的」:它不报错、也不提醒,你第二天打开 CSV 文件才发现「价格列全空」。这是爬虫工程里最隐蔽的失败模式——失败长得像成功。

自适应模式的两次调用

Scrapling 的自适应把这个失败拆成两步:

from scrapling.fetchers import StealthyFetcher

# 第一次:网站还长得对的时候跑一次,告诉它「这些选择器是对的」
# auto_save=True 会把「正确版本」存到本地一个 .json 文件
page = StealthyFetcher.fetch('https://example.com/products')
products = page.css('.product .price::text', auto_save=True).getall()

# 一周后:网站改版了,你的旧选择器失效
# adaptive=True 会用相似度算法找新的位置
page = StealthyFetcher.fetch('https://example.com/products')
products = page.css('.product .price::text', adaptive=True).getall()
# 即使 .product 改名 .product-card,它仍能找到价格

它具体怎么找——相似度算法的三层判断

Scrapling 的官方文档对「自适应」的具体机制没展开到学术论文级,但 README 明确说用的是「similarity algorithms」(相似度算法)。[1] 根据 GitHub 仓库源码和文档行为可以反推出它的三层判断(这一段是本文做的机制性复述,不是从官方文档抄来的句子——它帮读者理解为什么能跑通,但具体实现以仓库为准):

层级它在比什么什么情况下能找回什么情况下找不回
标签结构原来的 <div class="price"> 现在还叫 <div>,只是 class 名换了网站只改了 class 名,没改标签类型连「这是一个 div」都改了(比如改成了 <span>)
文本相似度节点里的文字内容(比如价格格式 "¥99.00")价格文本保持原样,只是包它的元素变了价格格式改了(比如加了个货币符号)
位置相似度「原来的价格出现在页面的什么相对位置」(比如「商品名后面第 2 个兄弟元素)位置关系大致不变整页结构重排

三层里只要有一层「对得上」,Scrapling 就会判定这是同一个节点。它不是猜,是确定性算法——同样的输入永远输出同样的结果。

🔍 自适应的边界

自适应不是万能的。下面这三种情况它救不回来:

  • 整页从表格改成卡片式——结构相似度太低
  • 页面里所有「看起来像价格」的元素都被改——没有相似度锚点
  • 你从来没跑过 auto_save=True——没存档就没有「上次对的样子」,无从相似

所以自适应是「救命」机制,不是「可以不看页面」的借口。每个爬虫还是该定期人工看一眼——至少看一眼数据是不是还对得上。

08Spider:把一个站爬一遍

如果你的目标是「抓几十页、几百页」,上面的代码复制改改就能用。如果目标是「抓整个站点」,Scrapling 提供了一个叫 Spider 的整站框架——名字和概念都借鉴 Scrapy。

最小 Spider:一个会追链接的爬虫

from scrapling.spiders import Spider, Response

class QuoteSpider(Spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com/"]

    async def parse(self, response: Response):
        # 每条名言抓出来,吐一个字典出去
        for item in response.css('.quote'):
            yield {
                "text": item.css('.text::text').get(),
                "author": item.css('.author::text').get(),
            }

        # 找「下一页」按钮,如果有就追过去
        next_page = response.css('.next a::attr(href)').get()
        if next_page:
            yield response.follow(next_page, callback=self.parse)

QuoteSpider().start()

这段代码在做什么

  1. 定义一个 Spider 类:给它一个名字("quotes")、一组起始 URL(start_urls)。
  2. 写 parse 方法:每抓到一个页面,Scrapling 就把页面塞给这个方法,让它处理。「async def」表示这个方法是异步的(不阻塞、可以并发执行)——这是 Scrapling 默认的写法,因为整站爬虫要并发很多请求。
  3. yield {...}:每条抓到的数据作为一个字典(字典=「键-值」配对的数据结构,类似 Excel 的两列)扔出来——Scrapling 会自动收集这些。
  4. response.follow(...):告诉 Scrapling「这个链接也值得追」,然后用 self.parse 去处理下一页。
  5. QuoteSpider().start():启动爬虫。

几个 Spider 内置的好东西

特性它做什么什么时候用
并发请求一次发 N 个请求,速度快几倍目标站能承受并发时(先慢一点试)
每个域单独限速对同一个域名自动放慢永远开着——除非你明确知道目标站鼓励并发
暂停 / 续跑Ctrl+C 保存进度,下次启动接着爬整站几十万页、要分几次跑完时
AutoThrottle按目标站响应速度自动调节请求间隔不知道目标站能承受多快时——让它自动学
导出 JSON / JSONL / CSV(三种常见数据格式,Excel / Pandas 都能直接读)直接存成对应格式默认开启,不必自己写存储代码
🔍 一个常被忽略的开关:robots.txt

Scrapling 的 Spider 有一个可选的 robots_txt_obey 开关——设成 True 时它会读目标站的 robots.txt(放在网站根目录的一个小文件,告诉爬虫「哪些路径别爬」),遵守里面的 Disallow、Crawl-delay、Request-rate 规则。[1]

默认不打开。这不是 Scrapling 的特例——Scrapy 也一样。原因是尊重 robots.txt 是行业惯例,法律不强制,但事故后法官会看。§09 展开讲这条线。

10五个坑:上手之后才知道的

这一节是「用起来之后」才会碰到的东西,教程里通常不讲,但每一个都能让你多花半天排错。

坑一:装了包,但 import 还是 ModuleNotFoundError

症状:pip install scrapling 成功,但 from scrapling.fetchers import Fetcher 报 ModuleNotFoundError: No module named 'scrapling.fetchers'。

原因:pip install scrapling 只装了解析器那一半。Fetcher 和 Spider 是「额外组件」,必须用 pip install "scrapling[fetchers]" 装。

解法:重装带额外组件的版本(§04):

pip install "scrapling[fetchers]"
scrapling install

坑二:StealthyFetcher / DynamicFetcher 报「Executable doesn't exist」

症状:装好了包、import 也不报错,但一调用就报 Executable doesn't exist at ...chromium...。

原因:你装了「能调用浏览器的代码」,但浏览器本体没下载。scrapling install 这一步被跳过了。

解法:scrapling install。或者直接用 Playwright 的下载命令 playwright install chromium。

坑三:自适应模式第一次跑就失效

症状:你想用自适应,adaptive=True 一开,结果报 No saved selector found 或直接返回空。

原因:自适应需要「存档」——之前要跑过 auto_save=True 把「上次对的样子」存下来。你从来没存过,就没有「上次对的样子」,无从相似。

解法:先确认你爬过的页面在「网站长得还对」时跑过一次 auto_save=True。如果网站已经改版了——很遗憾,自适应救不回来,要么换工具、要么换目标站。

坑四:爬到一半被目标站封 IP

症状:前 50 页正常,第 51 页开始 403。

原因:你的请求频率触发了目标站的限速。哪怕 Scrapling 帮你绕过了 Cloudflare,「访问太快」这个行为本身是反爬信号。

解法:开 Spider 时设 download_delay=2(每页间隔 2 秒),或开 AutoThrottle。如果是整站爬千万页级别——这超出本文范围,且这类项目几乎都需要先和目标站谈,技术上能过不等于该做。

坑五:写脚本的人在 Jupyter 里跑的,本地 cron 定时跑就失败

症状:在 Jupyter 里跑得好好的,写成 .py 文件用 cron 定时跑就报错。

原因:Jupyter 默认 ~/.local/bin 在 PATH 里,cron 不一定有。装了包但系统 Python 找不到。

解法:用 python3 -m pip install 装到当前解释器的 site-packages,或者用虚拟环境。具体做法见本仓的 虚拟环境。

🔍 还有一个常见的"假坑"

有人装完之后第一次跑,控制台没输出任何东西——以为是失败了。Scrapling 默认 DISABLE_LOG=True(一个让程序安静运行的开关),不会有进度条。如果你想看它在做什么,显式设 log_level='INFO'。这不是 bug,是设计——生产环境里没人想看爬虫的进度条。

11一页纸:命令、选型、判断清单

命令速查

我要做的事命令什么时候用
检查 Python 版本python3 --version动手第一步。低于 3.10 先别继续
装完整版(含 Fetcher + 浏览器)pip install "scrapling[fetchers]"标准起点。引号别省
下载浏览器本体scrapling install必须再跑这一条,否则 Stealthy / Dynamic 起不来
装全部可选组件pip install "scrapling[all]"啥都想要时。下载量多几百 MB
不想污染本机环境docker pull pyd4vinci/scrapling试一下就走的场景
验证安装python3 -c "from scrapling.fetchers import Fetcher, StealthyFetcher, DynamicFetcher; print('ok')"import 不报错就说明装齐了

Fetcher 选型速查

页面特征用这个原因
查看源代码能看到全部内容Fetcher最轻、最快、不浪费资源
JS 渲染后才有内容(SPA / React / Vue)DynamicFetcher需要真浏览器执行 JS
被 Cloudflare 验证挡住StealthyFetcher伪装浏览器指纹
需要登录StealthyFetcher 带 Cookie登录得另外写脚本,Scrapling 负责带 Cookie 访问

「该不该用」四问

🎯 拿这四句去问你的项目

① 要抓的页面是公开的、没登录、ToS 没禁止吗?
「是」→ 进下一问;「否」→ 停下来谈授权或换数据源。

② 页面是静态 HTML 还是要 JS 渲染?
「静态」→ BeautifulSoup 加 requests 就够,没必要上 Scrapling;「JS」→ 进下一问。

③ 目标站有反爬墙吗(Cloudflare、人机验证、限速)?
「有」→ Scrapling 的 StealthyFetcher 值得;「没有」→ BeautifulSoup + requests 还更轻。

④ 这个爬虫要长期跑、且目标站会改版吗?
「是」→ Scrapling 的自适应值得;「否」→ 任何工具都行,选最熟的。

给工程师的四句验收话

这四句是把「我看不懂代码」换成「我能问出有明确答案的问题」的现成话——直接复制:

1. 在动手之前,把目标站的 ToS 和 robots.txt 各截一张图给我。
2. 你选的是 Fetcher / StealthyFetcher / DynamicFetcher 哪一个?为什么是这个?
3. 第一次跑通后,你跑过 auto_save=True 吗?(确认自适应能生效)
4. 这次的请求频率是多少?目标站有没有限速规则?

每一条都有明确的「是 / 否 / 列出具体值」的答案空间——这就是你缺的那种「可用依据」。

12名词速查:见到它们时别当成什么用

这些词你会在对接、看文档、问 AI 时撞见。第三列告诉你这个词不该被当成什么。

术语一句话定义为什么重要 / 什么时候用 · 别当什么用
爬虫 / Web scraper按规则自动访问网页、把内容拿回来的程序它是「自动化访问」,不是「授权访问」。别当浏览器扩展或插件——它是独立程序
HTML网页的源文件,浏览器把它渲染成你看到的页面爬虫拿到的就是它。带尖括号的一长串文字。别把它当图片——它是纯文本
CSS 选择器用特定语法从 HTML 里挑元素的写法(.class 选类,#id 选 id)写爬虫必学。别当编程语言——它只是「找元素的语法」
XPath另一种找元素的语法,用路径式表达(//div[@class="x"])和 CSS 选择器功能重叠;Scrapling 都支持。选一个用熟,别两个都学一半
解析器 / parser从 HTML 里把结构化信息挑出来的程序BeautifulSoup、parsel、Scrapling 的 Adaptor 都是。别当爬虫整体——解析器只负责「拿到 HTML 之后怎么办」
Fetcher把 HTML 拿回来的组件解析器只管「拿到之后」,Fetcher 管「怎么拿」。别当解析器——它们是不同位置上的事
反爬 / anti-bot网站用来阻止自动化访问的技术Cloudflare、人机验证、限速都是。别当网站故意刁难——它是合理的运维措施
Cloudflare TurnstileCloudflare 提供的「我不是机器人」验证组件看到它说明这个站被 Cloudflare 保护了。别当唯一能挡爬虫的——它能被自动化绕过
Cookie网站写在你浏览器里的小票据,用来记住「你已经登过」登录后的内容靠它维持。爬虫要持续登录得自己管 Cookie。别当账号密码——它只是一个会话标识
Session保持同一条网络连接和 Cookie 池的会话同一会话内多次请求更高效。别当「一次访问」——它是「一组访问」
JS 渲染 / JavaScript rendering网页内容由浏览器跑完 JavaScript 才显示出来「右键查看源代码」看不到的数据往往是 JS 渲染的。别当所有网页都这样——多数博客、文档还是静态的
无头浏览器 / headless browser没有可视窗口的浏览器模式,跑在后台执行DynamicFetcher 启动的就是它。别当「另一个浏览器」——它就是 Chrome,只是没窗口
Playwright一个控制浏览器的库,能让 Python 启动、操控 ChromiumScrapling 的 DynamicFetcher 在它之上。别当替代品——可以单独用,集成在 Scrapling 里更方便
robots.txt网站根目录的小文件,告诉爬虫「哪些路径别来」看 https://目标站/robots.txt。别当法律——它是礼貌协议,不守不一定违法,但出事后会被引用
ToS / 服务条款网站白纸黑字写明使用规则违反 ToS 可能被起诉违约。别当「点同意就走」的例行公事——爬虫场景下它是合同
自适应 / adaptive网站改版后,Scrapling 用相似度算法找回元素Scrapling 的核心卖点。别当 AI——它是确定性算法,不是猜
Spider整站爬虫框架Scrapling 的 Spider 借鉴 Scrapy。别当「蜘蛛」或某种动物——它是个抽象概念(蜘蛛在网上爬来爬去)
MCPModel Context Protocol,让 AI 助手能直接调用外部工具的协议Scrapling 的 [ai] 装的是 MCP server。别当 AI 模型——它是个通信协议
PyPIPython 的官方软件仓库装包从这来。别当 Python 的一部分——它是第三方仓库,Python 自带的「标准库」另算
虚拟环境 / .venv给一个项目单独隔离出来的 Python 环境用 pip 装包时必须先有它,否则会污染整台机器

13常见问题

Scrapling 和 Scrapy 哪个好?
不是「哪个好」,是「用在哪」。抓几百页、且页面老改版、可能被反爬挡 → Scrapling;抓百万页、要工程化的请求队列、去重、限速、导出 → Scrapy。两者的解析器速度在同一量级(Parsel 和 Adaptor 都是 ms 级),差异在功能范围和学习曲线。
不写代码也能用 Scrapling 吗?
直接用——不行。Scrapling 是 Python 库,需要写代码。但 Scraaping 装了一个CLI(命令行界面)(装 scrapling[shell] 之后),可以直接在终端敲命令抓一页存成文件,不写代码也能跑。命令形如 scrapling extract get 'https://example.com' out.md。够用与否取决于你的复杂度。
Scrapling 的「自适应」能 100% 找回改版后的元素吗?
不能。它的判据是相似度——三个层级(标签结构 / 文本内容 / 位置)只要有一个对得上就能找回来。整页结构重排、所有「看起来像价格」的元素都被改——它救不回来。§07 有完整边界清单。把它当「急救药」,不当「免检牌」。
爬电商网站会被封号吗?
多数电商站点的 ToS 明确禁止自动化访问,技术上能爬≠可以爬。「被封」不是最糟的结果——被起诉违约或违反《数据安全法》才是。想拿电商数据:① 看对方是否提供官方 API(很多大平台都有);② 谈商业合作拿授权;③ 用合规的第三方数据服务。§09 是这一题的完整答案。
Scrapling 和 Playwright 怎么选?
两者重叠但不完全等同。Playwright 是个浏览器自动化库——能模拟人点击、输入、滚动,适合做 UI 测试、交互式爬虫、需要登录的场景。Scrapling 的 DynamicFetcher 在 Playwright 之上、主要用它的「启动浏览器并读渲染后的 HTML」这一项。如果你要的是「纯爬、不交互」,Scrapling 更顺手;如果你要的是「模拟人操作浏览器」,直接用 Playwright。
装好之后报错 ModuleNotFoundError,怎么排?
三步:① 看报错里的模块名——是 scrapling.fetchers 还是 scrapling.parser?前者说明只装了基础包,要 pip install "scrapling[fetchers]";② 装好 extras 之后又报 Executable doesn't exist at ...——浏览器没下,要 scrapling install;③ 都装好还报——检查 Python 版本,低于 3.10 装不上当前版 Scrapling。§04 完整流程。
有没有 GUI(图形界面)?
没有。Scrapling 是 Python 库,所有操作通过代码或命令行。「不会写代码也能爬」这件事,主流解法是用现成的桌面工具(如 Octoparse、ParseHub)——它们在功能上不如 Scrapling 灵活,但完全不需要写代码。选哪个取决于你愿不愿意学 Python。

98来源与证据边界

这篇里凡是「现在是多少」「当前叫什么」「谁说的」的判断,都来自下面这些页面,核对日期统一为 2026-09-30。

官方文档与官方数据(一手)

独立来源(不是厂商自述)

本文自己做的核对(不是转述)

📖 证据边界与时效说明

时效:这篇属于「演进型」——架构与判断不容易过时,但版本号、API 细节、benchmark 数字都在变。本文校对日期为 2026-09-30,所有版本号、性能数据、行为描述均为当日实测。用之前请以当期页面为准,尤其是 §04 的安装命令、§06 的 Fetcher API、§07 的自适应机制描述。

三处口径说明,避免你把数字读大:
① benchmark 数字(§03)只是同一个解析任务的耗时对比,不代表「爬整站时整体快 785 倍」——网络、磁盘、JS 渲染在真实场景里的开销远超解析器本身。
② 「自适应能找回改版后的元素」(§07)只在「改版幅度小」时成立。整页结构重排它救不回来。
③ 「StealthyFetcher 能过 Cloudflare」 是它目前的能力——反爬系统在持续升级、Cloudflare 自己也会加新验证。它不构成「任何时候都能过」的承诺。

一处本文没有核实、因此没有展开的:Scrapling 文档里提到的「The Web Scraping Club 2025-11 评测」。本文没有去核实那篇评测的具体结论,所以正文里不作为选型依据出现——只知道「有一个第三方评测提到它」即可,真要引用请自己查当期页面。

一个已知的判断分歧:关于「爬公开数据是否合法」,美国 hiQ v. LinkedIn 案判 hiQ 胜诉(公开数据不构成未授权访问),但 ToS 是否违反是另一个独立问题,且不同司法辖区结论可能不同。本文取了「公开 + 不绕登录 = 相对安全方向,但绝不等于自动合法」的中间立场,具体场景请结合本地法律与目标站 ToS 判断。

99一句话总结

🎯 核心要点

Scrapling 是一个 Python 写的爬虫工具集:一个比 BeautifulSoup 快几百倍的解析器 + 三个能应付不同环境的 Fetcher + 一个「网站改版后能自己找回元素」的自适应选择器 + 一个能整站爬的 Spider。它的位置是「BS4 太弱、Scrapy 太重」中间那一档。

它值得选的情况是三件事里有两件成立:① 要 JS 渲染、② 要对付反爬、③ 要长期维护同一批页面。三件事全不成立——用 BeautifulSoup + requests,轻且熟。

对你这种不写代码、靠 AI 推进项目的角色,它最实在的价值不是「更快」——是「让你能问出有明确答案的问题」:装哪个版本、用哪个 Fetcher、有没有跑 auto_save=True、目标站 ToS 和 robots.txt 长什么样。§11 末尾那四句验收话就是为这件事准备的。

最后一条也是最容易忘的:技术能爬到≠可以爬。§09 的三条线(法律 / ToS / robots.txt)任何一条卡住,爬得越快越麻烦。

留给你自己验的那一条

前面所有内容你都可以在文章里找到答案,只有这一条不行——它需要你自己的场景。请做一次:

拿你手上某个半途停下的项目,用 §11 的「该不该用四问」过一遍,然后写出你自己的那四行答案。例如:「我要抓的是某电商的商品价格——公开页面、没登录 → ① 成立;但 ToS 明确禁止自动化访问 → ① 其实不成立 → 停下来换 API」或者:「我要抓的是公司内部 wiki——ToS 没禁止、静态 HTML、不被反爬挡 → ①②③ 全不成立 → BeautifulSoup 就够,不用上 Scrapling」。

如果你写完发现某一条卡住了(比如 ToS 那一栏卡住、不知道算不算「禁止自动化」),那个卡住的地方就是你下一个动作——而不是再去读一篇爬虫教程。

⌂