
用 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, indentTrue)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, headlessTrue, solve_cloudflareTrue, # 自动过 Cloudflare Turnstile/JS 质询 block_webrtcTrue, # 堵住 WebRTC 泄漏真实本地 IP 的口子 hide_canvasTrue, # 给 canvas 渲染加噪打乱指纹比对 useragentMozilla/5.0 (Windows NT 10.0; Win64; x64) ..., proxy_rotatorrotator, # 每个请求自动轮换到下一个代理 network_idleTrue, # 等到 500ms 内无网络活动再返回 timeout30000, retries3, retry_delay2, )逐条说对抗对象solve_cloudflare处理质询页不配它你会拿到验证页而不是正文block_webrtc防的是代理白用、真实 IP 从 WebRTC 里漏出去hide_canvas防 canvas 指纹useragent不传的话库会自动生成与当前浏览器版本一致的真实 UA传了就用你的proxy_rotator解决单 IP 被限频的问题network_idle、timeout、retries、retry_delay这组则对付页面没加载完就取走和偶发超时相当于内置了请求延迟与重试。 Headless 就是不开图形界面跑浏览器速度更快也更难被人工发现。调试时改成headlessFalse能看到浏览器真实动作定位问题快得多。踩坑速查403、空结果、内存上涨怎么办现象原因解法返回 403 / 验证页被 WAF 识别为脚本换StealthyFetcher依次开solve_cloudflare、hide_canvas、block_webrtc再挂ProxyRotator换出口 IP解析结果为空内容是 JS 渲染的静态请求拿到的只是壳用DynamicFetcher/StealthyFetcher配wait_selector等到目标元素出现再取页面内容只有一半懒加载/异步请求未完成就返回了network_idleTrue或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_actionact, wait_selectorul.items li, # 等列表真正渲染出来再返回 network_idleTrue, ) 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),仅供参考