Access Denied (103) 【教程】用Puppeteer+Node.js零成本打造自动化数据采集机器人 - 技能分享 - 闲社 - Powered by Discuz! Archiver

kai_va 发表于 5 天前

【教程】用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');
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/


有问题欢迎在楼下交流!
页: [1]
查看完整版本: 【教程】用Puppeteer+Node.js零成本打造自动化数据采集机器人