scrapling-skill

支持反爬虫、多页爬取的Python网页数据提取技能。

已扫描
适合谁
需要自动化采集网页数据的技术人员、从事数据分析或市场调研的用户
不适合谁
无编程基础的普通用户、希望绕过网站协议进行大规模数据获取的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @sea2049/sea2049-scrapling-skill

Skill 说明

命令、参数、文件名以原文为准

Scrapling 网页抓取技能

目标

使用 Scrapling 提取网页数据,实现最小化选择器失效,并具备更强的反机器人防护能力。

在用户提出以下需求时优先使用本技能:

  • 网站数据抓取
  • 从 HTML 页面中提取数据
  • 具备 Cloudflare/反机器人防护能力的抓取
  • 多页面爬取
  • 将抓取任务转换为可复用的 Python 脚本

安全与合法性

开始抓取前,请始终:

  1. 确认目标网站符合用户意图且不违反当地法律法规。
  2. 避免未经授权的访问、绕过登录或抓取私密数据。
  3. 尊重目标网站的使用条款和合理的请求频率。
  4. 对于高频率任务,应添加延迟和域名级限流。

默认环境(当前机器)

所有依赖项应安装在 D:\clawtest 目录下。

推荐的设置命令如下:

python -m venv D:\clawtest\.venv
D:\clawtest\.venv\Scripts\python -m pip install -U pip
D:\clawtest\.venv\Scripts\python -m pip install "scrapling[fetchers]"
D:\clawtest\.venv\Scripts\scrapling install

说明:

  • 若仅需简单静态 HTML 数据提取,仅需执行 pip install scrapling 即可。
  • 使用基于浏览器的获取器时,必须运行 scrapling install

获取器选择指南

选择最轻量且能满足需求的选项:

  1. Fetcher

- 适用于静态页面,追求速度。

  1. StealthyFetcher

- 当目标站点可能存在反机器人检测时,作为默认首选。

  1. DynamicFetcher

- 当数据由 JavaScript 渲染时使用。

  1. Spider

- 用于多页面爬取、任务队列、并发处理及结构化导出。

标准工作流程

  1. 首先明确目标字段和输出数据结构。
  2. 选择合适的获取器(按顺序:FetcherStealthyFetcherDynamicFetcher)。
  3. 使用 CSS 或 XPath 提取数据,并转换为适合 JSON 的字段格式。
  4. 将数据保存为 JSON、JSONL 或 CSV 格式。
  5. 生产环境中添加重试机制、超时控制和礼貌性延迟。

代码模板

1)单页数据提取(默认使用 StealthyFetcher)

from scrapling.fetchers import StealthyFetcher

StealthyFetcher.adaptive = True
url = "https://example.com/products"
page = StealthyFetcher.fetch(url, headless=True, network_idle=True, timeout=45000)

items = []
for card in page.css(".product-card", auto_save=True):
    items.append({
        "title": card.css("h2::text").get(default="").strip(),
        "price": card.css(".price::text").get(default="").strip(),
        "url": card.css("a::attr(href)").get(default="")
    })

print(items)

2)自适应定位以应对布局变化

# 第一次运行时保存指纹:
products = page.css(".product-card", auto_save=True)

# 后续运行可在布局变动后自动恢复:
products = page.css(".product-card", adaptive=True)

3)Spider 爬取骨架

from scrapling.spiders import Spider, Response

class ProductSpider(Spider):
    name = "product_spider"
    start_urls = ["https://example.com/catalog"]

    async def parse(self, response: Response):
        for card in response.css(".product-card"):
            yield {
                "title": card.css("h2::text").get(default="").strip(),
                "price": card.css(".price::text").get(default="").strip(),
            }

        for href in response.css("a.next::attr(href)").all():
            yield response.follow(href, callback=self.parse)

if __name__ == "__main__":
    ProductSpider().start()

期望的助手输出格式

当使用此技能执行用户任务时,应返回:

  1. 所选获取器或 Spider 的策略及其原因;
  2. 针对目标网站定制的可运行脚本(或补丁);
  3. 当前机器上的精确安装与运行命令;
  4. 输出路径及数据结构说明;
  5. 反机器人可靠性说明及备用方案。

实用降级顺序

若数据提取失败,请按以下顺序尝试:

  1. 在最新 HTML 上验证选择器是否有效;
  2. Fetcher 切换至 StealthyFetcher
  3. 对于 JavaScript 渲染内容,切换至 DynamicFetcher
  4. 使用自适应选择器(先启用 auto_save=True,再启用 adaptive=True);
  5. 添加重试机制、指数退避和降低请求频率。
S
@sea2049

已收录 1 个 Skill

相关推荐