2026-03-09

Scrapling:自适应网页抓取框架,绕过反爬无压力

前言

做网页爬虫最头疼的是什么?一是网站结构变了,选择器全废;二是遇到 Cloudflare 这类反爬,直接被拦。Scrapling 这两个问题都能解决。

它是一个自适应的网页抓取框架,能自动追踪网站变化重新定位元素,内置反爬绕过能力,还能从单页请求扩展到大规模爬虫。一个库,全部搞定。

核心功能

1. 自适应抓取

网站改版了?选择器还能用。Scrapling 会学习元素特征,在网站结构变化后自动重新定位:

from scrapling.fetchers import StealthyFetcher

StealthyFetcher.adaptive = True
page = StealthyFetcher.fetch('https://example.com', headless=True)

# 首次抓取时保存元素特征
products = page.css('.product', auto_save=True)

# 网站改版后,adaptive=True 自动找到对应元素
products = page.css('.product', adaptive=True)

2. 反爬绕过

StealthyFetcher 能直接绑过 Cloudflare Turnstile、人机验证等反爬机制:

from scrapling.fetchers import StealthyFetcher, StealthySession

# 一次性请求
page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
data = page.css('#padded_content a').getall()

# 会话模式(保持浏览器打开)
with StealthySession(headless=True, solve_cloudflare=True) as session:
    page = session.fetch('https://nopecha.com/demo/cloudflare')
    data = page.css('#content').getall()

3. 完整爬虫框架

类似 Scrapy 的 API,支持并发、暂停/恢复、多会话类型:

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(),
                "author": quote.css('.author::text').get(),
            }

        # 翻页
        next_page = response.css('.next a')
        if next_page:
            yield response.follow(next_page[0].attrib['href'])

result = QuotesSpider().start()
result.items.to_json("quotes.json")

暂停和恢复:长时间爬虫可以随时暂停,下次继续:

# 启用检查点
QuotesSpider(crawldir="./crawl_data").start()
# 按 Ctrl+C 暂停,下次运行自动恢复

4. 多种 Fetcher 类型

Fetcher 用途
Fetcher 快速 HTTP 请求,可伪装浏览器 TLS 指纹
StealthyFetcher 隐身模式,绕过反爬
DynamicFetcher 完整浏览器自动化,处理 JS 渲染页面
from scrapling.fetchers import Fetcher, DynamicFetcher

# 快速 HTTP 请求
page = Fetcher.get('https://example.com')

# 完整浏览器(处理 JS)
page = DynamicFetcher.fetch('https://example.com', headless=True, network_idle=True)

5. 丰富的选择器

支持多种选择方式:

page = Fetcher.get('https://example.com')

# CSS 选择器
quotes = page.css('.quote')

# XPath
quotes = page.xpath('//div[@class="quote"]')

# BeautifulSoup 风格
quotes = page.find_all('div', class_='quote')

# 文本搜索
quotes = page.find_by_text('quote', tag='div')

6. AI 集成(MCP Server)

内置 MCP Server,可以给 Claude、Cursor 等 AI 工具使用,让 AI 帮你抓网页:

pip install "scrapling[ai]"

安装

# 基础安装(仅解析器)
pip install scrapling

# 完整安装(包含 fetchers 和浏览器)
pip install "scrapling[fetchers]"
scrapling install

# 安装全部功能
pip install "scrapling[all]"
scrapling install

Docker 方式

docker pull pyd4vinci/scrapling

CLI 命令行

不用写代码也能抓网页:

# 启动交互式 shell
scrapling shell

# 直接提取网页内容到文件
scrapling extract get 'https://example.com' content.md
scrapling extract get 'https://example.com' content.txt --css-selector '#main'

# 绕过反爬提取
scrapling extract stealthy-fetch 'https://example.com' output.html --solve-cloudflare

性能对比

Scrapling 的解析器性能非常出色:

文本提取速度测试(5000个嵌套元素)

排名 时间 (ms) 对比
1 Scrapling 2.02 1.0x
2 Parsel/Scrapy 2.04 1.01x
3 Raw Lxml 2.54 1.26x
4 PyQuery 24.17 ~12x
5 BS4 with Lxml 1584.31 ~784x

高级功能

多会话类型混合使用

在一个爬虫里混用快速请求和隐身浏览器:

from scrapling.spiders import Spider
from scrapling.fetchers import FetcherSession, AsyncStealthySession

class MultiSessionSpider(Spider):
    def configure_sessions(self, manager):
        manager.add("fast", FetcherSession(impersonate="chrome"))
        manager.add("stealth", AsyncStealthySession(headless=True), lazy=True)

    async def parse(self, response):
        for link in response.css('a::attr(href)').getall():
            if "protected" in link:
                yield Request(link, sid="stealth")  # 反爬页面用隐身模式
            else:
                yield Request(link, sid="fast")      # 普通页面快速请求

代理轮换

from scrapling.fetchers import ProxyRotator

rotator = ProxyRotator([
    "http://proxy1:8080",
    "http://proxy2:8080",
])

# 自动轮换代理

相关链接

总结

Scrapling 解决了网页抓取的三大痛点:

  1. 网站结构变化:自适应选择器自动重新定位元素
  2. 反爬机制:内置 Cloudflare 等主流反爬绕过能力
  3. 规模扩展:从单页请求到大规模爬虫,一套 API 全搞定

如果你经常需要抓取网页数据,这个库值得收藏。