Scrapling 完全指南:从单请求抓取到自适应大规模爬虫的 Python 框架
本文以 Scrapling 官方文档入口(docs/index.md)为主体,系统梳理这一"自适应 Web 抓取框架"的三大核心能力——学习型解析器、抗反爬 Fetcher 体系与 Scrapy 风格 Spider 框架,并结合仓库源码补充安装分层、adaptive 机制的底层实现与调用链,帮助读者在 30 分钟内建立起可落地的完整使用路径。
一、框架定位:一条库覆盖"从单请求到全站爬取"
Scrapling 的官方定位是一个自适应 Web 抓取框架(adaptive Web Scraping framework),设计目标是让同一套库覆盖从"抓一个页面"到"全站并发爬取"的所有规模。文档首页给出的三句话概括了它的核心差异化:
- 解析器会"学习"网站变化:当目标页面改版后,Scrapling 能自动重新定位你之前保存过的元素,而不是让选择器失效;
- Fetcher 开箱即用地绕过反爬:内置对 Cloudflare Turnstile / Interstitial 的自动化绕过能力;
- Spider 框架负责规模化:支持并发、多会话爬取、断点续传(pause/resume)与自动代理轮换。
官方文档给出的最简示例展示了"抓取 → 解析 → 自适应复定位"的完整闭环:
from scrapling.fetchers import Fetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # 隐身抓取
products = page.css('.product', auto_save=True) # 首次抓取时保存元素数据
products = page.css('.product', adaptive=True) # 网站改版后,用 adaptive=True 重新找到它们
而放大到全站爬取时,代码形态与 Scrapy 高度相似:
from scrapling.spiders import Spider, Response
class MySpider(Spider):
name = "demo"
start_urls = ["https://example.com/"]
async def parse(self, response: Response):
for item in response.css('.product'):
yield {"title": item.css('h2::text').get()}
MySpider().start()
这个"类 Scrapy API"的设计贯穿整个 Spider 框架,对已有 Scrapy 经验的开发者几乎是零迁移成本。
二、安装与环境:分层依赖是理解 Scrapling 的第一把钥匙
Scrapling 要求 Python 3.10 或更高版本(pyproject.toml 中 requires-python = ">=3.10",classifiers 覆盖到 3.13),基础安装只包含解析引擎:
pip install scrapling
这里有一个必须注意的分层依赖设计:基础安装只装了解析器(parser)及其依赖,不包含任何 fetcher 或命令行依赖。也就是说,仅执行 pip install scrapling 后,from scrapling.fetchers import ... 或 from scrapling.spiders import ... 都会抛出 ModuleNotFoundError。这一点在源码结构上可以印证:scrapling/fetchers/init.py 采用惰性导入(__getattr__ + _LAZY_IMPORTS 映射),只有 fetcher 第三方依赖(curl_cffi、playwright 等)存在时才能真正加载。
基础依赖在 pyproject.toml 中声明为 lxml、cssselect、orjson、tld、w3lib、typing_extensions——这解释了为什么"纯解析"场景下 Scrapling 依然轻量。
2.1 按需安装 Fetcher 依赖
如果要用 Fetcher/StealthyFetcher/DynamicFetcher 或任何 Spider,需要额外安装 fetcher 依赖并下载浏览器:
pip install "scrapling[fetchers]"
scrapling install # 常规安装(下载浏览器及系统依赖、指纹操纵依赖)
scrapling install --force # 强制重新安装
也可以不走命令行,直接在代码中触发安装:
from scrapling.cli import install
install([], standalone_mode=False) # 常规安装
install(["--force"], standalone_mode=False) # 强制重装
从 pyproject.toml 的可选依赖声明看,fetchers 这一 extras 实际拉取了 curl_cffi(TLS 指纹伪造)、playwright(Chromium 自动化)、patchright(反检测的 Playwright 分支)、browserforge 与 apify-fingerprint-datapoints(浏览器指纹生成)、protego(robots.txt 解析)等——这也解释了为什么浏览器指纹伪造能力需要单独的 scrapling install 步骤。
2.2 其他可选功能与 Docker
| 功能 | 安装命令 | 对应源码入口 |
|---|---|---|
| MCP Server(AI 集成) | pip install "scrapling[ai]" |
命令行入口 scrapling-mcp |
交互式 Shell 与 extract 命令 |
pip install "scrapling[shell]" |
scrapling/core/shell.py |
| 全部功能 | pip install "scrapling[all]" |
等价于 [ai,shell] |
| 免安装镜像 | docker pull pyd4vinci/scrapling 或 docker pull ghcr.io/d4vinci/scrapling:latest |
Dockerfile |
Docker 镜像包含全部 extras 和所有浏览器,由 GitHub Actions 基于 main 分支自动构建推送,免去本地装浏览器的折腾。
三、Fetcher 体系:三类抓取器 + 会话 + 反爬工具箱
3.1 三个 Fetcher 与对应会话类
scrapling.fetchers 包通过 scrapling/fetchers/init.py 的惰性导入对外暴露 10 个类,按"抓取方式 × 同步/异步"组织:
| 能力 | 无状态抓取器 | 有状态会话类 | 底层实现 |
|---|---|---|---|
| 快速隐身 HTTP 请求(可伪造浏览器 TLS 指纹、请求头,支持 HTTP/3) | Fetcher / AsyncFetcher |
FetcherSession |
scrapling/fetchers/requests.py |
| 完整浏览器自动化(Playwright Chromium 与 Google Chrome) | DynamicFetcher |
DynamicSession / AsyncDynamicSession |
scrapling/fetchers/chrome.py |
| 高级隐身(指纹欺骗,绕过 Cloudflare Turnstile/Interstitial) | StealthyFetcher |
StealthySession / AsyncStealthySession |
scrapling/fetchers/stealth_chrome.py |
ProxyRotator 也从这个包直接导出,可用于所有会话类型。选择哪个 Fetcher 的完整决策指南见 docs/fetching/choosing.md,静态、动态、隐身三类分别有 docs/fetching/static.md、docs/fetching/dynamic.md、docs/fetching/stealthy.md 专题文档。
3.2 文档首页列出的进阶能力
除了三类 Fetcher,首页还罗列了一组实用特性,均落在 scrapling/engines 目录的工具带中:
- 代理轮换:内置
ProxyRotator支持循环(cyclic)或自定义策略,跨所有会话类型生效,且支持按请求覆盖代理(实现见 scrapling/engines/toolbelt/proxy_rotation.py); - 域名与广告拦截:可阻断对特定域名(含子域)的请求,或在浏览器型 Fetcher 中启用内置广告拦截(约 3,500 个已知广告/追踪域名,域表见 scrapling/engines/toolbelt/ad_domains.py);
- 防 DNS 泄漏:可选 DNS-over-HTTPS,将 DNS 查询路由至 Cloudflare DoH,避免使用代理时 DNS 泄漏;
- 远程浏览器:通过
cdp_url用 CDP 连接已运行的浏览器(本机、他机或托管浏览器服务均可),也可用executable_path指向自建的 Chromium; - 后台 API 捕获:给
capture_xhr传入 URL 模式,页面加载期间所有匹配的 XHR/fetch 响应会作为Response对象收集进response.captured_xhr——无需逆向请求即可拿到网站的 API 数据; - 完整异步支持:所有 Fetcher 与对应的异步会话类。
3.3 adaptive 类属性到底做了什么
首页示例中 StealthyFetcher.adaptive = True 这行容易被忽视,但它正是"自适应抓取"的总开关。从源码看:
- 该属性定义在 Fetcher 基类的配置模型中(scrapling/engines/toolbelt/custom.py 中
adaptive: Optional[bool] = False),Fetcher 将其传递给构造出的 Response; - 只有当它被开启时,
page.css(selector, auto_save=True)才会真正把命中元素的"结构指纹"持久化保存下来。若未开启,css()会明确告警 "auto_savewill be ignored becauseadaptivewasn't enabled on initialization"(见 scrapling/parser.py 中xpath方法的守卫逻辑,约 L658-L686)。
3.4 css()/xpath() 的自适应参数详解
scrapling/parser.py 中 Selector.css()(L566-L624)与 Selector.xpath()(L626 起)接受四个与自适应相关的参数,这是官方文档 docs/parsing/adaptive.md 的源码级注脚:
| 参数 | 默认值 | 作用 |
|---|---|---|
adaptive |
False |
若该选择器此前保存过,则尝试在新页面上重新定位元素 |
auto_save |
False |
自动保存本次命中的元素,供后续 adaptive 复定位使用 |
identifier |
"" |
保存/检索时使用的标识符;不传则用选择器本身。官方建议计划日后更换选择器时务必显式指定 |
percentage |
40 |
复定位时的最低相似度百分比阈值。注意:相似度计算只依赖页面结构,非必要时不要随意调低 |
复定位的核心算法在 relocate() 中(scrapling/parser.py L540-L564 附近):遍历页面上所有元素,逐一与保存的元素数据计算相似度得分,即使出现 100% 的匹配也不提前停止(因为可能还有其他同分元素),最后取最高分档——只有最高分 ≥ percentage 才返回结果,否则发出告警提示"可以调低 percentage"。这解释了为什么 auto_save 是一次性动作、而 adaptive=True 可以反复使用。
此外 css() 的实现细节值得一提:Scrapling 将 CSS 选择器先翻译为 XPath 再交给 lxml 执行(_css_to_xpath),并且支持 ::text、::attr() 等 Scrapy/Parsel 风格的伪元素,这对从 BeautifulSoup/Scrapy 迁移的用户是无缝的(迁移指南见 docs/tutorials/migrating_from_beautifulsoup.md)。
四、Spider 框架:Scrapy 式 API 的全功能爬取引擎
Spider 框架是 Scrapling 从"抓取库"升级为"爬取框架"的关键,源码位于 scrapling/spiders/ 目录(engine.py、scheduler.py、session.py、checkpoint.py、throttle.py 等模块各司其职),专题文档从 docs/spiders/getting-started.md 开始,架构与请求/响应模型分别在 docs/spiders/architecture.md 和 docs/spiders/requests-responses.md。
首页对 Spider 特性的完整清单(原文档逐条继承)如下,每条都值得展开:
- 类 Scrapy 的 Spider API:用
start_urls、异步parse回调、Request/Response对象定义爬虫; - 并发爬取:可配置的并发上限、按域限速(per-domain throttling)与下载延迟(限速实现见 scrapling/spiders/throttle.py);
- 多会话支持:在同一个 Spider 里统一使用 HTTP 请求与隐身无头浏览器,按会话 ID 把请求路由到不同会话(会话管理见 scrapling/spiders/session.py);
- 暂停与续爬:基于检查点的爬取持久化——
Ctrl+C优雅退出,重启后从上次中断处继续(实现见 scrapling/spiders/checkpoint.py); - 流式模式:
async for item in spider.stream()实时消费抓取项并伴随实时统计,适合 UI、数据管道与长时爬取; - 被封检测:自动检测被阻断的请求并重试,检测逻辑可自定义;
- AutoThrottle:Spider 根据网站响应速度自行调节每个域名的延迟;一旦网站开始封禁/限流就加倍延迟(或遵循
Retry-After),压力解除后再提速——不再靠拍脑袋设 delay; - Robots.txt 合规:可选
robots_txt_obey标志,遵循Disallow、Crawl-delay、Request-rate指令并按域缓存(解析器 scrapling/spiders/robotstxt.py); - 开发模式:首次运行把响应缓存到磁盘,后续运行直接回放——迭代
parse()逻辑时不再重复轰炸目标服务器; - 现成 Spider 模板(scrapling/spiders/templates/):
CrawlSpider:基于规则的链接跟随;SitemapSpider:由 sitemap/robots.txt 驱动的爬取;XMLFeedSpider/CSVFeedSpider:迭代 XML/RSS 与 CSV 数据源;ShopifySpider:通过 JSON API 抽取任意 Shopify 商店的全部商品,每个 variant 一条数据;
- 链接提取:独立原语
LinkExtractor支持 allow/deny 模式、域名过滤、CSS/XPath 作用域限定、扩展名过滤与 URL 规范化,可嵌在模板内也可独立使用(scrapling/spiders/links.py); - 内置导出:
result.items.to_json()、to_jsonl()、to_csv()、to_xml()四合一导出,或经由 hook 接自己的管道。
代理轮换、广告拦截、封锁应对等专题另有 docs/spiders/proxy-blocking.md 与 docs/api-reference/proxy-rotation.md。
五、自适应解析与 AI 集成
"Adaptive Scraping & AI Integration" 是首页单列的一节,包含四个能力:
- 智能元素追踪:网站改版后基于相似度算法重新定位元素——即第三节 3.3/3.4 节所述的
auto_save/adaptive机制; - 灵活的智能选择:CSS、XPath、基于属性过滤的搜索、文本搜索、正则搜索等多种选择方式(选择方法大全见 docs/parsing/selection.md);
- 相似元素查找:
find_similar一族方法自动定位与已找到元素相似的元素(高级用法测试见 tests/parser/test_find_similar_advanced.py); - 内置 MCP Server:面向 AI(Claude/Cursor 等)的 AI 辅助抓取与数据提取服务。它的特点是"先提取、后喂给 AI"——利用 Scrapling 在传给模型前就把目标内容抽取出来,从而减少 token 消耗、加快操作;此外还支持跨多次调用保持浏览器会话、页面截图、经 CDP 驱动远程浏览器。安装方式为
pip install "scrapling[ai]",命令入口scrapling-mcp(在 pyproject.toml 的[project.scripts]中注册),使用文档见 docs/ai/mcp-server.md; - Agent Skill:仓库内置可安装的 Agent Skill(agent-skill/Scrapling-Skill/SKILL.md),把整套库的 API 教给编程 Agent,使其生成的 Scrapling 代码符合当前 API 而非凭猜测。该目录还按"抓取方式/解析/Spider/集成"组织了成体系的参考文档,例如 agent-skill/Scrapling-Skill/references/fetching/choosing.md 与 agent-skill/Scrapling-Skill/references/parsing/adaptive.md。
六、性能、工程质量与开发者体验
首页"High-Performance & battle-tested Architecture"一节的原话承诺包括:优化后的高性能、面向最小内存占用的优化数据结构与懒加载、比标准库快 10 倍的 JSON 序列化(依赖 orjson,可在 pyproject.toml 基础依赖中确认)、92% 测试覆盖率与全量类型提示。这些属于文档宣称,测试规模可由仓库佐证:tests/ 下覆盖 parser、fetchers(同步/异步/会话)、spiders、CLI、AI MCP 等各层模块,且 scrapling/py.typed 标记表明整个包带类型信息,[tool.mypy]/[tool.pyright] 配置(pyproject.toml)显示每次变更都过 PyRight 与 MyPy 扫描。
对 Web 爬虫/开发者的友好特性还包括:
- 交互式抓取 Shell:基于 IPython 的内置 Shell(
pip install "scrapling[shell]"),带快捷键与工具,如把 curl 命令转换为 Scrapling 请求、在浏览器中查看请求结果(docs/cli/interactive-shell.md); - 纯终端抓取:可以不写一行代码直接在终端抓 URL(docs/cli/overview.md、docs/cli/extract-commands.md);
- 富导航 API:父/兄弟/子节点的高级 DOM 遍历;
- 增强的文本处理:内置正则、清理方法与优化的字符串操作;
- 自动生成选择器:为任意元素生成稳健的 CSS/XPath 选择器;
- 类 Scrapy/BeautifulSoup 的 API:沿用 Scrapy/Parsel 的伪元素习惯;
- Scrapy 即插即用集成:给 Scrapy 回调加
@scrapling_response(adaptive=True)装饰器,即可用 Scrapling 解析器解析 Scrapy 已抓到的响应,无需重写(集成实现见 scrapling/integrations/scrapy.py,指南见 docs/integrations/scrapy.md); - 就绪的 Docker 镜像:每次发布自动构建并推送含全部浏览器的镜像。
七、文档组织与延伸阅读
官方文档遵循 Diátaxis 文档框架组织,按"教程/操作指南/参考"分层。与本文相关的入口导航:
- 选择哪个 Fetcher:docs/fetching/choosing.md
- 解析器三大类与选择方式:docs/parsing/main_classes.md、docs/parsing/selection.md、docs/parsing/adaptive.md
- Spider 入门与架构:docs/spiders/getting-started.md、docs/spiders/architecture.md、docs/spiders/sessions.md
- CLI 与 Shell:docs/cli/overview.md
- MCP Server:docs/ai/mcp-server.md
- API 参考:docs/api-reference/(fetchers、selector、response、proxy-rotation、spiders 等)
- 项目元信息:BSD-3 许可证(LICENSE),作者 Karim Shoair,当前版本 0.4.13(pyproject.toml)。
小结:Scrapling 的价值主张可以浓缩为一条主线——Fetcher/StealthyFetcher/DynamicFetcher 负责把页面拿下来(含 TLS 指纹、隐身浏览器、代理轮换、XHR 捕获),Selector 的 css(auto_save=True) + adaptive=True 负责让选择器"活"过网站改版,Spider 则把两者编排成带断点续传、AutoThrottle 与流式输出的工业级爬取。安装上牢记"基础包只含解析器、fetcher 依赖需 [fetchers] extras 加 scrapling install"这一分层,即可按上文各节路径在当前仓库中深入源码继续学习。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
