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
Scrapling 是一个自适应 Python 网络爬虫框架:它的解析器能记住元素特征,网站改版后自动把page.css()重新指向正确位置;它的三个 Fetcher 分别覆盖纯 HTTP、动态加载页面和反爬站点;它的 Spider 则把多页并发抓取、断点续爬、结果导出压进几行代码里。下面按"先跑通、再抗改版、后放大到整站"的顺序带你上手。
装好依赖并跑通第一条抓取命令
Scrapling 需要 Python 3.10 以上。直接pip install scrapling只装了解析引擎,scrapling.fetchers和scrapling.spiders都还会抛ModuleNotFoundError——所以想发请求的话,一步装全最省事:
pip install "scrapling[all]" scrapling install第二条命令会下载 Chromium、Chrome 的浏览器依赖和指纹相关组件,装完后任何 Fetcher 都开箱可用。验证是否装好,跑下面这段——它用 HTTP 请求抓取名言练习站并取出前两条名言,Fetcher.get默认就带真实浏览器请求头:
from scrapling.fetchers import Fetcher page = Fetcher.get('https://quotes.toscrape.com/') quotes = page.css('.quote') print(page.status, len(quotes)) for q in quotes[:2]: print(q.css('.text::text').get(), '—', q.css('.author::text').get())预期输出:状态码200,10(每页 10 条名言),随后是形如"The world as we have created it..." — Albert Einstein的名言行。page变量里就是Response对象,它本身也是解析器,.status、.headers、.cookies随时可查。
动态页面交给浏览器 Fetcher 执行
上面这条路径走的是纯 HTTP,遇到 JS 渲染出来的内容就是空壳。换到DynamicFetcher,它会起一个无头浏览器(headless默认开启,省得窗口弹出来抢屏幕)把页面完整渲染后再交给你:
from scrapling.fetchers import DynamicFetcher page = DynamicFetcher.fetch('https://quotes.toscrape.com/js/') print(len(page.css('.quote')))预期看到10——同样的选择器,静态请求拿到的是空列表,浏览器执行后才渲染出内容。
| 场景 | 用哪个 | 特点 |
|---|---|---|
| 纯静态页面、大批量 | Fetcher | 最快、最省内存,可伪装 TLS 指纹 |
| JS 渲染、中小保护 | DynamicFetcher | Playwright 驱动 Chromium 或真实 Chrome |
| Cloudflare Turnstile 等强反爬 | StealthyFetcher | 自动过验证码、隐藏 WebRTC/CDP 痕迹 |
被 Cloudflare 拦住的站点换成StealthyFetcher.fetch(url, solve_cloudflare=True)即可,参数名和用法与上面一致,不用换解析代码。
用自适应抓取让选择器活过网站改版
这是 Scrapling 最省维护成本的部分。流程是:第一次选到元素时用auto_save=True存下它的特征(标签、文本、属性、兄弟节点、路径),之后选择器失效时传adaptive=True,它会在整页里做相似度打分并返回最像的那个。先全局打开这个开关:
Fetcher.adaptive = True page = Fetcher.get('https://quotes.toscrape.com/') first = page.css('.quote', auto_save=True) # 第一次:存特征 print(len(first), first[0].css('.text::text').get())预期看到10和第一条名言。假设网站明天改版、.quote没了,同一段代码这样兜底:
quotes = page.css('.quote') or page.css('.quote', adaptive=True) print(len(quotes))选择器失效时走自适应匹配,依然能拿到 10 条。它不依赖 AI,纯相似度算法,官方文档里用 2010 年的 StackOverflow 和现在的设计做了对照测试,同一个 Chrome 生成的长选择器在两版页面里都命中了同一个按钮。另外两点值得注意:auto_save只保存选择结果里的第一个元素,多元素场景建议每个都显式存一次;用Selector直接解析本地 HTML 时要传url参数,Scrapling 靠域名隔离各站点的存档。
写一个会自己翻页的 Spider
单页请求放大到整站,不用自己管队列和并发,Spider类自带调度、去重和限速:
from scrapling.spiders import Spider, Response class QuotesSpider(Spider): name = "quotes" start_urls = ["https://quotes.toscrape.com"] async def parse(self, response: Response): for q in response.css('.quote'): yield {'text': q.css('.text::text').get(''), 'author': q.css('.author::text').get('')} next = response.css('li.next a::attr(href)').get() if next: yield response.follow(next, callback=self.parse) result = QuotesSpider().start() result.items.to_json('quotes.json') print(result.stats.items_scraped)response.follow会自动把相对链接拼成绝对地址并带上Referer。跑完终端打印完整统计,quotes.json落盘,items_scraped输出104(该站共 10 页、每页 10 条)。中途Ctrl+C不会白跑:加一个crawldir参数QuotesSpider(crawldir='./data').start(),下次传同一路径就从断点继续。
不写代码时用 extract 命令直接落文件
偶尔只需要一页正文,进 Python 就重了。scrapling extract一行命令完成下载、转格式、落盘,输出格式由文件扩展名决定(.md/.txt/.html):
scrapling extract get "https://quotes.toscrape.com" quotes.md -s ".quote"预期看到工作目录下出现quotes.md,里面是 10 条名言的 Markdown 文本;-s指定 CSS 选择器只抓匹配部分,不指定则取整个 body。
三个最容易踩的坑
- 装完
pip install scrapling就 import fetchers:如开头所说,基础包只含解析引擎,报ModuleNotFoundError时补[fetchers]或[all]依赖组,再跑一次scrapling install装浏览器。 - 忘了开 adaptive:
adaptive默认关闭,不开的话auto_save=True不会存档,后面adaptive=True也找不到东西。 - 把动态页面交给 HTTP Fetcher:
Fetcher.get不执行 JS,渲染型页面拿到的page.css(...)是空列表,这是最常见的"选择器没错却抓不到"的原因,换DynamicFetcher即可。
接下来
可以继续看 Fetcher 选型对照、自适应抓取原理 和 Spider 进阶(代理轮换、流式输出),把抓取能力补到生产级。使用本库抓取数据前,请遵守目标站点的服务条款、robots.txt 及当地法律法规。
【免费下载链接】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),仅供参考