📌 项目地址:D4Vinci/Scrapling | ⭐ 56,494 颗星 | 🔧 Python | 📜 未标注
起因:改版一次,重写一次
做爬虫的人都有这个经历:昨天还正常跑的脚本,今天突然全空。打开网页,发现.product变成了.item-card,h2后面多了层span。旧选择器全废,得重新分析页面结构,更新代码。如果你爬的网站改版频繁,维护成本比开发还高。
Scrapling 是我最近试的一个 Python 库,54K+ star,Github 地址:D4Vinci/Scrapling。它的核心思路是:爬虫不应该只依赖 CSS 类名或 XPath,它应该记住数据“在页面哪个位置长什么样”,即使视觉结构变了,也能自己找回来。
自适应选择器:把元素特征存下来,改版后自动重定位
Scrapling 提供两个参数:auto_save 和 adaptive。
from scrapling.fetchers import StealthyFetcher
p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True)
products = p.css('.product', auto_save=True) # 抓取时保存特征
第一次运行时加上 auto_save=True,Scrapling 会分析目标元素周围的 DOM 特征——包括父节点标签、相邻兄弟元素、文本位置、属性比例等,生成一个结构“指纹”。
隔了两个月,网站改版了,.product 类名可能删了或改了。这时你不需要改代码,只需要把参数换成 adaptive=True:
products = p.css('.product', adaptive=True) # 自动用之前保存的特征重新匹配
它会拿之前存下来的指纹在当前 DOM 里做相似度匹配,找到最可能的数据节点。实测在常见电商列表页上,即使结构变化 20%-30%,仍能准确定位。当然,如果整个页面重建(比如从表格变成了卡片),匹配可能失败——但那种情况本身就需要人工介入。
注意 adaptive=True 依赖之前用 auto_save=True 生成的指纹。如果你从未保存过,直接 adaptive=True 会回退为普通 CSS 选择器。
反爬:一行代码过 Cloudflare Turnstile
很多网站用 Cloudflare 的 Turnstile(就是那个“我不是机器人”的 checkbox)或类似防护。Scrapling 内置的 StealthyFetcher 集成了浏览器指纹伪装、真实 User Agent 和 headless 模式的调试规避。
p = StealthyFetcher.fetch('https://protected-site.com', headless=True, network_idle=True)
其中 network_idle=True 会等所有网络请求完成后再返回页面,避免异步加载遗漏。我试了几个常见的 Cloudflare 保护站点,默认参数就能过,不需要额外调 cookies 或 headers。如果你遇到更高级的防护(比如 Akamai、DataDome),官方赞助商列表里有 Hyper Solutions 提供 API 生成 token——不过那是付费服务。
Spider 框架:异步、断点续爬、代理轮换
如果只是爬几百页,单线程 requests 加 BeautifulSoup 凑合用。但需要爬几十万页时,Scrapling 的 Spider 框架是更省事的选择。
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()
这个框架自带三个我实际用到的功能:
- 暂停与恢复:爬了一半电脑没电了,或者被网站暂时封了 IP,下次启动脚本会从上次中断的地方继续,不会重新爬已经完成的链接。
- 自动代理轮换:Spider 可以配置代理列表,一个 IP 被封后自动切换到下一个。配合
adaptive参数,即使目标网站改版,爬虫也能一边自适应一边换 IP,同时进行。 - 实时统计:运行时终端会显示当前爬取速度、已爬页面数、失败数等,方便监控异常。
这些功能在 Scrapy 里也能实现,但配置起来要写不少中间件。Scrapling 开箱就有,适合想快速搭建稳定爬虫的人。
一点实测感受
我自己的使用场景是抓某个电商每日价格数据。网站平均两个月小改一次前端。用传统方法每次改版都得手动更新选择器,周末经常被消息叫起来修爬虫。换成 Scrapling 后,第一次用 auto_save=True 保存特征,后面就一直用 adaptive=True。三个月内网站变了两次,第一次完全没察觉,第二次因为改动太大(商品列表改成了无限滚动),匹配率降低,但也没有完全失效,我手动更新了保存的指纹文件就恢复了。
StealthyFetcher 过 Cloudflare 的成功率比我之前用的 playwright-stealth 高一些——后者偶尔会触发挑战页面,Scrapling 目前没遇到过。这可能和它内置的 network_idle 等待机制有关。
劣势也提一句
adaptive匹配依赖保存的指纹文件。如果换了机器或清空了数据目录,第一次运行adaptive=True会失败,需要重新用auto_save=True建一次。- Spider 的文档比较简略,一些高级用法(比如自定义请求间隔、连接数限制)需要去源码里翻。
- 项目赞助商主要是代理服务商,对免费用户来说没有实际影响,但说明反爬部分可能更适配商业代理。
总的来说,Scrapling 让我从“每天盯着网页改版”的焦虑里解脱了一部分。如果你也被相同的问题困扰,不妨花半小时试试。