前言
最近GitHub Trending上Puppeteer项目热度持续走高(94k+ stars),这个项目是Google官方出品的Node.js库,可以用代码控制Chrome/Firefox浏览器。今天手把手教你用它做一个自动化数据采集机器人,无需购买任何API服务,完全零成本。
一、前置条件
- 已安装Node.js(建议v18+)
- 基础JavaScript知识
- 一台能联网的电脑(Windows/Mac/Linux均可)
二、环境搭建
- # 创建项目目录
- mkdir puppeteer-bot && cd puppeteer-bot
- # 初始化项目
- npm init -y
- # 安装Puppeteer
- npm install puppeteer
复制代码
安装完成后,Puppeteer会自动下载对应版本的Chromium浏览器,无需手动配置。
三、核心代码实战
3.1 基础版:抓取网页标题
- const puppeteer = require('puppeteer');
- (async () => {
- // 启动浏览器
- const browser = await puppeteer.launch({
- headless: true // 无头模式,不显示界面
- });
-
- const page = await browser.newPage();
-
- // 访问目标页面
- await page.goto('https://github.com/trending');
-
- // 等待内容加载
- await page.waitForSelector('article h2');
-
- // 提取数据
- const titles = await page.evaluate(() => {
- const items = document.querySelectorAll('article h2');
- return Array.from(items).map(item => item.innerText.trim());
- });
-
- console.log('今日热门项目:');
- titles.forEach((title, index) => {
- console.log(`${index + 1}. ${title}`);
- });
-
- await browser.close();
- })();
复制代码
3.2 进阶版:带登录状态的采集
很多网站需要登录才能看到完整内容,Puppeteer可以轻松处理:
- const puppeteer = require('puppeteer');
- (async () => {
- const browser = await puppeteer.launch({ headless: false });
- const page = await browser.newPage();
-
- // 设置视窗大小
- await page.setViewport({ width: 1280, height: 800 });
-
- // 访问登录页
- await page.goto('https://example.com/login');
-
- // 填写表单
- await page.type('#username', 'your_username');
- await page.type('#password', 'your_password');
-
- // 点击登录按钮
- await page.click('#login-btn');
-
- // 等待跳转
- await page.waitForNavigation();
-
- // 保存Cookie供后续使用
- const cookies = await page.cookies();
- require('fs').writeFileSync('cookies.json', JSON.stringify(cookies));
-
- console.log('登录成功,Cookie已保存');
-
- await browser.close();
- })();
复制代码
3.3 高级版:定时任务+数据存储
- const puppeteer = require('puppeteer');
- const fs = require('fs');
- async function scrapeData() {
- const browser = await puppeteer.launch({ headless: true });
- const page = await browser.newPage();
-
- // 加载之前保存的Cookie
- if (fs.existsSync('cookies.json')) {
- const cookies = JSON.parse(fs.readFileSync('cookies.json'));
- await page.setCookie(...cookies);
- }
-
- await page.goto('https://example.com/data-page');
-
- // 提取结构化数据
- const data = await page.evaluate(() => {
- const rows = document.querySelectorAll('.data-row');
- return Array.from(rows).map(row => ({
- title: row.querySelector('.title')?.innerText || '',
- price: row.querySelector('.price')?.innerText || '',
- link: row.querySelector('a')?.href || ''
- }));
- });
-
- // 保存到JSON文件
- const timestamp = new Date().toISOString().split('T')[0];
- fs.writeFileSync(
- `data-${timestamp}.json`,
- JSON.stringify(data, null, 2)
- );
-
- console.log(`成功采集 ${data.length} 条数据`);
-
- await browser.close();
- }
- // 立即执行一次
- scrapeData();
- // 每6小时执行一次
- setInterval(scrapeData, 6 * 60 * 60 * 1000);
复制代码
四、防检测技巧
很多网站有反爬虫机制,以下是绕过方法:
- 修改User-Agent:模拟真实浏览器
- 随机延迟:操作之间加入随机等待时间
- 禁用WebDriver标志:避免被检测为自动化工具
- 使用代理IP:防止IP被封禁
- const browser = await puppeteer.launch({
- headless: true,
- args: [
- '--disable-blink-features=AutomationControlled',
- '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
- ]
- });
- // 随机延迟函数
- const randomDelay = (min, max) =>
- new Promise(resolve => setTimeout(resolve, Math.random() * (max - min) + min));
- await randomDelay(1000, 3000); // 等待1-3秒
复制代码
五、常见问题
Q1: 启动报错找不到Chromium?
A: 设置环境变量或手动指定路径:- const browser = await puppeteer.launch({
- executablePath: '/usr/bin/chromium-browser'
- });
复制代码
Q2: 页面加载超时?
A: 增加超时时间或等待特定元素:- await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
复制代码
Q3: 中文乱码?
A: 确保页面编码正确,必要时手动指定:- await page.setExtraHTTPHeaders({
- 'Accept-Language': 'zh-CN,zh;q=0.9'
- });
复制代码
Q4: 内存占用过高?
A: 及时关闭不用的页面,使用page.close()代替browser.close()进行多页面操作。
六、总结
Puppeteer是一个功能强大的自动化工具,本文介绍了从基础到进阶的使用方法:
- 基础抓取:获取页面内容和标题
- 登录处理:保存和复用Cookie
- 定时任务:自动化数据采集和存储
- 反检测技巧:绕过常见的反爬虫机制
相比付费API,Puppeteer的优势在于完全免费、灵活性高、能处理复杂交互。无论是数据采集、自动化测试还是网页截图,它都能胜任。
扩展阅读:
- Puppeteer官方文档:https://pptr.dev/
- Playwright(微软出品,支持多浏览器):https://playwright.dev/
有问题欢迎在楼下交流! |