首页
/ Scrapling 完全指南:从单请求抓取到自适应大规模爬虫的 Python 框架

Scrapling 完全指南:从单请求抓取到自适应大规模爬虫的 Python 框架

2026-09-04 16:15:35作者:柏廷章Berta

本文以 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.tomlrequires-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 中声明为 lxmlcssselectorjsontldw3libtyping_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 分支)、browserforgeapify-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/scraplingdocker 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.mddocs/fetching/dynamic.mddocs/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.pyadaptive: Optional[bool] = False),Fetcher 将其传递给构造出的 Response;
  • 只有当它被开启时,page.css(selector, auto_save=True) 才会真正把命中元素的"结构指纹"持久化保存下来。若未开启,css() 会明确告警 "auto_save will be ignored because adaptive wasn't enabled on initialization"(见 scrapling/parser.pyxpath 方法的守卫逻辑,约 L658-L686)。

3.4 css()/xpath() 的自适应参数详解

scrapling/parser.pySelector.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.pyscheduler.pysession.pycheckpoint.pythrottle.py 等模块各司其职),专题文档从 docs/spiders/getting-started.md 开始,架构与请求/响应模型分别在 docs/spiders/architecture.mddocs/spiders/requests-responses.md

Scrapling Spider 框架架构图

首页对 Spider 特性的完整清单(原文档逐条继承)如下,每条都值得展开:

  1. 类 Scrapy 的 Spider API:用 start_urls、异步 parse 回调、Request/Response 对象定义爬虫;
  2. 并发爬取:可配置的并发上限、按域限速(per-domain throttling)与下载延迟(限速实现见 scrapling/spiders/throttle.py);
  3. 多会话支持:在同一个 Spider 里统一使用 HTTP 请求与隐身无头浏览器,按会话 ID 把请求路由到不同会话(会话管理见 scrapling/spiders/session.py);
  4. 暂停与续爬:基于检查点的爬取持久化——Ctrl+C 优雅退出,重启后从上次中断处继续(实现见 scrapling/spiders/checkpoint.py);
  5. 流式模式async for item in spider.stream() 实时消费抓取项并伴随实时统计,适合 UI、数据管道与长时爬取;
  6. 被封检测:自动检测被阻断的请求并重试,检测逻辑可自定义;
  7. AutoThrottle:Spider 根据网站响应速度自行调节每个域名的延迟;一旦网站开始封禁/限流就加倍延迟(或遵循 Retry-After),压力解除后再提速——不再靠拍脑袋设 delay;
  8. Robots.txt 合规:可选 robots_txt_obey 标志,遵循 DisallowCrawl-delayRequest-rate 指令并按域缓存(解析器 scrapling/spiders/robotstxt.py);
  9. 开发模式:首次运行把响应缓存到磁盘,后续运行直接回放——迭代 parse() 逻辑时不再重复轰炸目标服务器;
  10. 现成 Spider 模板scrapling/spiders/templates/):
    • CrawlSpider:基于规则的链接跟随;
    • SitemapSpider:由 sitemap/robots.txt 驱动的爬取;
    • XMLFeedSpider / CSVFeedSpider:迭代 XML/RSS 与 CSV 数据源;
    • ShopifySpider:通过 JSON API 抽取任意 Shopify 商店的全部商品,每个 variant 一条数据;
  11. 链接提取:独立原语 LinkExtractor 支持 allow/deny 模式、域名过滤、CSS/XPath 作用域限定、扩展名过滤与 URL 规范化,可嵌在模板内也可独立使用(scrapling/spiders/links.py);
  12. 内置导出result.items.to_json()to_jsonl()to_csv()to_xml() 四合一导出,或经由 hook 接自己的管道。

代理轮换、广告拦截、封锁应对等专题另有 docs/spiders/proxy-blocking.mddocs/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.mdagent-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.mddocs/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 文档框架组织,按"教程/操作指南/参考"分层。与本文相关的入口导航:

小结:Scrapling 的价值主张可以浓缩为一条主线——Fetcher/StealthyFetcher/DynamicFetcher 负责把页面拿下来(含 TLS 指纹、隐身浏览器、代理轮换、XHR 捕获),Selectorcss(auto_save=True) + adaptive=True 负责让选择器"活"过网站改版,Spider 则把两者编排成带断点续传、AutoThrottle 与流式输出的工业级爬取。安装上牢记"基础包只含解析器、fetcher 依赖需 [fetchers] extras 加 scrapling install"这一分层,即可按上文各节路径在当前仓库中深入源码继续学习。

登录后查看全文
热门项目推荐
相关项目推荐