用 Scrapling 写 Python 爬虫:反爬与多页数据采集实战指南
【免费下载链接】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,或者页面结构稍微动一下,整个采集脚本就废了。Scrapling 就是一个为解决这类问题而生的 Python 爬虫与数据采集库:它内置反检测浏览器、自动翻页调度、断点续爬,还有对页面结构变化有容忍度的解析器。读完本文,你能装好环境、跑通一个自动翻页的完整爬虫,并学会在遇到反爬时该拧哪几个参数。
项目速览:Scrapling 能帮你解决什么
- 🕸️反检测:
StealthyFetcher用真实浏览器跑请求,自动处理 Cloudflare 验证、WebRTC 泄漏、canvas 指纹这些问题,让你不用手写绕检测脚本。 - ⏱️调度与断点续爬:爬虫引擎自带限速、去重和 robots.txt 检查,还会定期保存队列快照,中断后重跑不用从头再来。
- 🧩多方式解析:CSS 选择器、XPath、正则都能用,
adaptive模式还能在选择器失配时按相似度找回元素,页面改版不至于全线崩盘。
模块划分也很清楚:拿数据的逻辑在 scrapling/fetchers/,爬虫调度在 scrapling/spiders/,解析器是parser.py,需要本地缓存时看 scrapling/core/storage.py。
从零到跑通:10 分钟搭一个多页爬虫
安装只要 3 条命令
git clone https://gitcode.com/GitHub_Trending/sc/Scrapling cd Scrapling pip install -e .装完浏览器内核依赖时按提示执行一次对应的安装命令即可。用-e可编辑模式安装,后面想读源码、打断点都方便。
最小可运行示例:自动翻页抓全站
下面这个爬虫抓 quotes.toscrape.com 的全部引语,翻页完全靠"追下一页链接"自动完成:
from scrapling.spiders import Spider, Response class QuotesSpider(Spider): name = "quotes" start_urls = ["https://quotes.toscrape.com"] allowed_domains = {"quotes.toscrape.com"} async def parse(self, response: Response): for quote in response.css("div.quote"): yield { "text": quote.css("span.text::text").get(""), "author": quote.css("small.author::text").get(""), } # 有"下一页"就追,response.follow 会自动拼接相对链接 if next_href := response.css("li.next a::attr(href)").get(): yield response.follow(next_href) result = QuotesSpider().start() result.items.to_json("quotes.json", indent=True)parse里yield字典就是产出数据,yield response.follow(...)就是入队下一个请求;start()把异步事件循环全管了,你不用碰asyncio。
跑完看到什么
运行过程中终端会实时打印请求进度,结束后返回的result对象带完整统计:抓了多少条、发了多少请求、耗时和速率。当前目录会多出一个quotes.json,每页的引语、作者都在里面。
💡 断点续爬:爬虫引擎默认每 5 分钟把请求队列做一次快照存盘。爬一半断了,再次启动会从快照恢复,不会重复请求已完成的 URL——长任务尤其省心。
反爬参数逐个配:StealthyFetcher 实战
被 WAF 盯上时,直接上StealthyFetcher,每个开关对应一种检测手段:
from scrapling.fetchers import StealthyFetcher, ProxyRotator rotator = ProxyRotator([ "http://proxy1:8080", "http://proxy2:8080", ]) page = StealthyFetcher.fetch( "https://protected-site.com", headless=True, solve_cloudflare=True, # 自动过 Cloudflare Turnstile/JS 质询 block_webrtc=True, # 堵住 WebRTC 泄漏真实本地 IP 的口子 hide_canvas=True, # 给 canvas 渲染加噪,打乱指纹比对 useragent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...", proxy_rotator=rotator, # 每个请求自动轮换到下一个代理 network_idle=True, # 等到 500ms 内无网络活动再返回 timeout=30000, retries=3, retry_delay=2, )逐条说对抗对象:solve_cloudflare处理质询页,不配它你会拿到验证页而不是正文;block_webrtc防的是代理白用、真实 IP 从 WebRTC 里漏出去;hide_canvas防 canvas 指纹;useragent不传的话库会自动生成与当前浏览器版本一致的真实 UA,传了就用你的;proxy_rotator解决单 IP 被限频的问题;network_idle、timeout、retries、retry_delay这组则对付"页面没加载完就取走"和偶发超时,相当于内置了请求延迟与重试。
💡 Headless 就是不开图形界面跑浏览器:速度更快,也更难被人工发现。调试时改成
headless=False能看到浏览器真实动作,定位问题快得多。
踩坑速查:403、空结果、内存上涨怎么办
| 现象 | 原因 | 解法 |
|---|---|---|
| 返回 403 / 验证页 | 被 WAF 识别为脚本 | 换StealthyFetcher,依次开solve_cloudflare、hide_canvas、block_webrtc,再挂ProxyRotator换出口 IP |
| 解析结果为空 | 内容是 JS 渲染的,静态请求拿到的只是壳 | 用DynamicFetcher/StealthyFetcher,配wait_selector等到目标元素出现再取 |
| 页面内容只有一半 | 懒加载/异步请求未完成就返回了 | network_idle=True,或wait_selector盯住列表容器 |
| 长时间爬取内存持续上涨 | 每次fetch都拉起新浏览器且不释放 | 改用 session 上下文(with StealthySession(...) as s),复用同一浏览器实例 |
| 频繁连接重置 | 请求速率过高压到服务器 | spider 里开autothrottle_enabled,或调大download_delay、retry_delay |
排错的顺序建议固定:先看状态码判断是不是被拦,再看response.html_content()判断内容在不在,最后才怀疑选择器。
进阶玩法:动态渲染与执行 JS
单页应用里的内容,纯 HTTP 请求永远拿不到,这时让DynamicFetcher开真浏览器,并用page_action注入一段自动化操作:
from scrapling.fetchers import DynamicFetcher def act(page): # 滚动到底部,触发懒加载 page.evaluate("() => window.scrollTo(0, document.body.scrollHeight)") page = DynamicFetcher.fetch( "https://spa-site.com/list", page_action=act, wait_selector="ul.items li", # 等列表真正渲染出来再返回 network_idle=True, ) for item in page.css("ul.items li .name"): print(item.text)page_action收到的page就是 Playwright 的页面对象,滚动、点击、执行任意 JS 都行;wait_selector保证列表节点可见后才把Response交还给你,取到的才是渲染完的最终 DOM。
从单条请求到全站采集,Scrapling 的三层——fetchers、spiders、parser——分别对应"拿到数据、管住节奏、提好字段"。更多参数细节直接翻官方文档:docs 首页 有完整教程,API 参考 可查每个类的全部入参。
【免费下载链接】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),仅供参考