Scrapling 简明指南

如果你曾经有过一个正常工作的爬虫在一夜之间崩溃的经历,你就知道那种挫败感。

这就是Scrapling的用武之地。这个Python库是为当今混乱、不可预测的网络而构建的。它随着网站结构的变化而学习和适应,并且包含隐身工具,可以悄无声息地绕过常见的机器人防御。

在本教程中,我将一步一步地向你展示如何安装和使用Scrapling、提取结构化数据以及轻松处理动态页面。到最后,你将拥有一个即使在网络抛出常规曲线球时仍然可靠的爬虫。

1、什么是Scrapling?

Scrapling是一个用于高效网页爬取的开源Python库,具有独特的自适应能力。与像BeautifulSoup这样的旧库不同,Scrapling可以使用内置的相似性算法自动适应微小的HTML变化。它拥有自己的快速解析引擎,性能优于大多数Python爬取库。

Scrapling支持使用通过多个获取器类的Playwright进行JavaScript渲染来爬取动态内容,每个获取器都针对不同场景进行了优化。它包含高级隐身模式功能,使用修改后的Firefox浏览器来绕过复杂的反机器人保护。

Scrapling的关键特性:

  • 自适应选择器:当HTML结构发生变化时,使用智能相似性算法自动重新定位元素
  • 多个获取器类:在Fetcher(HTTP)、DynamicFetcher(Playwright + Chromium)和StealthyFetcher(具有高级隐身功能的修改版Firefox)之间选择
  • 选择器链:在不循环的情况下链接CSS和XPath选择器
  • 会话管理:使用FetcherSessionDynamicSessionStealthySession类进行持久化会话
  • 异步支持:所有获取器都具有完整的异步支持,并具有专用的异步会话类
  • 正则表达式集成:使用re()re_first()方法内置正则表达式支持
  • CLI实用工具:带有交互式shell的命令行界面,用于快速开发
  • 高性能:优化性能,基准测试显示在某些操作中比BeautifulSoup快698倍

准备好掌握现代网页爬取了吗?学习如何使用Scrapling轻松提取数据、适应网站变化并保持不被检测。

先决条件
- Python 3.10或更新版本
- 安装Scrapling

2、安装

v0.3.2开始,Scrapling使用模块化安装方法:

基础安装(仅解析器,无获取器):

pip install scrapling

安装获取器和浏览器依赖项:

pip install "scrapling[fetchers]"
scrapling install

scrapling install命令下载所有浏览器及其系统依赖项和指纹操作工具。

安装所有内容(获取器、AI功能、CLI工具):

pip install "scrapling[all]"
scrapling install

3、从网页获取HTML

首先测试Scrapling是否可以访问你的目标网站。使用Fetcher类进行HTTP请求:

from scrapling.fetchers import Fetcher
page = Fetcher.get("https://www.scrapingcourse.com/ecommerce/")
print(page.status)  # Should print: 200
print(page.html_content)

如果成功,你将看到HTTP状态码200和网页的完整HTML。

4、使用CSS选择器爬取产品数据

Scrapling可以使用自适应选择器自动适应微小的布局变化,但此功能默认情况下是禁用的。

首先,使用DevTools检查产品元素。对于这个网站:

  • 产品名称在h2.woocommerce-loop-product__title
  • 价格在.price
  • 图像在.woocommerce-LoopProduct-link img
from scrapling.fetchers import Fetcher
page = Fetcher.get("https://www.scrapingcourse.com/ecommerce/")
# Extract product data
names = page.css("h2.woocommerce-loop-product__title")
prices = page.css(".price")
images = page.css(".woocommerce-LoopProduct-link img")
product_data = []
for name, price, image in zip(names, prices, images):
    # Use regex to extract just the price number
    price_value = price.re_first(r'[\d.,]+')
    
    data = {
        "name": name.text,
        "price": f"${price_value}",
        "image": image.attrib["src"],
    }
    product_data.append(data)
print(product_data)

要启用自适应选择器(即使网站更新后也能跟踪元素):

# Enable adaptive globally
Fetcher.adaptive = True
page = Fetcher.get("https://www.scrapingcourse.com/ecommerce/")
# Save element properties for future adaptation
names = page.css(".product-name", auto_save=True)
# Later, when site structure changes, use adaptive mode
names = page.css(".product-name", adaptive=True)  # Scrapling finds them even if CSS changed!

5、启用隐身模式

许多网站使用Cloudflare等反机器人工具来阻止爬虫。Scrapling的StealthyFetcher使用带有高级指纹欺骗的修改版Firefox浏览器。

StealthySessionStealthyFetcherheadless=True标志一起使用:

from scrapling.fetchers import StealthyFetcher
# One-off request (opens and closes browser)
page = StealthyFetcher.fetch(
    "https://www.scrapingcourse.com/cloudflare-challenge/",
    headless=True
)
print(page.status)

对于多个请求,使用会话保持浏览器打开:

from scrapling.fetchers import StealthySession
# Keep browser open for multiple requests
with StealthySession(headless=True) as session:
    page = session.fetch("https://www.scrapingcourse.com/cloudflare-challenge/")
    print(page.html_content)

注意:solve_cloudflare参数可用,但应根据特定的Cloudflare保护类型谨慎使用。

6、现实示例:爬取电子商务数据

这是一个带有错误处理的完整爬虫:

from scrapling.fetchers import Fetcher
page = Fetcher.get("https://www.scrapingcourse.com/ecommerce/")
if page.status != 200:
    print(f"Failed to fetch page: {page.status}")
    exit()
names = page.css("h2.woocommerce-loop-product__title")
prices = page.css(".price")
images = page.css(".woocommerce-LoopProduct-link img")
product_data = []
for name, price, image in zip(names, prices, images):
    price_value = price.re_first(r'[\d.,]+')
    
    data = {
        "name": name.text,
        "price": f"${price_value}",
        "image": image.attrib["src"],
    }
    product_data.append(data)
for product in product_data:
    print(product)

输出结构:

[
    {"name": "Abominable Hoodie", "price": "$69.00", "image": "https://...jpg"},
    {"name": "Artemis Running Short", "price": "$45.00", "image": "https://...jpg"}
]

7、Scrapling的局限性

Scrapling在中小规模爬取方面表现良好,但它遇到了一些障碍:

  • 没有内置的代理轮换:没有对轮换代理或自动地理定位的本地支持
  • 基于浏览器的爬取资源占用重:DynamicFetcherStealthyFetcher使用浏览器实例,消耗大量内存
  • 自适应功能需要手动启用:自适应功能默认情况下是禁用的,需要显式配置
  • 没有扩展基础设施:你需要自己管理并发、重试和分布式爬取
  • 自适应仅第一个元素:保存自适应数据时,只保存第一个元素的属性

8、使用Bright Data进行代理管理

为了克服Scrapling的代理限制,将其与Bright DataOxylabs等服务集成。此类提供商通常提供住宅代理、轮换IP和地理定位。我与这些品牌中的任何一个都没有隶属关系!

使用FetcherSession的示例:

from scrapling.fetchers import FetcherSession
proxies = {
    "http": "http://username:password@brd.superproxy.io:22225",
    "https": "http://username:password@brd.superproxy.io:22225",
}
with FetcherSession() as session:
    page = session.get(
        "https://www.scrapingcourse.com/ecommerce/",
        proxies=proxies
    )
    print(page.html_content)

你需要一个具有适当凭据的账户。这种集成有助于你避免IP禁令并以更高的量进行爬取。

9、Scrapling的最佳实践

在需要时启用自适应选择器:对于可能因网站更新而中断的关键选择器使用auto_save=True

选择正确的获取器:

  • Fetcher用于静态网站(最快)
  • DynamicFetcher用于具有基本保护的重JavaScript网站
  • StealthyFetcher用于具有高级反机器人系统的网站

对多个请求使用会话:通过会话类重用浏览器实例以减少开销

轮换代理:在大规模操作中防止IP阻止

添加速率限制:使用time.sleep()或队列系统来限制请求

利用内置的正则表达式:使用.re().re_first()方法进行精确的数据提取

优雅地处理错误:始终检查响应状态并处理异常

使用异步进行并发:利用AsyncFetcher和异步会话进行并行请求

10、结束语

Scrapling为你提供了一种更简洁、更有弹力的方式来构建2025年的爬虫。其自适应选择器和多个获取器选项使其成为从简单的静态页面到具有复杂反机器人保护的网站的理想选择。然而,它不是万无一失的——大规模操作仍然需要外部基础设施,如代理轮换和分布式系统。

将Scrapling与Bright Data或任何其他顶级轮换代理配对,你将拥有一个强大的设置,可以在无需持续维护的情况下处理大多数爬取挑战。该库的模块化设计(自v0.3.2以来)意味着你只安装你需要的东西,而其92%的测试覆盖率确保了可靠性。


原文链接: Web Scraping with Scrapling: 2025 Tutorial

汇智网翻译整理,转载请标明出处