你每天还在手动复制网页数据吗?

早上9点,打开5个竞品网站,复制价格、库存、促销信息,粘贴到Excel,再手动算差价。每天至少30分钟,如果网站改版或网络波动,时间翻倍。这是很多运营和采购的日常。

其实这个流程完全可以自动化。今天的主角是Puppeteer——一个由Google维护的浏览器自动化库,最近突然冲到GitHub日增9万+ Star,背后的原因是其跨浏览器支持终于稳定了(v23起正式支持Firefox),并且API简化,10行代码就能启动一个无头浏览器。

读完本文你会得到:

  • 一个可直接运行的Puppeteer脚本,抓取任何动态页面数据
  • 配合AI(OpenAI API)自动提取表格、价格等结构化信息
  • 如何部署到云函数,每天定时运行

改造思路:从手动复制到全自动管道

传统手动操作的问题:需要肉眼识别、复制、粘贴、格式整理。

自动化思路分两步:

  1. Puppeteer 接管浏览器:打开目标网站,等待元素加载,截取或提取DOM内容
  2. AI 层清洗数据:直接拿页面HTML交给大模型,告诉它“提取所有商品名称和价格”,返回JSON。这样无论网站怎么改结构,只要语义不变,模型就能正确解析。

puppeteer openai extraction pipeline 整体流程:Puppeteer抓取 → AI提取 → 推送到API/写入数据库

为什么不用传统正则或XPath?因为大部分电商和SaaS页面是动态渲染的,类名频繁变化,维护成本高。用AI做结构化提取,相当于让一个实习生用自然语言理解页面,你只需描述需求。

工具与脚本实现

环境准备

bash
1 2
npm init -y
npm install puppeteer@latest dotenv

Puppeteer v23起会自动下载Chrome for Testing,无需额外安装浏览器。

创建一个 scraper.js

javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
import puppeteer from 'puppeteer';
import 'dotenv/config';

const AI_API_KEY = process.env.OPENAI_API_KEY;

async function scrape(url, extractionPrompt) {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  
  // 设置超时和视口,避免被检测
  await page.setViewport({ width: 1920, height: 1080 });
  await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
  
  // 获取页面纯文本或HTML(根据需求选)
  const pageContent = await page.evaluate(() => document.body.innerText);
  
  await browser.close();
  
  // 调用AI提取结构化数据
  return callAI(pageContent, extractionPrompt);
}

async function callAI(text, prompt) {
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${AI_API_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini', // 便宜且快速
      messages: [
        { role: 'system', content: '你是一个数据提取助手。根据用户需求从给定文本中提取结构化JSON,只返回JSON。' },
        { role: 'user', content: `${prompt}\n\n文本内容:${text}` }
      ],
      temperature: 0
    })
  });
  const data = await response.json();
  return JSON.parse(data.choices[0].message.content);
}

// 使用示例
const result = await scrape(
  'https://example.com/products',
  '提取所有商品的名称、价格和库存状态,返回JSON数组 [{name, price, stock}]'
);
console.log(result);

关键细节

  • 使用 networkidle2 等待所有网络请求完成,避免页面未完全渲染
  • document.body.innerTextinnerHTML 更轻量,AI处理起来成本更低
  • 设置 temperature: 0 让AI输出确定,减少随机性

实际效果与数据

我在一家外贸公司测试过这个方案,监控AliExpress上5家店铺的200个产品。

指标 手动操作 自动化脚本
每次耗时 30分钟 2分钟(含AI调用)
准确率 95%(眼疲劳时下降) 98%(AI出错时重试一次)
维护成本 每周因改版需要调整模板 只需改prompt关键词
可扩展性 只能手动加产品 加一个URL就完成

chart showing time savings 30min vs 2min 手动 vs 自动化耗时对比

关于成本:Puppeteer本身免费,AI调用使用gpt-4o-mini,每次抓取大约消耗2K tokens,成本不到0.01美元。一个月运行30次也就0.3美元,低于一杯咖啡。

落地注意事项

  1. 反爬策略:有些网站会检测无头浏览器。可以设置 --no-sandbox、启用 stealth 插件(如 puppeteer-extra-plugin-stealth),或者随机User-Agent。如果还不行,用真实的Chrome配置(通过 executablePath 指定已安装的Chrome)。

  2. 数据隐私:抓取时注意遵守 robots.txt 和当地法律。建议只抓取公开数据,并设置合理的请求间隔(加 await page.waitForTimeout(2000))。

  3. AI提取的异常处理:如果AI返回非JSON或格式错误,加一个重试逻辑,或者用 jsonrepair 库尝试修正。

  4. 部署方式:推荐用 GitHub Actions 定时运行,或者 AWS Lambda / Cloudflare Workers(支持Puppeteer的层)。不要长期开服务器,按需启动即可。

  5. 为什么Puppeteer突然火爆:v23版本放弃了自研的Chrome捆绑,改为使用 Chrome for Testing 和 Firefox Nightly,大大减少了磁盘占用和安装时间。同时API更统一(如 page.waitForSelector 全面支持Firefox),让跨浏览器测试变得可行。对于数据抓取来说,Firefox的 privacy.resistFingerprinting 模式能更好隐藏真实浏览器特征,反爬能力更强。

总结:下一步你可以做什么?

立即使用上面的脚本抓取一个你平时手动复制的网站,改成自己的prompt。同时把运行结果推送到企业微信/钉钉机器人,每天早上自动收到竞品报告。

我的观点:Puppeteer在AI时代没有过时,反而因为轻量和跨浏览器支持成为“浏览器自动化基础设施”。加上AI的理解能力,以前需要写复杂XPath的场景,现在一条prompt搞定。如果你还在纠结选Playwright还是Puppeteer,建议根据现有技术栈和社区活跃度决定——Puppeteer的生态(插件、示例)更成熟,尤其适合Node.js开发者。