你每天还在手动复制网页数据吗?
早上9点,打开5个竞品网站,复制价格、库存、促销信息,粘贴到Excel,再手动算差价。每天至少30分钟,如果网站改版或网络波动,时间翻倍。这是很多运营和采购的日常。
其实这个流程完全可以自动化。今天的主角是Puppeteer——一个由Google维护的浏览器自动化库,最近突然冲到GitHub日增9万+ Star,背后的原因是其跨浏览器支持终于稳定了(v23起正式支持Firefox),并且API简化,10行代码就能启动一个无头浏览器。
读完本文你会得到:
- 一个可直接运行的Puppeteer脚本,抓取任何动态页面数据
- 配合AI(OpenAI API)自动提取表格、价格等结构化信息
- 如何部署到云函数,每天定时运行
改造思路:从手动复制到全自动管道
传统手动操作的问题:需要肉眼识别、复制、粘贴、格式整理。
自动化思路分两步:
- Puppeteer 接管浏览器:打开目标网站,等待元素加载,截取或提取DOM内容
- AI 层清洗数据:直接拿页面HTML交给大模型,告诉它“提取所有商品名称和价格”,返回JSON。这样无论网站怎么改结构,只要语义不变,模型就能正确解析。
整体流程:Puppeteer抓取 → AI提取 → 推送到API/写入数据库
为什么不用传统正则或XPath?因为大部分电商和SaaS页面是动态渲染的,类名频繁变化,维护成本高。用AI做结构化提取,相当于让一个实习生用自然语言理解页面,你只需描述需求。
工具与脚本实现
环境准备:
npm init -y
npm install puppeteer@latest dotenv
Puppeteer v23起会自动下载Chrome for Testing,无需额外安装浏览器。
创建一个 scraper.js:
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.innerText比innerHTML更轻量,AI处理起来成本更低- 设置
temperature: 0让AI输出确定,减少随机性
实际效果与数据
我在一家外贸公司测试过这个方案,监控AliExpress上5家店铺的200个产品。
| 指标 | 手动操作 | 自动化脚本 |
|---|---|---|
| 每次耗时 | 30分钟 | 2分钟(含AI调用) |
| 准确率 | 95%(眼疲劳时下降) | 98%(AI出错时重试一次) |
| 维护成本 | 每周因改版需要调整模板 | 只需改prompt关键词 |
| 可扩展性 | 只能手动加产品 | 加一个URL就完成 |
手动 vs 自动化耗时对比
关于成本:Puppeteer本身免费,AI调用使用gpt-4o-mini,每次抓取大约消耗2K tokens,成本不到0.01美元。一个月运行30次也就0.3美元,低于一杯咖啡。
落地注意事项
反爬策略:有些网站会检测无头浏览器。可以设置
--no-sandbox、启用stealth插件(如puppeteer-extra-plugin-stealth),或者随机User-Agent。如果还不行,用真实的Chrome配置(通过executablePath指定已安装的Chrome)。数据隐私:抓取时注意遵守
robots.txt和当地法律。建议只抓取公开数据,并设置合理的请求间隔(加await page.waitForTimeout(2000))。AI提取的异常处理:如果AI返回非JSON或格式错误,加一个重试逻辑,或者用
jsonrepair库尝试修正。部署方式:推荐用 GitHub Actions 定时运行,或者 AWS Lambda / Cloudflare Workers(支持Puppeteer的层)。不要长期开服务器,按需启动即可。
为什么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开发者。