Insights·2026-07-22

Scrapling 是什么,为什么网站改版后它的爬虫也不会失效?

Scrapling 是一个用 Python 抓取网页数据的开源框架(BSD-3 许可证,GitHub 星标 7 万)。最大的特点是自适应选择器。普通爬虫靠指定页面上的位置来取数据——'抓取带这个类名的元素'——所以当目标网站改版、类名或结构发生变化时,这些规则全部失准,只会返回空值。Scrapling 在首次抓取时把元素的特征一并保存下来,下次运行时打开 adaptive 选项,就用相似度算法重新找回移动了的元素。于是网站变了,人也不必再去改选择器。此外,一个库里还打包了对 Cloudflare 这类反爬墙的绕过、大规模并发爬虫,以及可接入 Claude、Cursor 的内置 MCP 服务器。

网页抓取和选择器是什么

网页抓取是指:本来要人用浏览器打开的网页,改由程序自动只把你想要的信息提取出来。每天记录商城价格、收集评论、把多个网站的公告汇集到一处,都属于这一类。

核心工具是选择器(selector)。网页表面是文字和图片,打开内部看则由一种叫 HTML 的标签结构组成。选择器就像一个地址,指向要在这个结构里抓哪里。例如 CSS 选择器 .price 表示'抓取带 price 类的元素',取出该元素的文本就得到价格。

也就是说,爬虫分两部分:一是把页面取回来(fetch),二是在取回的 HTML 里用选择器挑出想要的片段(parse)。Scrapling 两者都管。

为什么爬虫会在网站改版时失效

问题在于选择器绑定在目标网站当前的结构上。我写的是抓 .btn-primary,而网站改版时把这个类名换成 .button-main,我的选择器就指向了一个已不存在的东西。我的代码一个字都没动,结果却是空值。

这不是罕见事故,而是时时发生的事。目标网站没有理由照顾我的爬虫。营销改版、A/B 测试、更换框架等原因都会让类名和结构频繁变动。每一次,人都要重新打开网站,找到新类名,再把选择器改回去。运营长期抓取的团队,维护时间的大半就出在这里。

所以'不会失效的爬虫'长期以来几乎不可能——它本质上依赖别人的页面结构。Scrapling 的自适应选择器就是把这种依赖放松的一种做法。

自适应选择器如何重新找回元素

自适应(adaptive)选择器的想法很简单。第一次成功抓到元素时,把该元素的特征一并存下来——不只是类名,还有标签种类、父子和兄弟关系、周围文字、屏幕上的位置等多种线索。这些特征用 auto_save 选项保存。

下一次网站变了、原选择器失败时,在打开 adaptive 选项的状态下,Scrapling 会在整页里按相似度找出与保存特征最接近的元素。即使一个类名变了,只要其余线索还在,就能重新抓到移动后的元素。人去找新类名、改代码的这一步消失了。

adaptive_selector.py
from scrapling.fetchers import StealthyFetcher

StealthyFetcher.adaptive = True

# 首次抓取 — auto_save=True 把元素特征一并保存
page = StealthyFetcher.fetch('https://example.com')
products = page.css('.product', auto_save=True)

# 之后网站结构变了 — adaptive=True 重新找回移动的元素
products = page.css('.product', adaptive=True)

安装并不写代码直接试用

用 Python 的包管理器 pip 安装。在终端里 pip install scrapling 一行,就装好了解析器和 HTTP 请求功能。若还要用浏览器自动化(动态网站、反爬绕过),再运行 scrapling install 一起下载所需的浏览器。

终端 — 安装
pip install scrapling

# 需要浏览器相关功能(StealthyFetcher 等)时
scrapling install
终端 — 不写代码直接提取
# 把页面正文保存为 Markdown
scrapling extract get 'https://example.com' content.md

# 只取某个 CSS 选择器,并伪装成 Chrome
scrapling extract get 'https://example.com' content.txt --css-selector '.article' --impersonate 'chrome'

# 绕过 Cloudflare 拦截来提取页面
scrapling extract stealthy-fetch 'https://nopecha.com/demo/cloudflare' out.html --solve-cloudflare
quickstart.py — 用代码时
from scrapling.fetchers import Fetcher

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

自适应之外 — 反爬绕过、大规模爬虫、MCP

Scrapling 打包进一个库的另外三样,在实战中同样重要。第一,StealthyFetcher 默认绕过 Cloudflare Turnstile 这类反爬防御。它把 TLS 指纹和请求头伪装得像真实浏览器,必要时用 solve_cloudflare 选项解开拦截页再通过。过去要接入付费服务才能翻越的墙,如今成了一个库选项。

第二,有面向大规模采集的 Spider 框架。像 Scrapy 一样用 start_urls 和 parse 函数定义爬虫,支持并发数控制、代理自动轮换、按 Ctrl+C 暂停后再续跑的 pause·resume,以及把结果实时流式输出的 streaming。同一套工具,从一个网站几页扩展到数百万页的爬取。

第三,内置可接 AI 的 MCP 服务器。把 Scrapling 通过 MCP 接到 Claude 或 Cursor 这类 AI 工具后,AI 不必整页吞下网页,而由 Scrapling 先只提取需要的部分再交给它。这样 AI 要处理的 token 就减少,速度和成本一起下降。从 AX 的角度看,这一点尤其有用。

使用之前 — 合法与礼节

工具变简单,不等于哪里都能抓。抓取受目标网站的服务条款、登录和付费墙、个人信息、著作权的约束。Scrapling 内置了尊重 robots.txt 的选项(robots_txt_obey)、在请求之间留出间隔的延迟、以及域名屏蔽等机制。打开来用,既是对对方服务器的礼节,也是风险管理。

总之,Scrapling 是想把抓取从'写一次、不停地改'挪向'写一次、放着不管'的一种尝试。自适应选择器减少维护,反爬绕过降低门槛,MCP 降低与 AI 连接的成本。若你正在运营采集或打算新接入,它是一个值得一看的开源项目。