闲社
标题:
【教程】用Puppeteer+Node.js零成本打造自动化数据采集机器人
[打印本页]
作者:
kai_va
时间:
昨天 23:40
标题:
【教程】用Puppeteer+Node.js零成本打造自动化数据采集机器人
前言
最近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/
有问题欢迎在楼下交流!
欢迎光临 闲社 (https://www.xianshe.com/)
Powered by Discuz! X5.0