mcpField
S
scraperapi-crawler

scraperapi-crawler

github.com/scraperapi数据与数据库10107 次安装12 周前更新
代码仓库

关于 scraperapi-crawler

ScraperAPI Crawler 从种子 URL 出发,按 URL 模式发现并抓取链接页面,适合尚未掌握目标 URL、需要采集整站数据的用户。它支持深度或预算限制、定期运行,以及逐页 Webhook 投递。

主要功能

  1. 01从种子 URL 发现链接页面
  2. 02使用正则表达式包含或排除 URL
  3. 03按深度或请求预算限制爬取
  4. 04设置逐页抓取参数
  5. 05通过 Webhook 投递页面结果和摘要

适用场景

  1. 01在没有 URL 清单时采集网站页面
  2. 02用 URL 模式将爬取范围限定到站点某个部分
  3. 03限制未知站点的爬取规模或点数支出
  4. 04在长时间爬取过程中接收页面结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/scraperapi/scraperapi-skills --skill scraperapi-crawler

安装后在 Claude Code 中输入/scraperapi-crawler确认已加载。

详细介绍

ScraperAPI Crawler

Crawler 会从种子 URL 开始,自动发现并抓取关联页面,并跟进与正则表达式模式匹配的链接。如果你需要获取网站多个页面的数据,但尚未掌握这些页面的 URL,可以使用它。

何时不应使用 Crawler

  • 你已有确定的 URL 列表 → 改用 Async API,费用更低,也更可预测。
  • 你只需要单个页面 → 使用 Standard API(api.scraperapi.com)。
  • 内容需要登录才能访问 → Crawler 只能访问公开页面。
  • 使用免费套餐,且需要的深度 > 1 → 免费账户的上限为 max_depth: 1。

端点

操作方法URL
开始爬取POSThttps://crawler.scraperapi.com/job
查看状态GEThttps://crawler.scraperapi.com/job/<jobId>
取消爬取DELETEhttps://crawler.scraperapi.com/job/<jobId>

身份验证:在 JSON 请求体(POST)中加入 api_key,或将其作为查询参数(GET/DELETE)。

开始爬取

import os, requests

API_KEY = os.environ["SCRAPERAPI_API_KEY"]

job = requests.post(
    "https://crawler.scraperapi.com/job",
    json={
        "api_key":            API_KEY,
        "start_url":          "https://example.com/blog/",
        "url_regexp_include": "(?<full_url>https?://example\\.com/blog/.*)",
        "url_regexp_exclude": ".*\\.(pdf|png|jpg|zip)",
        "max_depth":          3,
        "crawl_budget":       500,
        "api_params": {
            "country_code": "us",
            "render":       False,
        },
        "callback": {
            "type": "webhook",
            "url":  "https://yourapp.com/crawler-results"
        },
    }
).json()

job_id = job["jobId"]
print(f"Started: {job_id}")

必需参数

参数说明
api_key你的 ScraperAPI 密钥(从环境变量中读取,切勿硬编码)
start_url种子 URL,即爬取的起始位置
url_regexp_include定义要爬取哪些 URL 的正则表达式(参见下方的模式)
max_depth 或 crawl_budget至少提供其中一个;如果两者都提供,则以先达到的限制为准

URL 正则表达式模式

url_regexp_include 和 url_regexp_exclude 是标准正则表达式。包含模式必须使用命名捕获组:绝对 URL 使用 (?<full_url>...),相对 URL 使用 (?<relative_url>...)。

# All pages on a domain
(?<full_url>https?://example\.com/.*)

# Only blog posts
(?<full_url>https?://example\.com/blog/.*)

# Only HTML pages — exclude files by requiring no extension
(?<full_url>https?://example\.com/[^.]*$)

# Relative paths (for sites that use relative links)
(?<relative_url>/products/.*)

排除模式(url_regexp_exclude — 普通正则表达式,无需捕获组):

# Skip binary files
.*\.(pdf|png|jpg|jpeg|gif|svg|zip|mp4)

# Skip auth and admin pages
.*(login|logout|signup|admin|auth).*

先使用范围较窄的 url_regexp_include,并在扩大规模前进行小规模测试——像 .* 这样的模式会跟进外部链接,进而爬取整个互联网。

深度与预算

适合使用 max_depth 的情况适合使用 crawl_budget 的情况
网站结构已知且范围明确网站规模未知
你想抓取特定版块(例如,从着陆页出发,经过 3 跳)你想限制额度消耗
小型网站链接密度难以预测的大型网站

同时使用两者可安全探索:max_depth: 3, crawl_budget: 500 会在任一限制先达到时停止。

深度 0 = 仅起始 URL。深度 1 = 起始 URL 加上它链接到的所有页面。深度 2 = 再深入一层,以此类推。

单页抓取参数(api_params)

控制每个发现页面的获取方式。支持所有标准 ScraperAPI 参数:

{
  "render":       true,
  "premium":      false,
  "ultra_premium": false,
  "country_code": "us",
  "device_type":  "desktop",
  "output_format": "markdown"
}

只有在网站使用 JavaScript 加载内容时才添加 render: true——它会使每个爬取页面的额度成本增加。请先测试不启用该选项的情况。

查看状态

import time, requests

def wait_for_crawl(job_id, api_key, poll_interval=10):
    url = f"https://crawler.scraperapi.com/job/{job_id}"
    while True:
        data = requests.get(url, params={"api_key": api_key}).json()
        status = data.get("status")
        print(f"Status: {status}")
        if status in ("completed", "failed", "cancelled", "delivered"):
            return data
        time.sleep(poll_interval)

任务状态:delayed → running → completed / failed / cancelled → in delivery → delivered。

对于长时间运行的爬取,请使用 Webhook 代替轮询——Webhook 会在每个页面抓取完成后推送结果,无需轮询等待最终结果。

Webhook

设置 callback 后,ScraperAPI 会在每个页面抓取完成时向你的端点发送 POST 请求(而不是仅在最后发送)。每个负载都包含爬取的 URL、HTML/内容、该请求的额度成本以及当前深度。

爬取完成后,还会发送最终摘要负载,列出所有成功/失败的 URL 和总成本。

{
  "callback": {
    "type": "webhook",
    "url": "https://yourapp.com/crawler-results"
  }
}

Webhook URL 必须可公开访问。ScraperAPI 最多会重试发送 3 次;Webhook 发送失败不会导致爬取本身停止。如果需要重新获取结果,结果还会保留最多 30 天。

计划任务

一次性爬取时省略 schedule。添加该参数即可按固定间隔运行:

{
  "schedule": {
    "name": "weekly-blog-crawl",
    "interval": "daily"
  }
}

可用间隔:once、hourly、daily、weekly、monthly。计划任务需要付费套餐——免费账户只能以 max_depth: 1 运行一次性爬取。

积分费用

Crawler 积分费用 = 抓取中的所有单个页面请求费用之和。每个页面的费用与使用相同 api_params(render、premium 等)的 Standard API 调用相同。

设置 crawl_budget 以限制总积分费用。达到预算时,抓取会正常停止,不会超出预算。失败的请求不收费。

检查每个 webhook 载荷中的 sa-credit-cost 标头,查看每页费用;根据此信息为后续运行调整 crawl_budget。

错误处理

代码含义操作
200已创建任务或已返回状态继续
400请求格式错误检查必填字段和正则表达式语法
401API 密钥无效检查 SCRAPERAPI_API_KEY
403积分已用尽或免费套餐深度限制升级套餐或降低 max_depth/crawl_budget
429并发任务过多等待后重试
500暂时性故障延迟后重试

文档

评论

支持 Markdown