Scrapling 智能抓取爬虫框架:3 条命令跑通环境,选择器扛得住网站改版
【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling
想抓某个网站的价格数据,结果一写代码就遇上这堵墙:普通 requests 一发出去就被 403,换无头浏览器又卡在 Cloudflare 验证页,好不容易跑通的日子,网站一改版你的选择器全部失效。Scrapling 就是一个为了拆掉这堵墙的自适应爬虫框架——从单次 HTTP 请求、驱动浏览器过反爬,到并发全量抓取它都覆盖,而且它会记住你提取过的元素长什么样,网站换版之后还能把元素重新找回来。
⚡️ 3 条命令装好 Python 环境
先确认 Python 在 3.10 以上(这是 Scrapling 的硬门槛):
python --version然后用这几条命令装起来,照敲就行:
pip install "scrapling[fetchers]" # 解析引擎 + 三种抓取器 scrapling install # 下载 Chromium 及系统依赖 scrapling shell # 进交互式 shell,顺便验证环境按需追加的可选模块:
- 要让 AI 工具通过 MCP 调用抓取:
pip install "scrapling[ai]" - 要
scrapling shell和免写代码的extract导出命令:pip install "scrapling[shell]" - 全都要:
pip install "scrapling[all]" - 不想折腾本机:
docker pull pyd4vinci/scrapling,镜像里浏览器已经备齐
⚠️ 这里有个小坑:裸跑pip install scrapling只装了解析器,之后一import scrapling.fetchers就会抛 ModuleNotFoundError,一定带上[fetchers]后缀。想直接参与框架开发的话,clone 仓库(https://gitcode.com/GitHub_Trending/sc/Scrapling)后pip install -e .即可。
✅ 第一个爬虫跑通
装完别急着看文档,先把这个文件存成demo.py跑一下:
from scrapling.fetchers import Fetcher page = Fetcher.get('https://quotes.toscrape.com', impersonate='chrome') quotes = page.css('.quote .text::text').getall() print(page.status) # 200 for q in quotes[:3]: print(q)这段代码实际干了两件事:Fetcher.get发请求时把 TLS 指纹和请求头都伪造成 Chrome,很多初级反爬在这一步就放你过去了;返回的page本身就是一个现成的选择器对象,css()直接抽数据,不用你再拼 BeautifulSoup 这类库。解析器的核心实现就放在 scrapling/parser.py,想深挖算法可以看源码。
如果目标站点的内容是 JavaScript 动态渲染的,Fetcher拿到的页面是空的——把导入换成from scrapling.fetchers import DynamicFetcher,改用DynamicFetcher.fetch(url),它会开一个真实 Chromium 渲染完页面再返回源码,其余代码一行不用动。
🔧 三个高频升级:过封锁、扛改版、并发抓取
网站拦截严 → 开 stealth 模式
症状是普通请求拿到的全是验证页或 403。把请求换成StealthyFetcher,它走的是打了全套指纹补丁的无头 Chromium:Canvas 加噪、堵住 CDP 和 WebRTC 泄漏、默认就能过 Cloudflare Turnstile 验证。改完立刻生效,参数全表在 docs/fetching/stealthy.md:
page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare', solve_cloudflare=True)网站改版导致选择器失效 → 开自适应跟踪
这是智能抓取里最省事的保命功能。第一次提取时存下元素特征,之后就算网站改了 class、挪了嵌套层级,按相似度照样能找到:
Fetcher.adaptive = True items = page.css('.product', auto_save=True) # 先存下元素特征 items = page.css('.product', adaptive=True) # 改版后自动重新定位原理和真实网站上的验证案例(拿 2010 年存档页面测选择器)见 docs/parsing/adaptive.md。
要抓整个站 → 交给 Spider 引擎并发跑
单条请求太慢、长任务跑到一半挂了,就上 Spider。一个类属性打开并发,Ctrl+C 中断后进度自动落盘,重启传同一个crawldir就能断点续爬:
from scrapling.spiders import Spider, Response class QuotesSpider(Spider): name = "quotes" start_urls = ["https://quotes.toscrape.com"] concurrent_requests = 10 async def parse(self, response: Response): for quote in response.css('.quote'): yield {"text": quote.css('.text::text').get()} QuotesSpider(crawldir="./crawl_data").start()引擎内部还带 AutoThrottle:网站开始限流时自动把该域名的请求间隔加倍,恢复后再提速,不用你猜该等多久。
这张图是 Spider 引擎的内部管线:调度器把请求交给 Crawler Engine,引擎派给 Session Manager 真正发请求(不同会话可以路由给 HTTP 或隐身浏览器),结果回传 Spider 解析,items 落到 Output,全程 checkpoint 持续保存——这就是断点续爬能成立的底层原因。
🐛 踩坑速查
- 症状:导入
scrapling.fetchers报 ModuleNotFoundError。原因:只装了裸包,没有 fetchers 依赖。解法:pip install "scrapling[fetchers]"后跑scrapling install。 - 症状:浏览器抓取器起不来,报缺系统依赖。原因:没执行浏览器安装步骤。解法:
scrapling install,装过仍有残留问题就scrapling install --force。 - 症状:
adaptive=True没找回元素。原因:第一次提取时忘了auto_save=True,等于没存下特征。解法:先跑一次auto_save=True,之后的查询再用adaptive=True。 - 症状:抓到的页面是空的,但浏览器里明明有内容。原因:纯 HTTP 的
Fetcher不执行 JavaScript。解法:换DynamicFetcher(无防护)或StealthyFetcher(有防护)。
跑通之后,建议直接敲scrapling shell进交互式环境,把你真正要抓的站点 URL 丢进去,边试选择器边确认——选择器稳了再落成脚本,效率最高。
【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考