你将构建什么
一个包含以下内容的 GitHub 仓库:- 一个
skus.json文件,列出要监控的 Amazon 产品 URL - 一个 Python 脚本,将 SKU 列表 POST 到 Bright Data Amazon Scraper API
- 一个 GitHub Actions 工作流,按每日计划运行脚本
- Bright Data 配置为将每个快照交付到你的 S3 桶
前提条件
- 一个 Bright Data 账户,包括 API 密钥(获取你的密钥)
- 一个已配置 Bright Data 交付的 S3 桶。请按照 Amazon 到 S3 交付 完成一次,然后返回。本教程假设交付目标已保存在你的 Amazon Scraper 设置中。
- 一个 GitHub 账户和一个新的(空)仓库
- 本地安装的 Python 3.9+
- 本地安装的 Git
第 1 部分:创建 SKU 列表
在本地克隆你的空 GitHub 仓库,并在仓库根目录创建skus.json 文件:
skus.json
第 2 部分:编写触发脚本
在仓库根目录创建trigger_scrape.py:
trigger_scrape.py
requirements.txt:
- **脚本不等待结果。**它触发脚本然后退出。Bright Data 异步运行爬取,并通过你在 Scraper 设置中保存的交付配置直接将结果交付到 S3。这是整个要点:脚本是一个廉价的、无状态的触发器。
- **API 密钥来自环境变量。**永远不要将密钥提交到仓库。我们将在第 4 部分将其关联到 GitHub Actions Secrets。
第 3 部分:在本地运行
安装依赖项并使用你的密钥运行脚本:价格字段是
final_price,对于缺货或通货不明确的商品,它可以是 null。你的 BI 管道应该显式处理这种情况,而不是在缺少键时崩溃。snapshot_id 而非日期来命名。这是有意为之的:每个快照都是不可变的,你可以按创建时间戳或启用版本控制来按时间顺序遍历桶。我们将在”后续步骤”中讨论命名约定。
第 4 部分:在 GitHub Actions 上调度工作流
现在让我们将触发器从你的笔记本电脑移到每日计划。 创建.github/workflows/daily-scrape.yml:
.github/workflows/daily-scrape.yml
schedule: cron: "0 6 * * *"每天在 06:00 UTC 运行作业。调整 cron 表达式以适应你的时区。GitHub 不保证计划工作流的启动时间。GitHub 的 触发工作流的事件 参考说明,计划运行“can be delayed during periods of high loads”,高负载时段包括每个整点。workflow_dispatch在 Actions 选项卡中添加一个 Run workflow 按钮,以便你无需等待计划即可按需启动作业。
- 在你的 GitHub 仓库中,转到 Settings > Secrets and variables > Actions
- 点击 New repository secret
- 将其命名为
BRIGHTDATA_API_KEY并粘贴你的密钥 - 点击 Add secret
第 5 部分:推送并验证
提交所有内容并推送:故障排除
为什么 2 分钟后 S3 中仍没有文件?
先检查作业状态,再检查桶。将第 3 部分中trigger_scrape.py 打印的 snapshot_id 发送到 监控进度(GET /datasets/v3/progress/{snapshot_id}),并查看 status 字段:
starting或running:Amazon Scraper API 仍在采集。稍等后再次检查。ready:爬取已完成,问题出在交付环节。检查 Amazon 爬虫交付设置中保存的 S3 目标以及桶权限。IAM 角色必须允许对该桶执行s3:PutObject。参见交付指南中的 S3 中没有出现文件?。
为什么触发脚本返回 401?
Bright Data API 拒绝了该 API 密钥。带有Invalid credentials 的 401 表示密钥值错误。在本地,检查你导出的 BRIGHTDATA_API_KEY 的值。在 GitHub Actions 中,检查 Settings > Secrets and variables > Actions 下的仓库密钥,密钥名称必须正好是 BRIGHTDATA_API_KEY。如果缺少该密钥,脚本会打印 BRIGHTDATA_API_KEY environment variable is not set.,而不是返回 401。
为什么 final_price 为 null?
对于缺货的商品和货币不明确的商品,Amazon Scraper API 会将 final_price 返回为 null。请查看同一记录中的 availability 字段。在你的 BI 管道中处理 null,不要将其视为错误。
为什么计划工作流没有运行?
GitHub 默认以 UTC 运行计划工作流,因此0 6 * * * 在 06:00 UTC 触发,而不是你所在时区的 06:00。GitHub Actions schedule 事件参考 还列出了以下限制:
- 高负载期间计划运行可能被延迟,高负载时段包括每个整点。负载足够高时,GitHub 可能丢弃排队的作业。GitHub 建议将计划设在整点以外的分钟,例如
17 6 * * * - 计划工作流只从默认分支上的工作流文件运行
- 在公共仓库中,如果 60 天内没有仓库活动,GitHub 会禁用计划工作流
恭喜
你已经构建了一个完全自动化的每日价格监控器:- 在 GitHub 中版本控制的 SKU 列表
- 触发 Bright Data 爬取然后退出的 Python 触发脚本
- 按每日 cron 运行并通过仓库密钥进行身份验证的 GitHub Actions 工作流
- 将每个快照异步放入你的桶中的 Bright Data S3 交付
后续步骤
流式传输大型快照
使用
stream_max_lines 在第一条记录准备好后立即开始接收批次。Amazon 异步参考
异步触发端点的完整参数列表,包括
include_errors 和 limit_per_input。监控交付状态
以编程方式从工作流内部检查快照状态和交付结果。
投递结果
使用相同的触发调用将 S3 替换为 GCS、Azure、Snowflake 或 SFTP。