你写好的爬虫三个月后还能用吗读完本文你将了解自适应选择器如何对抗页面改版 | Scrapling 的三层架构设计 | 无感知绕过 Cloudflare 的技术细节 | 它和 Scrapy/Playwright 到底该怎么选 这个项目解决什么问题你有过这种经历吗——花了一下午写好爬虫第二天网站改了个 class 名全白费。或者更惨Cloudflare 的五秒盾卡住一切请求代理池都救不了。Python 爬虫生态不缺工具Scrapy 是全家桶但太重BeautifulSoup 是解析器不是爬虫Playwright 能绕反爬但写起来像在操作浏览器。缺的是一个「聪明」的中间层——既有轻量级 HTTP 请求的速度又能在遇到 Cloudflare 时自动切到隐身浏览器模式既能写 CSS 选择器提取数据又能网站改版后自动找到那些元素。Scrapling 干的就这事儿。58k star、日增 1486 star 不是没道理。 快速上手pipinstallscrapling[fetchers]scraplinginstall安装完就能直接干活。先试个最简单的fromscrapling.fetchersimportFetcher pageFetcher.get(https://quotes.toscrape.com/)quotespage.css(.quote .text::text).getall()print(quotes)看到没API 几乎和 Scrapy 一模一样但不需要创建 Project、写 Spider 类、配置 Pipeline——三行代码拿结果。现在上个硬的。Cloudflare 拦截的网站fromscrapling.fetchersimportStealthyFetcher StealthyFetcher.adaptiveTrue# 开启自适应模式pageStealthyFetcher.fetch(https://nopecha.com/demo/cloudflare,headlessTrue,network_idleTrue)datapage.css(#padded_content a).getall()StealthyFetcher会在后台启动隐身浏览器伪造指纹、解决 Cloudflare Turnstile 挑战拿到页面后自动关浏览器。对调用方来说就是一个函数调用。⚠️踩坑提示StealthyFetcher依赖 Playwright 的 Chromium首次使用需要scrapling install下载浏览器。Docker 用户可以直接用pyd4vinci/scrapling镜像浏览器已预装。如果要爬整站上 Spiderfromscrapling.spidersimportSpider,ResponseclassQuotesSpider(Spider):namequotesstart_urls[https://quotes.toscrape.com/]concurrent_requests10asyncdefparse(self,response:Response):forquoteinresponse.css(.quote):yield{text:quote.css(.text::text).get(),author:quote.css(.author::text).get(),}# 自动翻页next_pageresponse.css(.next a)ifnext_page:yieldresponse.follow(next_page[0].attrib[href])resultQuotesSpider().start()result.items.to_json(quotes.json)# 直接导出 JSON支持 CtrlC 暂停下次运行自动续爬——长任务不用从头再来。⚙️ 技术原理Scrapling 的核心卖点不是「又一个浏览器自动化工具」而是三层引擎 自适应选择器的组合设计。三层 Fetcher 架构纯 HTTP动态页面绕过防火墙用户代码需要哪种 Fetcher?Fetchercurl_cffi 驱动DynamicFetcherPlaywright ChromeStealthyFetcher隐身浏览器 指纹伪造Adaptive Selector自适应选择器层数据结果Fetcher底层用curl_cffi模拟浏览器 TLS 指纹Chrome/Firefox 都能伪装纯 HTTP 请求速度最快DynamicFetcher包装 Playwright Chromium处理 JS 渲染的动态页面StealthyFetcher在 DynamicFetcher 基础上加隐身层——browserforge伪造浏览器指纹 apify-fingerprint-datapoints注入反检测数据三者共享同一个选择器接口切换成本为零。你写.css(.product)不管底层是 curl 发的请求还是隐身浏览器渲染的页面都能用。自适应选择器为什么网站改版了爬虫还能跑这是 Scrapling 最值得讲的设计。传统爬虫靠 CSS 选择器定位元素——.product-price、#main-content。网站一改 HTML 结构选择器就失效。Scrapling 的auto_saveTrue模式在首次选择时保存元素的指纹信息标签名 文本内容 属性键值 DOM 树上下文。下次网站改版后用adaptiveTrue打开自适应模式Scrapling 不再用死选择器去找而是用元素相似度算法在页面上搜索匹配度最高的节点。# 第一遍正常选择 自动保存指纹productsp.css(.product,auto_saveTrue)# 网站改版后自适应模式自动重定位productsp.css(.product,adaptiveTrue)这套机制的核心实现思路是把元素特征向量化标签、文本摘要、CSS 类名分布、父子节点关系构建启发式相似度度量不是逐字节比较 HTML而是语义级匹配基准测试显示 Scrapling 的元素查找速度是 AutoScraper 的 5 倍多2.39ms vs 12.45ms跟竞品对比Scrapy 的自适应方案是 AutoScraper但它依赖手动标注训练样本Scrapling 的auto_save是在你第一次正常抓取时就隐式标注了零额外成本。隐身引擎如何绕过 CloudflareCloudflare Turnstile 是当前最常见的反爬挑战。Scrapling 从三个层面绕过它┌─────────────────────────────────────┐ │ StealthyFetcher │ │ │ │ ┌───────────────────────────────┐ │ │ │ browserforge: 随机化浏览器指纹│ │ │ │ - WebGL 指纹 │ │ │ │ - Canvas 指纹 │ │ │ │ - 字体列表 │ │ │ │ - 屏幕分辨率 平台信息 │ │ │ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │ │ │ apify-fingerprint-datapoints │ │ │ │ - 注入真实浏览器特征数据 │ │ │ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │ │ │ solve_cloudflareTrue │ │ │ │ - 自动等待 通过 Turnstile │ │ │ └───────────────────────────────┘ │ └─────────────────────────────────────┘和 Playwright Stealth 插件相比Scrapling 的隐身层更「无感」——你不需要手动注入 stealth 脚本或配置额外参数一行StealthyFetcher.adaptive True就搞定。️ 架构分析模块划分Scrapling 的项目结构很清晰核心模块都放在scrapling/下依赖依赖依赖依赖scrapling/fetchers/请求获取层scrapling/spiders/整站爬取层scrapling/core/解析 自适应引擎scrapling/cli.py命令行 交互 Shellfetchers/三层请求器 Session 管理 ProxyRotator。Lazy import 设计避免初始化时加载浏览器驱动。spiders/Scrapy 风格的 Spider 框架——但用asyncio重写支持并发爬取、断点恢复、多 Session 切换。Scheduler 负责请求队列调度SessionManager 管理不同类型的连接池。core/解析器和自适应选择器。基于 lxml 的 Selector 类提供 CSS/XPath/text/regex 四种选择方式自适应能力通过auto_save指纹存储实现。mixins.py里的选择器生成算法能自动生成稳定的 CSS/XPath 选择器。cli.py提供scrapling shell交互式调试环境和scrapling extract无代码数据提取。设计亮点懒加载 渐进安装核心包只有 lxml/cssselect/orjson 三个依赖不到 10MB。fetcher 的 Playwright/curl_cffi 放在[fetchers]extras 里MCP 支持放[ai]里。用户按需装不污染环境。Fetcher-Session-Spider 三层解耦Fetcher 可以独立用快速单页抓取也可以挂 Session带 Cookie/代理管理的连续请求还可以配合 Spider全站并发爬取。三个层级各自独立组合使用。可以改进的地方文档结构偏平README 虽然详细但信息密度过高核心概念自适应选择器 vs 隐身引擎 vs Spider的最佳实践没有独立成章对非 Chromium 浏览器支持有限隐身模式只支持 ChromiumFirefox 用户只能用不带隐身的 DynamicFetcherMCP 集成仍在早期AI 集成是最新特性实际生产使用案例还不多✅ 优缺点 适用场景三个优点自适应选择器是滚雪球式的竞争优势——网站改版次数越多你的爬虫维护成本越低差距越拉越大三层 Fetcher 无缝切换——从 curl 到隐身浏览器API 完全一致迁移成本为零性能靠谱——lxml 解析层比 BS4 快 800 倍json 序列化用 orjson 比标准库快 10 倍两个缺点学习成本存在概念多Fetcher/Session/Spider/自适应/隐身新手上手比 requests BS4 复杂隐身浏览器启动慢StealthyFetcher 每次冷启动 1-2 秒适合间歇性抓取不适合每秒上百次的 API 调用谁该立刻试试正在维护多条爬虫、经常被网站改版折磨的工程师需要抓 Cloudflare 保护站点的数据分析师想从 Scrapy 迁移到更轻量方案但不想放弃 Spider 模式的人谁该再等等只需要抓几个静态页面的requests lxml 就够别过度设计必须用 Firefox 做隐身抓取的目前只支持 Chromium完全不会 Python 的虽然有 CLI 模式但进阶功能还是需要写代码如果只能用一个词形容 Scrapling那会是「务实」。它没有发明新技术但把自适应解析、隐身浏览器、Spider 框架这三个已有能力做到了最顺滑的组合。在这个反爬技术日新月异的时代这种「帮你少写适配代码」的工具才是最值钱的。
Scrapling:一个让反爬系统看不见你的 Python 爬虫框架
你写好的爬虫三个月后还能用吗读完本文你将了解自适应选择器如何对抗页面改版 | Scrapling 的三层架构设计 | 无感知绕过 Cloudflare 的技术细节 | 它和 Scrapy/Playwright 到底该怎么选 这个项目解决什么问题你有过这种经历吗——花了一下午写好爬虫第二天网站改了个 class 名全白费。或者更惨Cloudflare 的五秒盾卡住一切请求代理池都救不了。Python 爬虫生态不缺工具Scrapy 是全家桶但太重BeautifulSoup 是解析器不是爬虫Playwright 能绕反爬但写起来像在操作浏览器。缺的是一个「聪明」的中间层——既有轻量级 HTTP 请求的速度又能在遇到 Cloudflare 时自动切到隐身浏览器模式既能写 CSS 选择器提取数据又能网站改版后自动找到那些元素。Scrapling 干的就这事儿。58k star、日增 1486 star 不是没道理。 快速上手pipinstallscrapling[fetchers]scraplinginstall安装完就能直接干活。先试个最简单的fromscrapling.fetchersimportFetcher pageFetcher.get(https://quotes.toscrape.com/)quotespage.css(.quote .text::text).getall()print(quotes)看到没API 几乎和 Scrapy 一模一样但不需要创建 Project、写 Spider 类、配置 Pipeline——三行代码拿结果。现在上个硬的。Cloudflare 拦截的网站fromscrapling.fetchersimportStealthyFetcher StealthyFetcher.adaptiveTrue# 开启自适应模式pageStealthyFetcher.fetch(https://nopecha.com/demo/cloudflare,headlessTrue,network_idleTrue)datapage.css(#padded_content a).getall()StealthyFetcher会在后台启动隐身浏览器伪造指纹、解决 Cloudflare Turnstile 挑战拿到页面后自动关浏览器。对调用方来说就是一个函数调用。⚠️踩坑提示StealthyFetcher依赖 Playwright 的 Chromium首次使用需要scrapling install下载浏览器。Docker 用户可以直接用pyd4vinci/scrapling镜像浏览器已预装。如果要爬整站上 Spiderfromscrapling.spidersimportSpider,ResponseclassQuotesSpider(Spider):namequotesstart_urls[https://quotes.toscrape.com/]concurrent_requests10asyncdefparse(self,response:Response):forquoteinresponse.css(.quote):yield{text:quote.css(.text::text).get(),author:quote.css(.author::text).get(),}# 自动翻页next_pageresponse.css(.next a)ifnext_page:yieldresponse.follow(next_page[0].attrib[href])resultQuotesSpider().start()result.items.to_json(quotes.json)# 直接导出 JSON支持 CtrlC 暂停下次运行自动续爬——长任务不用从头再来。⚙️ 技术原理Scrapling 的核心卖点不是「又一个浏览器自动化工具」而是三层引擎 自适应选择器的组合设计。三层 Fetcher 架构纯 HTTP动态页面绕过防火墙用户代码需要哪种 Fetcher?Fetchercurl_cffi 驱动DynamicFetcherPlaywright ChromeStealthyFetcher隐身浏览器 指纹伪造Adaptive Selector自适应选择器层数据结果Fetcher底层用curl_cffi模拟浏览器 TLS 指纹Chrome/Firefox 都能伪装纯 HTTP 请求速度最快DynamicFetcher包装 Playwright Chromium处理 JS 渲染的动态页面StealthyFetcher在 DynamicFetcher 基础上加隐身层——browserforge伪造浏览器指纹 apify-fingerprint-datapoints注入反检测数据三者共享同一个选择器接口切换成本为零。你写.css(.product)不管底层是 curl 发的请求还是隐身浏览器渲染的页面都能用。自适应选择器为什么网站改版了爬虫还能跑这是 Scrapling 最值得讲的设计。传统爬虫靠 CSS 选择器定位元素——.product-price、#main-content。网站一改 HTML 结构选择器就失效。Scrapling 的auto_saveTrue模式在首次选择时保存元素的指纹信息标签名 文本内容 属性键值 DOM 树上下文。下次网站改版后用adaptiveTrue打开自适应模式Scrapling 不再用死选择器去找而是用元素相似度算法在页面上搜索匹配度最高的节点。# 第一遍正常选择 自动保存指纹productsp.css(.product,auto_saveTrue)# 网站改版后自适应模式自动重定位productsp.css(.product,adaptiveTrue)这套机制的核心实现思路是把元素特征向量化标签、文本摘要、CSS 类名分布、父子节点关系构建启发式相似度度量不是逐字节比较 HTML而是语义级匹配基准测试显示 Scrapling 的元素查找速度是 AutoScraper 的 5 倍多2.39ms vs 12.45ms跟竞品对比Scrapy 的自适应方案是 AutoScraper但它依赖手动标注训练样本Scrapling 的auto_save是在你第一次正常抓取时就隐式标注了零额外成本。隐身引擎如何绕过 CloudflareCloudflare Turnstile 是当前最常见的反爬挑战。Scrapling 从三个层面绕过它┌─────────────────────────────────────┐ │ StealthyFetcher │ │ │ │ ┌───────────────────────────────┐ │ │ │ browserforge: 随机化浏览器指纹│ │ │ │ - WebGL 指纹 │ │ │ │ - Canvas 指纹 │ │ │ │ - 字体列表 │ │ │ │ - 屏幕分辨率 平台信息 │ │ │ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │ │ │ apify-fingerprint-datapoints │ │ │ │ - 注入真实浏览器特征数据 │ │ │ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │ │ │ solve_cloudflareTrue │ │ │ │ - 自动等待 通过 Turnstile │ │ │ └───────────────────────────────┘ │ └─────────────────────────────────────┘和 Playwright Stealth 插件相比Scrapling 的隐身层更「无感」——你不需要手动注入 stealth 脚本或配置额外参数一行StealthyFetcher.adaptive True就搞定。️ 架构分析模块划分Scrapling 的项目结构很清晰核心模块都放在scrapling/下依赖依赖依赖依赖scrapling/fetchers/请求获取层scrapling/spiders/整站爬取层scrapling/core/解析 自适应引擎scrapling/cli.py命令行 交互 Shellfetchers/三层请求器 Session 管理 ProxyRotator。Lazy import 设计避免初始化时加载浏览器驱动。spiders/Scrapy 风格的 Spider 框架——但用asyncio重写支持并发爬取、断点恢复、多 Session 切换。Scheduler 负责请求队列调度SessionManager 管理不同类型的连接池。core/解析器和自适应选择器。基于 lxml 的 Selector 类提供 CSS/XPath/text/regex 四种选择方式自适应能力通过auto_save指纹存储实现。mixins.py里的选择器生成算法能自动生成稳定的 CSS/XPath 选择器。cli.py提供scrapling shell交互式调试环境和scrapling extract无代码数据提取。设计亮点懒加载 渐进安装核心包只有 lxml/cssselect/orjson 三个依赖不到 10MB。fetcher 的 Playwright/curl_cffi 放在[fetchers]extras 里MCP 支持放[ai]里。用户按需装不污染环境。Fetcher-Session-Spider 三层解耦Fetcher 可以独立用快速单页抓取也可以挂 Session带 Cookie/代理管理的连续请求还可以配合 Spider全站并发爬取。三个层级各自独立组合使用。可以改进的地方文档结构偏平README 虽然详细但信息密度过高核心概念自适应选择器 vs 隐身引擎 vs Spider的最佳实践没有独立成章对非 Chromium 浏览器支持有限隐身模式只支持 ChromiumFirefox 用户只能用不带隐身的 DynamicFetcherMCP 集成仍在早期AI 集成是最新特性实际生产使用案例还不多✅ 优缺点 适用场景三个优点自适应选择器是滚雪球式的竞争优势——网站改版次数越多你的爬虫维护成本越低差距越拉越大三层 Fetcher 无缝切换——从 curl 到隐身浏览器API 完全一致迁移成本为零性能靠谱——lxml 解析层比 BS4 快 800 倍json 序列化用 orjson 比标准库快 10 倍两个缺点学习成本存在概念多Fetcher/Session/Spider/自适应/隐身新手上手比 requests BS4 复杂隐身浏览器启动慢StealthyFetcher 每次冷启动 1-2 秒适合间歇性抓取不适合每秒上百次的 API 调用谁该立刻试试正在维护多条爬虫、经常被网站改版折磨的工程师需要抓 Cloudflare 保护站点的数据分析师想从 Scrapy 迁移到更轻量方案但不想放弃 Spider 模式的人谁该再等等只需要抓几个静态页面的requests lxml 就够别过度设计必须用 Firefox 做隐身抓取的目前只支持 Chromium完全不会 Python 的虽然有 CLI 模式但进阶功能还是需要写代码如果只能用一个词形容 Scrapling那会是「务实」。它没有发明新技术但把自适应解析、隐身浏览器、Spider 框架这三个已有能力做到了最顺滑的组合。在这个反爬技术日新月异的时代这种「帮你少写适配代码」的工具才是最值钱的。