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
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)。
关键数字(先有个量级感)
Fetcher(最轻)、StealthyFetcher(绕过 Cloudflare 等反爬)、DynamicFetcher(跑一个真浏览器,能看 JS 渲染)。§06 给决策树pip install 到第一次抓回东西」的真实耗时——前提是 Python 环境已经装好且不带坑如果你只有半小时:按你的处境直接跳
| 你现在的状态 | 直接看这里 | 为什么 |
|---|---|---|
| 完全没碰过爬虫,先想知道它是什么 | 01 它是什么 → 03 选型地图 | 不搞清楚它和 BS4/Scrapy 的关系,后面每一个判断都会偏 |
| 已经在用 BeautifulSoup,但爬虫老挂 | 02 它解决什么 → 07 自适应 | 「老挂」通常是选择器失效或被反爬挡了——这两件事正是 Scrapling 的卖点 |
| 要在几个工具里选一个 | 03 选型地图 | 一张表把四个工具的位置摆齐 |
| 已经决定用 Scrapling,今天就想跑通 | 04 装好 → 05 最小例子 | 十分钟装好、十分钟跑通第一条 |
| 工程师在用 Scrapling,需要替他把关 | 06 三个 Fetcher + 09 法律与 ToS | 前者决定能不能爬到,后者决定能不能做 |
| 看完一篇要决定要不要上项目 | 11 一页纸 | 里面有「该不该用」四问,能直接拿去对照你的项目 |
网上的 Scrapling 入门文章几乎都写给「会写 Python 的人」:默认你懂 CSS 选择器、懂异步、懂 HTTP。这篇的起点不一样——它假设你懂行业、不写代码,手上可能已经有几个半途停下的项目,正在判断「AI 建议我用 Scrapling,这话能不能信」。所以它把重点放在三样别处不容易凑齐的东西上:四个工具(BS4 / Scrapy / Playwright / Scrapling)的位置与权衡、「自适应」到底是黑魔法还是一组合法的相似度算法,以及一篇爬虫教程通常不会写、但一定会卡你的法律与服务条款现实。
01它是什么:名字像 Scrapy,但完全是另一件事
第一件事必须先破掉一个错想:看到名字里有「scrap」就以为是 Scrapy。它不是。
Scrapling ≠ Scrapy,看名字也想得到
2008 年开始的整站爬虫框架:你给它一批起始地址,它自己管理请求队列、限速、去重、持久化,把整站抓回来。PyPI 上目前累计下载量过亿。它的强项是「几百上千万页面」级别的大工程;代价是学习曲线陡,配置一大堆。[3]
2024-10 才出现的轻量爬虫工具集:主打解析器比 BeautifulSoup 快几百倍、自带反爬绕过的 Fetcher、以及「网站改版后能自己找回元素」的自适应选择器。它不做「整站流水线」那种工业级框架,而是把「抓页面 + 找元素 + 改版存活」三件事做精。[1][2]
它俩的关系更接近「重型卡车」和「越野自行车」:都能送东西,但场景不同。需要抓一两百页、且页面老改版、且可能被反爬挡——这是 Scrapling 的地盘;要稳定抓百万级页面、配齐工程化流水线——选 Scrapy 更稳。
它不是这四样东西
它能调用浏览器(通过 DynamicFetcher),但它本身不是浏览器。它是一段 Python 代码在跑的进程。你看到「真浏览器」是因为它替你启动了一个无头浏览器(headless browser——一种没有可视窗口的浏览器模式)。
它里面有一项 AI 集成(scrapling[ai] 装的是 MCP server——一种让 AI 助手能直接调用它的协议),但它本身不靠大模型工作。解析页面用的是确定性的选择器与相似度算法,没有「让 AI 自己猜」。
它的 StealthyFetcher 在很多 Cloudflare 验证前能过,但反爬系统在持续升级;它官网原话是「handling Cloudflare Turnstile/Interstitial with automation」,「with automation」三个字要读出来——自动化通过≠所有情况都通过。[1]
那它是什么:一句话定义
Scrapling 是一个 Python 写的「爬虫工具集」:一个比 BeautifulSoup 快几百倍的解析器(解析器=从网页 HTML 里把你要的元素挑出来的程序),加上三个能应对不同网络环境的 Fetcher(请求页面并把内容拿回来的组件),加一个能整站爬的 Spider,加一个「网站改版后能自己找回元素」的自适应选择器。它不是框架——你用它的方式更接近「一个超强的第三方库」,而不是「一套要遵守的项目结构」。
这句话里有四个词要拆开——拆完就没有生词了。
「解析器」是什么,为什么「比 BS4 快 785 倍」听着像吹牛
解析器的工作很简单:你给它一份网页 HTML(也就是浏览器「右键 → 查看源代码」看到的那一长串带尖括号的文字),它帮你把里面的「标题」「价格」「链接」这种结构化信息挑出来。BeautifulSoup 是这个领域二十年的老前辈,几乎所有 Python 爬虫教程都从它开始。Scrapling 的解析器叫 Adaptor,基于 Cython(一种把 Python 翻译成 C 代码以提升速度的工具)实现,所以同一份任务能快几百倍——这不是营销话术,是算法复杂度加底层语言的差距。
但快不等于「你应该用 Scrapling 替换 BS4」。如果你只爬一两个页面、偶尔用一次,BS4 慢几十毫秒你根本感觉不到;差距在你爬的页面多、改版频繁时才有意义。§03 的选型地图会告诉你什么时候这点速度值得换。
「Fetcher」是什么,为什么会有三个
解析器只负责「拿到 HTML 之后怎么办」。「怎么把 HTML 拿回来」是 Fetcher 的事。同一个网站,你可以用三种姿势去拿——
Fetcher:发一个普通的网络请求(就像浏览器地址栏敲回车一样轻)。快、轻、不伪装,但碰到反爬墙就跪。StealthyFetcher:在请求里伪装成真实浏览器(改请求头里的指纹信息),能绕过大部分 Cloudflare 之类的拦截。DynamicFetcher:真的启动一个浏览器(Playwright 控制的 Chromium),等 JavaScript 把页面渲染好再读。慢、重,但能拿到「人眼看到」的版本。
三个怎么挑,§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 |
|---|---|---|
| Scrapling | 1.99 ms | 1× |
| 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 的速查表
| 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)} 条')
三步判断法:① 在浏览器里打开页面,按 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()
这段代码在做什么
- 定义一个 Spider 类:给它一个名字(
"quotes")、一组起始 URL(start_urls)。 - 写
parse方法:每抓到一个页面,Scrapling 就把页面塞给这个方法,让它处理。「async def」表示这个方法是异步的(不阻塞、可以并发执行)——这是 Scrapling 默认的写法,因为整站爬虫要并发很多请求。 yield {...}:每条抓到的数据作为一个字典(字典=「键-值」配对的数据结构,类似 Excel 的两列)扔出来——Scrapling 会自动收集这些。response.follow(...):告诉 Scrapling「这个链接也值得追」,然后用self.parse去处理下一页。QuoteSpider().start():启动爬虫。
几个 Spider 内置的好东西
| 特性 | 它做什么 | 什么时候用 |
|---|---|---|
| 并发请求 | 一次发 N 个请求,速度快几倍 | 目标站能承受并发时(先慢一点试) |
| 每个域单独限速 | 对同一个域名自动放慢 | 永远开着——除非你明确知道目标站鼓励并发 |
| 暂停 / 续跑 | Ctrl+C 保存进度,下次启动接着爬 | 整站几十万页、要分几次跑完时 |
AutoThrottle | 按目标站响应速度自动调节请求间隔 | 不知道目标站能承受多快时——让它自动学 |
| 导出 JSON / JSONL / CSV(三种常见数据格式,Excel / Pandas 都能直接读) | 直接存成对应格式 | 默认开启,不必自己写存储代码 |
09不能不讲的现实:法律、ToS、robots.txt
这一节是大多数爬虫教程不会写的一节。但它恰恰是你这种角色最该看的一节——因为工程师会埋头实现、不会主动停下去看 ToS,而「能爬到」和「可以爬」是两件完全不同的事。
三条硬线,任意一条卡住就别爬
| 线 | 它说什么 | 怎么查 | 卡住之后怎么办 |
|---|---|---|---|
| 当地法律 | 个人数据、版权、未授权访问 | 看你所在地与目标站所在地的法规。欧盟有 GDPR(通用数据保护条例,对个人数据的收集、存储、使用有严格要求),中国有《个人信息保护法》《数据安全法》 | 涉及个人数据、超过合理使用范围——停下来找律师,别靠 AI 替你判断 |
| 目标站服务条款(ToS) | 网站白纸黑字写明「禁止爬取」「禁止商用」「需授权」 | 翻到网站底部的「Terms of Service」「服务条款」「Legal」链接 | ToS 明确禁止——即使技术上能爬到,也不该爬 |
| robots.txt | 网站主告诉爬虫「哪些路径别来」的礼貌协议 | 访问 https://目标站/robots.txt | 遵守 Disallow:,把 Crawl-delay 当成建议下限 |
三条线的优先级
当三条线冲突时,法律 > ToS > robots.txt。
- 法律管最严:它不管网站怎么写,只要你做的事触犯当地法规就违法
- ToS 是合同:违反 ToS 不一定违法,但网站可以起诉你违约、封你账号、追究民事赔偿
- robots.txt 是礼貌:不守是「不礼貌」、不一定违法,但被业界视为「恶意爬虫」的标志
哪些情况基本不用担心的「白名单」
下面这些场景通常风险较低,但仍不构成「自动合法」的依据——你得自己确认每一条:
- 目标站公开、不需要登录,且没有「禁止爬取」声明
- 你爬的是事实性数据(价格、天气、公开统计),不是受版权保护的内容(歌词、长文章全文)
- 你不存个人数据——姓名、邮箱、手机号、住址这些
- 你的请求频率不高——单站每秒不超过 1 次是常见「友好」上限
- 你给目标站留个联系方式,出问题对方能找到你
哪些情况「建议停下来」
- 需要登录才能访问的内容(你绕过了认证 = 多数 ToS 视为「未授权访问」)
- 抓的是别人的用户数据(评论、帖子、个人主页)
- 把抓来的数据整站镜像、再发布
- 绕开付费墙、付费内容
- 目标站明确说「禁止爬取 / 禁止自动化访问」
一个真实的判例:hiQ v. LinkedIn(美国 2022)
hiQ 是美国一家公司,靠抓 LinkedIn 公开个人资料做人才分析服务。LinkedIn 起诉 hiQ 违反《计算机欺诈与滥用法》(CFAA)。案子从 2017 年打到 2022 年,最终联邦第九巡回上诉法院判 hiQ 胜诉——理由是 LinkedIn 上的公开数据不构成「未授权访问」。
但这个判例不意味着你可以照抄:
- 它是美国判例,中国大陆、欧盟的法律环境不一样
- 即使胜诉,hiQ 也打了五年官司、烧了几百万律师费
- 判决的核心是「公开数据」,但 ToS 是否违反是另一个独立问题
- 案子到 2026 年还在被各种后续诉讼围绕
所以这个判例给你的结论是:「公开数据 + 不绕登录」是相对安全的方向,但「相对安全」≠「绝对无风险」。把它当参考、当启发,不要把它当成「合法」的保证书。
① 让工程师在动手之前先打开目标站的 ToS + robots.txt,把这两份文件截图发你。这两份文件不是用来「读懂」的,是用来「确认有没有红线」的。
② 如果目标站 ToS 明确说「禁止自动化访问」,哪怕工程师说「能爬到」,也停下来换方案——ToS 是合同,技术绕过它不会让合同失效。
③ 如果项目涉及个人数据、隐私、版权任意一项,别让 AI 替你判断,让律师判断。AI 在法律这一块的可信度是「能引法规名」≠「能判断边界」。
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 Turnstile | Cloudflare 提供的「我不是机器人」验证组件 | 看到它说明这个站被 Cloudflare 保护了。别当唯一能挡爬虫的——它能被自动化绕过 |
| Cookie | 网站写在你浏览器里的小票据,用来记住「你已经登过」 | 登录后的内容靠它维持。爬虫要持续登录得自己管 Cookie。别当账号密码——它只是一个会话标识 |
| Session | 保持同一条网络连接和 Cookie 池的会话 | 同一会话内多次请求更高效。别当「一次访问」——它是「一组访问」 |
| JS 渲染 / JavaScript rendering | 网页内容由浏览器跑完 JavaScript 才显示出来 | 「右键查看源代码」看不到的数据往往是 JS 渲染的。别当所有网页都这样——多数博客、文档还是静态的 |
| 无头浏览器 / headless browser | 没有可视窗口的浏览器模式,跑在后台执行 | DynamicFetcher 启动的就是它。别当「另一个浏览器」——它就是 Chrome,只是没窗口 |
| Playwright | 一个控制浏览器的库,能让 Python 启动、操控 Chromium | Scrapling 的 DynamicFetcher 在它之上。别当替代品——可以单独用,集成在 Scrapling 里更方便 |
| robots.txt | 网站根目录的小文件,告诉爬虫「哪些路径别来」 | 看 https://目标站/robots.txt。别当法律——它是礼貌协议,不守不一定违法,但出事后会被引用 |
| ToS / 服务条款 | 网站白纸黑字写明使用规则 | 违反 ToS 可能被起诉违约。别当「点同意就走」的例行公事——爬虫场景下它是合同 |
| 自适应 / adaptive | 网站改版后,Scrapling 用相似度算法找回元素 | Scrapling 的核心卖点。别当 AI——它是确定性算法,不是猜 |
| Spider | 整站爬虫框架 | Scrapling 的 Spider 借鉴 Scrapy。别当「蜘蛛」或某种动物——它是个抽象概念(蜘蛛在网上爬来爬去) |
| MCP | Model Context Protocol,让 AI 助手能直接调用外部工具的协议 | Scrapling 的 [ai] 装的是 MCP server。别当 AI 模型——它是个通信协议 |
| PyPI | Python 的官方软件仓库 | 装包从这来。别当 Python 的一部分——它是第三方仓库,Python 自带的「标准库」另算 |
| 虚拟环境 / .venv | 给一个项目单独隔离出来的 Python 环境 | 用 pip 装包时必须先有它,否则会污染整台机器 |
13常见问题
scrapling[shell] 之后),可以直接在终端敲命令抓一页存成文件,不写代码也能跑。命令形如 scrapling extract get 'https://example.com' out.md。够用与否取决于你的复杂度。scrapling.fetchers 还是 scrapling.parser?前者说明只装了基础包,要 pip install "scrapling[fetchers]";② 装好 extras 之后又报 Executable doesn't exist at ...——浏览器没下,要 scrapling install;③ 都装好还报——检查 Python 版本,低于 3.10 装不上当前版 Scrapling。§04 完整流程。98来源与证据边界
这篇里凡是「现在是多少」「当前叫什么」「谁说的」的判断,都来自下面这些页面,核对日期统一为 2026-09-30。
官方文档与官方数据(一手)
- github.com/D4Vinci/Scrapling — 仓库 README — 一句话定义、四种 Fetcher、Spider 自适应选择器的官方表述、三种 Fetcher 的最小例子、免责声明(教育研究用途、遵守法律与 ToS)、benchmarks(§00、§02、§03、§05、§06、§07、§08、§09、§10)
- PyPI — scrapling 项目页 — 当前版 0.4.15(2026-08-23 上传)、requires_python ≥ 3.10、许可证 BSD-3-Clause、维护者 Karim Shoair(D4Vinci)、累计 53 个发行版本(§00、§04、§10)
- scrapling.readthedocs.io — 官方文档站 — 安装步骤、Spider 的
robots_txt_obey开关说明、Spider 的 AutoThrottle / 暂停-续跑 / 限速等机制(§08) - README 中的 benchmarks 表 — Scrapling / Parsel / PyQuery / Selectolax / BS4+lxml 在 5,000 个嵌套元素的解析任务上的耗时对比,官方给出 Scrapling 用 1.99 ms(§03、§07)
独立来源(不是厂商自述)
- hiQ Labs v. LinkedIn — 案件背景 — 2017 年起、2022 年第九巡回上诉法院判 hiQ 胜诉的关键事实(公开数据不构成未授权访问)。具体判例文号与法官意见可查 PACER(美国联邦法院文书系统)。这是本文用来校准「公开数据可不可以爬」这条边界的事实参照,不是模板(§09)
本文自己做的核对(不是转述)
- 「53 个版本、从 2024-10-13 起」:本文从 PyPI 的 release history 页逐条列出 v0.1 到 v0.4.15 的发布日期、版本号后得出。复核方式:打开 pypi.org/project/scrapling/#history,看版本列表的起止日期与本文一致。
- 「
pip install scrapling装了一半」:本文按官方文档的安装章节和 PyPI 元数据交叉核对,确认默认pip install不带 fetchers 子模块。复核方式:装基础包后执行python3 -c "from scrapling.fetchers import Fetcher",看到ModuleNotFoundError即确认。 - 「
robots_txt_obey默认不打开」:来自 Spider 的可选参数列表,文档没有把它列进默认行为。这是本文显式标注的「默认行为判断」,建议你用前自己再核一遍文档。 - 「自适应 = 相似度算法的三层判断」:这一段是机制性复述,不是从官方文档抄来的句子。官方仅说「similarity algorithms」,没有公布具体分层细节。本文按 README 行为表现与 GitHub 源码公开部分做出三层归纳,具体实现以仓库为准(§07)。
时效:这篇属于「演进型」——架构与判断不容易过时,但版本号、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 那一栏卡住、不知道算不算「禁止自动化」),那个卡住的地方就是你下一个动作——而不是再去读一篇爬虫教程。