用 Claude Code 构建每日网页爬虫
如果你在网上销售产品、发布内容,或者运营任何类型的网站,你可能需要定期检查各种信息。产品评分、评论数量、竞争对手页面、内容归档。这类监控每次只需要几分钟,但每天做的话,累积起来会消耗大量时间。
无论你是在审查自己的网站,还是在关注其他地方的变化,需求都是一样的:按照预定计划从网站获取新鲜数据,而不需要手动操作。这就是网页爬虫。
Claude Code 可以在这方面提供帮助,无论是追踪 Amazon 商品列表、盘点 WordPress 博客,还是监控竞争对手页面,只要网站结构保持相对稳定即可。
这不是那种让人驻足惊叹的 AI 应用场景,但它确实能在你的工作周中节省大量时间,把繁琐、重复的工作从你手中接过来。
在本文中,你将看到如何使用 Claude Code 来实现这一目标:一个每天自动爬取 Amazon 的 Playwright 脚本、数据变化时发送邮件提醒,以及整个流程通过 GitHub Actions 自动运行。
这个示例是为 Amazon 构建的,Amazon 的页面结构比较稳定,所以很适合。但你可以将相同的方法应用于你自己的使用场景,只要你要追踪的网站不会频繁更改布局即可。
1、AI 能力的进化
公众对 AI 能力的看法似乎总是遵循相同的模式。一个实验室发布了某个功能的早期版本,人们尝试后大声抱怨缺陷和不可靠。实验室不断改进,持续推出一个又一个更新,然后某个时候缺陷被解决了,功能变得非常可靠,却没人再谈论它了,因为大家都已经转去抱怨下一个新功能了。
首先是图像生成,有各种奇怪的瑕疵使其无法用于任何严肃场景,然后它不会画手,现在它基本上完美了。视频画质低劣且物理效果不合理,一段时间后新闻媒体开始报道 Brad Pitt 和 Tom Cruise 之间近乎完美的 AI 打斗场面。我们都知道编程方面的发展——SWE 嘲笑 vibe coder 和 LLM 生成的粗劣代码,而模型在每个版本中稳步改进,然后突然之间 Karpathy 在一月份发帖说 agent 在编写他 80% 的代码,二月份又说 agent 在为他完成整个项目。
有一个领域,agent 能力最近已经跨越了实用和可靠的门槛,但我几乎没听人谈论过——网页浏览。自从 OpenAI 在 ChatGPT 中推出网页使用预览功能以来,我一直在试用,一开始简直差得离谱,直到突然间,当 Claude 推出 Opus 4.5 时,它就正常工作了。大多数人都太专注于该模型的 agentic 编程能力,没有注意到这一点,但它突然间就完美地通过了我的所有测试。然后 Sonnet 4.5 让它变得更便宜,4.6 模型让它变得更好。
所以,如果你一直因为需要使用网页而没有实施某个 AI 工作流,现在是时候试一试了!
我将带你了解一个我每天运行的简单网页爬虫任务,以及如何设置类似的功能,同时我也会讨论一些仍然存在的局限性。
2、我为什么每天爬取 Amazon(以及追踪什么)
我在 Amazon 上拥有十几个品牌,各种形式的 AI 对我能够跟上所有品牌的节奏而不必一直工作至关重要。大多数情况下我让 Claude Code 使用 Amazon API,但有些信息 Amazon 不会通过这种方式公开。
这个类别中有几件事我希望能每天为每个产品追踪:
- 评分数量有变化吗? 如果有,平均评分有变化吗?
- 有徽章出现或消失吗? Amazon 有时会在产品页面上放置徽章,它们可能是正面的(如 Amazon's Choice)或负面的(如 Frequently Returned)。
这可不是什么好事!
- 有变体突然从列表中分离出来了吗? 有时候,Amazon 会出于某种原因将某个产品变体(比如某种特定颜色的产品)从主产品页面移除并独立成页。Amazon 不会告诉你它什么时候这样做,而且它通常仍然会在你的卖家后台中显示,好像没有被分离一样。唯一确定的方法就是去产品页面查看所有变体。
所以,让 Claude 来处理吧!但在构建流程之前,我们先了解一下可以采用的几种方法。
3、网页爬虫选型
3.1 Claude in Chrome
去年十二月,Anthropic 开放了 Claude in Chrome 的公开测试版。它是一个 Chrome 扩展程序,让 Claude 可以控制你的浏览器来执行基于网页的任务。它可以作为独立工具使用,此时你会在右侧边栏看到一个熟悉的聊天界面,可以在其中让 Claude 做事情。
Claude in Chrome 截取了关于 Claude in Chrome 的文章的截图并将其添加到文章中。套娃了!
另外,Claude Code 也可以启动 Claude in Chrome。当 Claude Code 在构建 Web 应用程序时,这特别有用——它可以通过让用户点击和操作来进行测试。
我绝对推荐试一试——这是了解浏览器 agent 当前状态的好方法。
3.2 Playwright
Claude 访问网页的另一种方式是使用 Playwright,它是一个浏览器自动化框架,可以让你以编程方式控制浏览器。它基于底层代码理解页面内容(与 Claude in Chrome 不同,后者通过截图来"看"页面上的内容),然后 Claude 编写代码来告诉浏览器执行操作,比如点击按钮。
3.3 重复爬取该选哪个
那么,我们该用哪个呢?诚实的答案是,在绝大多数情况下,Playwright 是更好的选择。它速度快得多,也可靠得多。Claude in Chrome 的优势在于能够在工作流中插入一些智能(例如解释页面上的信息,然后根据模糊的标准决定是否采取行动),但如果你只是做不需要中间决策的重复性网页浏览任务,那你就不需要这种智能。
3.4 Playwright MCP vs. 直接编写脚本
这就引出了我们的第二个决定:是使用 Playwright MCP 还是让 Claude 直接编写 Playwright 代码。通常,MCP 更适合 Claude 执行的临时任务或探索性工作。它为 Claude Code 提供了执行导航到页面或点击元素等任务的工具,而不需要每次都编写完整的代码。
但对于重复性任务,你会想让 Claude 编写一个 Playwright 脚本。一方面,它执行更快。除此之外,它也更健壮和一致,因为不需要 Claude 在过程中主动做任何决策。这意味着你可以在 GitHub Actions 或类似工具上设置它来运行,脚本一旦写好就不需要 Claude 参与了。
4、如何用 Claude Code 逐步构建网页爬虫
4.1 安装 Playwright 和 Playwright MCP
首先:安装 Playwright 和 Playwright Chromium,加上 Playwright MCP。前两者是 Claude 使用 Playwright 所需的库以及执行 Playwright 代码所用的浏览器。我上面提到过我们不想用 MCP 来做日常自动化,但你还是应该安装它,因为它能让 Claude 在编写脚本之前更方便地浏览页面并确定元素的位置。我可以给你安装命令,但说实话,你应该直接让 Claude 来做。
4.2 确定要爬取什么、存储什么、通知什么
搞定这些之后,我们来搭建一个我的爬虫的简单版本。我们希望它访问预设的 Amazon URL 列表,找到评分数量和平均值并保存,然后与昨天的数据进行比较,如果有变化就提醒我。
为此,我们需要几样东西:
- 要爬取的 URL
- 存储收集到的信息的地方
- 通知我变化的机制
- 每天运行任务的方式
我们有 URL,所以没问题。至于存储位置,你需要考虑收集的数据量以及是否需要进行长期分析。
例如,我有一个单独的任务每天从 Amazon Ads API 拉取大量数据。我用它来构建按天记录的广告表现历史,数据量相当大。因此,我将所有内容存储在一个在线的 SQLite 数据库中,同时也同步到本地机器。这样既能方便地查询数据,又做了备份——以防硬盘或云数据库出问题。
这个情况不同;我收集的信息很少,也不需要对数据进行任何复杂的查询。我甚至不太关心历史记录,只关心每日更新。在这种情况下,几乎什么都可以用,从 Google 表格到本地文件都行。我坚信不要把事情搞得太复杂,所以我们就用最简单的方法——一个 .txt 文件。
4.3 测试第一次爬取并保存数据
到这一步,我们已经有了足够的东西来测试流程的初始部分——爬取数据并保存。我从多年的产品经理经验中学到,最好先单独测试工作流中的各个组件,确保它们各自正常工作,然后再组合起来。所以让我们让 Claude 试一试。
提示词:
我们要构建一个工作流,每天检查公开的 Amazon 产品页面,爬取评论数量和平均评分,然后如果与前一天相比有变化就通知我。现在我想让你先测试流程的第一部分——爬取一个 URL,获取两方面的信息并保存到本地 txt 文件中。你已经安装了 Playwright MCP,可以用它来探索页面,但最终你需要编写一个可以每天自动运行的 Playwright 脚本。
注意我在给出具体任务之前先提供了更广泛的上下文。因为这是一个我们将在整个对话中逐步构建的场景,最好让 Claude 知道我们的目标是什么。我还告诉它已安装了 Playwright MCP,因为虽然它通常会在不被提示的情况下检查这一点,但并不是百分之百一致,有时可能直接开始编写自己的 Playwright 代码。
你的 Claude 实例可能会问你是否有特定的 Amazon 页面想用作测试用例;我的 Claude 知道我销售的所有产品的 URL,所以直接用其中一个开始了。你会看到它弹出一个新的 Chrome 窗口,这个窗口与你当前打开的任何窗口是分开的,不共享 cookie 等上下文信息,从安全角度来看这是好事(它无法访问你已登录的网站),但也有一些我们稍后会讨论的缺点。
我的花了大约两分钟然后回来确认成功了。
完美!因为我给了它完整的流程上下文,它主动提出进入下一步,但在继续之前询问它要做什么并添加更多有用的上下文总是一个好习惯。下一个提示词:
先解释比较和提醒的逻辑。另外,我希望能通过邮件收到提醒——你会怎么设置?
以下是部分回复:
在这种情况下,它使用了我们之前构建的通过 GitHub Actions 在本地运行并通过 Gmail 发送提醒的提醒系统的历史上下文。为了简便,我推荐这两种方式,所以让我们来设置它们。
4.4 设置 Gmail 提醒和 GitHub Secrets
首先,你需要一个 GitHub 账号;我假设你已经有了一个,如果没有,就让 Claude 帮你设置。设置好后,让它为项目创建一个仓库。
然后,前往 https://myaccount.google.com/apppasswords 获取 Gmail 应用专用密码。给它起个名字,点击创建,你会看到一个 16 位密码。关于如何将密码上传为 GitHub Secret,你有两个选择——你可以直接把密码给 Claude 让它上传,从安全角度来看这不是个好主意,或者你可以输入:
gh secret set GMAIL_APP_PASSWORD --repo Awillen/REPO_NAME
其中 GMAIL_APP_PASSWORD 是密码,REPO_NAME 是 Claude 刚创建的仓库名称(你还应该把 Awillen 替换成你的用户名)。它还需要存储发送提醒的邮箱地址(你刚获取密码的那个)和接收提醒的邮箱地址(这两个可以是同一个),但这些直接给 Claude 设置也没问题。
4.5 测试比较和提醒逻辑
设置好后,让 Claude 开始构建!它可能会自己做一些测试,如果没有,就让它测试以下内容:
- 在 txt 文件中添加一行显示评分数量和平均评分变化的数据,然后触发比较和提醒工作流
- 添加一行显示没有变化的数据,然后触发工作流
如果一切正常,第一种情况应该会触发一封邮件。
能用但不太美观……让我们让 Claude 美化一下。
好多了!
第二种情况不应该发送任何邮件(尽管 Claude 会在控制台确认它确实运行了)。
4.6 设置工作流每天运行
现在最后一步是自动化。一切已经在 GitHub 中配置好了,我们只需要设置每天运行。直接让 Claude 来做,确保你指定了要在本地机器上运行(更多内容见下文)——它会搞定一切,你就设置好了!只要 Amazon 上你指定的产品的评论有变化,你每天都会收到一封邮件。
5、局限性和注意事项
虽然很简单(希望如此),但这种任务有几种可能变得更复杂的情况:
5.1 访问挑战:IP 封锁和身份验证
对于这个项目来说,你必须使用本地机器上的 GitHub Actions Runner(而不是 GitHub 托管的),因为 Amazon 以封锁爬取尝试而闻名,并且能够识别 GitHub 的 IP 地址。Amazon 不是唯一这样做的公司,所以如果你计划对这类任务使用托管服务,请务必先测试。
你可能会遇到的另一个问题是需要登录用户账户才能访问非公开页面。在实际实施这个演示时,当我的产品有新评分时,我想检查是否有新评论(大多数人只会给产品打星但不会实际写评论)。不幸的是,只有登录后才能查看完整的评论列表。
如果你遇到类似的情况,你可以把你的账户凭据给 Claude 来登录(理想情况下应作为 GitHub 等服务的 Secret 安全存储),或者为它创建一个专用用户账户。但在这里,我太担心 Amazon 会将任何机器人活动与我的账户或从我 IP 登录的其他账户关联起来,因为这类事情会导致自动化系统标记你的账户,这将是一场噩梦,因为它很可能会影响我的 Amazon 卖家账户。恐怕不值得冒这个险。
我还要提醒一下,使用 Google 应用专用密码虽然方便,但并不是最安全的选择。在便利性和安全性之间做权衡时要慎重考虑。
5.2 Playwright 脚本的脆弱性(以及 CAPTCHA 处理)
在我做 PM 的上一份工作中,我们使用 Playwright 来访问客户的一些软件,当时没有可行的替代方案(如 API)。这基本上运行良好,给了我们相比竞争对手的巨大优势——那些竞争对手只会耸耸肩告诉潜在客户,没有 API 就无法集成。
我不知道他们是否知道 Playwright 是一个选项(这是与抵押贷款相关的软件,行业中的大多数公司没有最优秀的工程师),或者他们只是因为知道它最大的弱点而不想用——它可能很脆弱。
每天运行预编写的 Playwright 脚本的问题是,如果你爬取的页面发生了变化,很有可能会破坏你的脚本。如果你想在关键场景中使用它,这显然是个问题,所以要考虑页面变化的可能性有多大。
我上面没提到的一件事是,在构建这个爬虫时,Claude 在尝试访问页面时遇到了 Amazon 的 CAPTCHA。这是一个非常简单的 CAPTCHA(只需要点击一个按钮继续),所以很容易在脚本中添加逻辑来处理。但如果它弹出更复杂的验证码,脚本就无法处理了。
好消息是,如果你预期会遇到更动态的网站或有潜在障碍的网站,你可以采用另一种方法——让 Claude Code 通过定时任务来执行爬取。如果你走这条路,它可以使用 Playwright MCP 来导航页面并找出如何获取你需要的信息,即使信息不在你预期的位置。对于简单的网页爬虫场景,这有点大材小用(如果你要爬取很多页面,它会快速消耗 token),但对于复杂或关键的工作流,值得记住这个选项。
5.3 爬虫故障时的监控和提醒
因为我只关心产品的评分数量是否变化,所以我设置了流程:如果一切和前一天一样,就不发送邮件。缺点是,如果我没收到邮件,我无法区分是因为没有变化还是整个工作流失败了。
这不太理想,因为一旦你有足够多的日常监控任务在运行,其中一些最终会失败,你会想知道哪些出了问题。所以,有几个选项:
- 即使没有变化也发送邮件。 这样你就知道没收到邮件就是有问题。但经验告诉我,如果你很忙,可能不会立刻注意到错过了每日邮件。
- 使用 GitHub Actions 通知。 这些默认开启,如果出现失败会给你发邮件,非常有帮助。但它们在 runner 从未启动时不起作用(例如你在本地运行但电脑关了),而且它们不够智能,无法判断脚本本身出了什么不是运行失败的问题(例如网页结构变化导致爬虫无法收集信息)。
- 使用单独的服务来监控故障。 一个定时运行的 Claude Code 任务是个不错的选择——让它在你 GitHub Action 运行之后每天运行一次,检查并确保 txt 文件已正确更新。如果你有很多这样的任务在每天运行,绝对值得用一个外部服务对所有任务做一次快速检查。
6、结束语
如果你一直在手动定期检查某个网站,这是开始自动化的好起点。
选一个你每周都在检查的东西,把这篇文章分享给 Claude Code,让它帮你构建一个爬虫。
如果你试了,我们很想知道效果如何。欢迎在评论区分享你正在追踪什么、想爬取什么,或者工作中还有哪些你想自动化的使用场景。
原文链接: How to Build a Daily Web Scraper with Claude Code
汇智网翻译整理,转载请标明出处