GitHub 趋势 · 第 60 期
80,335 star 的爬虫库,README 里写着只准做研究
#Python#Web-Scraping#许可合规
今天 Python 分语言日榜上动量最高的未写项目是 D4Vinci/Scrapling(+338)。它是一个自适应网页抓取框架,从单次请求到全站爬取都在同一个库里,Python 写的,80,335 star,许可是宽松的 BSD-3-Clause。
它值得写不是因为 star 数,而是因为三层口径对不上:许可是可以商用的 BSD,README 底部的免责声明说只准做教育研究,而它要求你尊重 robots.txt 的同时,那个开关的默认值是关闭。
先说结论:工程上这是我近期看过完成度最高的抓取库之一 —— 选择器会跟着页面改版自己找回来,Cloudflare Turnstile 的绕过是开箱可用(README 原话是 bypass anti-bot systems like Cloudflare Turnstile out of the box)。但它的合规姿态分三层,而且三层不一样。真正有法律效力的是那份 1,499 字节的 BSD 许可,真正约束你的是目标网站的服务条款和你所在地的法律,中间那句免责声明,更像一句写给作者自己的话。本文不构成法律意见。
一、爬虫项目的成本不在解析
解析 HTML 从来不是难点。requests 加 BeautifulSoup,半小时能写出第一版。真正吃掉时间的是另外三件事:
- ▪页面改版,选择器一夜之间全部失效;
- ▪反爬升级,从 IP 限速到 Cloudflare 的交互式验证,请求直接被挡在门外;
- ▪还有一个不写在代码里的问题:这件事到底能不能做。
Scrapling 对前两条给了工程答案,对第三条给了一份免责声明。这也是它值得单独写一期的原因。
二、Scrapling 是什么
README 的一句话定义:「An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl.」它的定位是一个库覆盖全部:HTTP 请求、无头浏览器、反检测、爬虫调度、解析、MCP 服务与 Agent Skill 都在同一个包、同一套 API 里。
| 字段 | 值 |
|---|---|
| 仓库 | D4Vinci/Scrapling(owner 类型:User,个人仓库) |
| 许可 | BSD-3-Clause |
| star / fork | 80,335 / 8,110 |
| 未关闭 issue / 订阅数 | 20 / 294 |
| 语言 / 默认分支 | Python / main |
| 建仓 / 最后 push | 2024-10-13 / 2026-09-11 |
| 仓库体积 | 10,572 KB |
| 核心依赖 | 6 个:lxml、cssselect、orjson、tld、w3lib、typing_extensions |
| 自评状态 | Development Status :: 4 - Beta |
最后一行值得多看一眼。同一份 pyproject.toml 里,Development Status :: 5 - Production/Stable 那一行是被注释掉的,作者留下的正式自评是 Beta。八万 star 的项目给自己标 Beta,是一种罕见的克制。
三、四层能力
| 层 | 关键能力 |
|---|---|
| 抓取 | 三种通道:Fetcher(HTTP,可伪装浏览器 TLS 指纹、支持 HTTP/3)、DynamicFetcher(Playwright 的 Chromium 或官方 Chrome)、StealthyFetcher(反检测指纹加 Cloudflare 绕过);配套会话类、代理轮换 ProxyRotator、DoH 防 DNS 泄漏、以及 capture_xhr 直接抓页面背后的接口 |
| 爬取 | Scrapy 式 Spider API:并发、按域名限速、多会话混用、crawldir 暂停续跑、流式输出、AutoThrottle 自适应退避;README 列了 5 个现成模板(CrawlSpider、SitemapSpider、XMLFeedSpider、CSVFeedSpider、ShopifySpider),v0.4.15 又补了第 6 个 SiteToMarkdownSpider |
| 解析 | CSS、XPath、BeautifulSoup 风格 find_all、文本查找、正则;核心是自适应:先用 auto_save=True 存下元素特征,页面改版后传 adaptive=True 把元素找回来 |
| AI 集成 | MCP server(13 个工具)、Agent Skill、一行转 Markdown 的 page.markdown(),以及把整站爬成 Markdown 语料的 SiteToMarkdownSpider |
依赖分层这件事值得单独点出来:核心包只有 6 个依赖,fetchers 这个 extra 另有 9 个(click、curl_cffi、playwright、patchright、browserforge、apify-fingerprint-datapoints、msgspec、anyio、protego)。也就是说,只做解析的人不用为浏览器买单。
四、上手:三条命令,但第一条装完不能用
README 的安装段只有三行:
pip install scrapling pip install "scrapling[fetchers]" scrapling install
这里有一个必须提前知道的坑,README 自己用 IMPORTANT 标注了:只跑第一条,你得到的是一台纯解析引擎,一旦 import 抓取器或爬虫模块就会直接抛 ModuleNotFoundError。原文是「This installation only includes the parser engine and its dependencies, without any fetchers or commandline dependencies.」
最小可用示例,命令与代码均取自 README 原文:
from scrapling.fetchers import Fetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True)
products = p.css('.product', auto_save=True)
products = p.css('.product', adaptive=True)
爬虫侧是同一套 API,也是 README 原文:
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()
还有一条不用写代码的路:docker pull pyd4vinci/scrapling 直接拿一个装好全部浏览器与 extras 的镜像。
五、三层口径:许可、免责声明、默认行为
这一节是本期真正想讲的。同一份文档里有三句话,指向三个方向:
| 层级 | 内容 |
|---|---|
| 许可 | LICENSE 1,499 字节,标准 BSD-3-Clause 全文,版权方 Karim shoair;README 的 License 段只有一句「This work is licensed under the BSD-3-Clause License.」BSD-3-Clause 允许商用 |
| 免责声明 | README 底部的 Disclaimer 段用 CAUTION 样式写着 「for educational and research purposes only」,并要求遵守当地与国际的数据抓取和隐私法律,「Always respect the terms of service of websites and robots.txt files.」 |
| 默认行为 | 遵守 robots.txt 靠一个可选开关 robots_txt_obey,README 把它标成可选(原文用词 Optional);源码里这个属性的定义是 robots_txt_obey: bool = False,也就是默认不遵守。而免责声明那一句用的词是 Always |
我的读法:这不是 Scrapling 独有的矛盾,把合规责任交给使用者是开源爬虫项目的通行做法。所以判断标准不该是它写了什么承诺,而是你打算拿它做什么。抓公开数据、控制请求频率、不碰个人信息,三层口径你都不会撞上;拿它去撞对方的登录墙、或者批量刷别人的接口,那份 BSD 许可帮不了你,免责声明也帮不了你 —— 那种情况下真正说话的是目标网站的服务条款和你所在地的法律。准备商用的话,请找自己的法务确认,别拿这篇当依据。
六、赞助商名单本身是一份行业行情表
README 一共 37,124 字节。把里面的广告位数一遍:顶部 DataImpulse 横幅 1 个,Platinum Sponsors 表 12 个,底部 Sponsors 区 7 个,合计 20 个,另有两处是招募自家广告位的入口。
其中明确写自己是代理服务商的有 12 个:DataImpulse、ColdProxy、NodeMaven、Proxidize、BirdProxies、Evomi、Swiftproxy、NiuProxy、VoidMob、decodo、ProxyEmpire、webshare。挂专属折扣码的有 5 个:ColdProxy 给 5% off,NodeMaven 的 SCRAPLING35,Proxidize 的 scrapling20,NiuProxy 的 PAY2,VoidMob 的 SCRAPLING20。
这个结构说明的事比广告本身有意思:反爬越强,换 IP 的需求越大,而这个库正好站在被反爬拦住的那一端。免费用户越多,代理商的付费转化池越大。这是自治开源项目最现实的商业模式,不是道德问题。要说代价,安装说明被推到了 README 的后半段 —— 你得先划过大半屏的赞助位、功能清单和基准表。公平地补一句:赞助位都明确标注了,没有伪装成正文推荐,库本身也完全开源、可以自建。
顺带一个数字:CHANGELOG.md 有 97,405 字节,比 37,124 字节的 README 还厚 2.6 倍。而这份变更日志是 v0.4.15 才补进仓库的 —— 发行说明里写着「Added a CHANGELOG.md to the repository with the notes of every release so far.」
七、还有一份少见的规定:AI 贡献必须披露
仓库根目录有一份 2,784 字节的 AI_POLICY.md,专门管 AI 参与贡献这件事。核心一句是「If you are using any kind of AI assistance to contribute to Scrapling, it must be disclosed in the pull request or issue.」唯一的例外是琐碎的空格与拼写修正。
不披露的后果写在后面:会被打上 AI-Slop 标签,然后关闭。政策里给的理由写得比多数同类文档诚实:「In a perfect world, AI assistance would produce equal or higher quality work than any human. That isn't the world we live in today.」
把它放进本期,是因为它给出了一个和禁止 AI 提 PR 相反的做法:不禁止,只要求披露,把判断权留给维护者。对一个八万 star、PR 流量必然很大的仓库来说,这是成本更低也更有效的选择。
八、我的判断
适合谁:需要长期、稳定地采集公开数据,且已经被反爬卡住的团队;已经在写 Scrapy 但不想重写解析逻辑的人(README 说可以用 scrapling_response 装饰器把已有 callback 直接接到 Scrapling 的解析器上);想把网页喂给大模型做 RAG 的人 —— page.markdown() 一行转换,SiteToMarkdownSpider 能把整站爬成 Markdown 语料。
不适合谁:只是偶尔抓一两个页面的人。那种场景 requests 加 BeautifulSoup 就够了,引入 9 个抓取依赖和一套浏览器不值;以及把绕过 Cloudflare 当成合规免罪符的人 —— 技术能过,责任还是你的。
几个必须提前知道的坑:
- ▪装完不能跑:pip install scrapling 只是解析引擎,import 抓取器或爬虫模块会直接 ModuleNotFoundError;
- ▪浏览器要另外装:scrapling install 会下载浏览器与系统依赖,在服务器上是实打实的体积与时间成本;
- ▪自适应不会凭空生效:它分两步,先 auto_save=True 存基线,改版后再 adaptive=True 找回,所以它救不了你没抓过的页面;
- ▪Python 门槛是 3.10 起,shell 这个 extra 里的 IPython 被钉在 8.37,pyproject 的注释写明这是最后一个支持 Python 3.10 的版本;
- ▪v0.4.15 对 MCP server 是破坏性变更:13 个工具拆成一次性调用与会话两套模式,get 改名 make_request,HTTP transport 现在默认只绑 localhost 并要求认证(用 --auth-token 或 SCRAPLING_MCP_AUTH_TOKEN,或显式 --no-auth 关掉)。
九、数据与出处
地址:https://github.com/D4Vinci/Scrapling
star:80,335(Trending Python 日榜快照是 80,334,仓库 API 是 80,335,差 1,两个数并列写出);当日新增 +338
榜单出现情况:Python 分语言日榜;全语言日榜(16 条)、周榜(23 条)、月榜(23 条)均未收录
许可:BSD-3-Clause。LICENSE 1,499 字节为标准全文,版权方 Karim shoair;README 另有 Disclaimer 段,明写仅供教育研究用途
版本:v0.4.15(2026-08-23 发布);该 release 的 assets 数组为空,Docker 镜像发布在 Docker Hub 与 ghcr.io 而非 release 资产
体积:仓库 10,572 KB;README.md 37,124 字节;CHANGELOG.md 97,405 字节;AI_POLICY.md 2,784 字节
robots_txt_obey 的默认值取自源码 scrapling/spiders/spider.py 的属性定义,不是从 README 推断的
未核实项:① README 自称的 92% 测试覆盖率与那两张性能基准表,我没有复跑 benchmarks.py,只当自述引用;② 赞助位数量以主分支 README 本次快照为准,它会随赞助变化;③ 免责声明与许可之间的效力关系属于法律问题,本文不涉及
数据来源:GitHub Trending 官方页面与 GitHub REST API(repo、git trees、releases/latest),抓取时间 2026-09-12 13:3x(GMT+8)
你用过的抓取方案里,选择器失效这件事,你是靠测试断言守住的,还是靠自适应找回来的?评论区聊聊。
下一期:如果榜上出现动量更高的新面孔,就回到单项目精读;如果没有,就换一个主题族做横向合集。现在还挂着一笔账 —— 把模型塞进小设备与边缘那一族,得先在榜上凑够成员。
#Python#Web-Scraping#许可合规
GitHub 趋势 · 第 60 期