返回顶部
7*24新情报

【教程】用Puppeteer+Node.js零成本打造自动化数据采集机器人

[复制链接]
kai_va 显示全部楼层 发表于 昨天 23:40 |阅读模式 打印 上一主题 下一主题
前言

最近GitHub Trending上Puppeteer项目热度持续走高(94k+ stars),这个项目是Google官方出品的Node.js库,可以用代码控制Chrome/Firefox浏览器。今天手把手教你用它做一个自动化数据采集机器人,无需购买任何API服务,完全零成本。

一、前置条件


  • 已安装Node.js(建议v18+)
  • 基础JavaScript知识
  • 一台能联网的电脑(Windows/Mac/Linux均可)


二、环境搭建
  1. # 创建项目目录
  2. mkdir puppeteer-bot && cd puppeteer-bot
  3. # 初始化项目
  4. npm init -y
  5. # 安装Puppeteer
  6. npm install puppeteer
复制代码

安装完成后,Puppeteer会自动下载对应版本的Chromium浏览器,无需手动配置。

三、核心代码实战

3.1 基础版:抓取网页标题
  1. const puppeteer = require('puppeteer');
  2. (async () => {
  3.   // 启动浏览器
  4.   const browser = await puppeteer.launch({
  5.     headless: true  // 无头模式,不显示界面
  6.   });
  7.   
  8.   const page = await browser.newPage();
  9.   
  10.   // 访问目标页面
  11.   await page.goto('https://github.com/trending');
  12.   
  13.   // 等待内容加载
  14.   await page.waitForSelector('article h2');
  15.   
  16.   // 提取数据
  17.   const titles = await page.evaluate(() => {
  18.     const items = document.querySelectorAll('article h2');
  19.     return Array.from(items).map(item => item.innerText.trim());
  20.   });
  21.   
  22.   console.log('今日热门项目:');
  23.   titles.forEach((title, index) => {
  24.     console.log(`${index + 1}. ${title}`);
  25.   });
  26.   
  27.   await browser.close();
  28. })();
复制代码

3.2 进阶版:带登录状态的采集

很多网站需要登录才能看到完整内容,Puppeteer可以轻松处理:
  1. const puppeteer = require('puppeteer');
  2. (async () => {
  3.   const browser = await puppeteer.launch({ headless: false });
  4.   const page = await browser.newPage();
  5.   
  6.   // 设置视窗大小
  7.   await page.setViewport({ width: 1280, height: 800 });
  8.   
  9.   // 访问登录页
  10.   await page.goto('https://example.com/login');
  11.   
  12.   // 填写表单
  13.   await page.type('#username', 'your_username');
  14.   await page.type('#password', 'your_password');
  15.   
  16.   // 点击登录按钮
  17.   await page.click('#login-btn');
  18.   
  19.   // 等待跳转
  20.   await page.waitForNavigation();
  21.   
  22.   // 保存Cookie供后续使用
  23.   const cookies = await page.cookies();
  24.   require('fs').writeFileSync('cookies.json', JSON.stringify(cookies));
  25.   
  26.   console.log('登录成功,Cookie已保存');
  27.   
  28.   await browser.close();
  29. })();
复制代码

3.3 高级版:定时任务+数据存储
  1. const puppeteer = require('puppeteer');
  2. const fs = require('fs');
  3. async function scrapeData() {
  4.   const browser = await puppeteer.launch({ headless: true });
  5.   const page = await browser.newPage();
  6.   
  7.   // 加载之前保存的Cookie
  8.   if (fs.existsSync('cookies.json')) {
  9.     const cookies = JSON.parse(fs.readFileSync('cookies.json'));
  10.     await page.setCookie(...cookies);
  11.   }
  12.   
  13.   await page.goto('https://example.com/data-page');
  14.   
  15.   // 提取结构化数据
  16.   const data = await page.evaluate(() => {
  17.     const rows = document.querySelectorAll('.data-row');
  18.     return Array.from(rows).map(row => ({
  19.       title: row.querySelector('.title')?.innerText || '',
  20.       price: row.querySelector('.price')?.innerText || '',
  21.       link: row.querySelector('a')?.href || ''
  22.     }));
  23.   });
  24.   
  25.   // 保存到JSON文件
  26.   const timestamp = new Date().toISOString().split('T')[0];
  27.   fs.writeFileSync(
  28.     `data-${timestamp}.json`,
  29.     JSON.stringify(data, null, 2)
  30.   );
  31.   
  32.   console.log(`成功采集 ${data.length} 条数据`);
  33.   
  34.   await browser.close();
  35. }
  36. // 立即执行一次
  37. scrapeData();
  38. // 每6小时执行一次
  39. setInterval(scrapeData, 6 * 60 * 60 * 1000);
复制代码

四、防检测技巧

很多网站有反爬虫机制,以下是绕过方法:


  • 修改User-Agent:模拟真实浏览器
  • 随机延迟:操作之间加入随机等待时间
  • 禁用WebDriver标志:避免被检测为自动化工具
  • 使用代理IP:防止IP被封禁

  1. const browser = await puppeteer.launch({
  2.   headless: true,
  3.   args: [
  4.     '--disable-blink-features=AutomationControlled',
  5.     '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  6.   ]
  7. });
  8. // 随机延迟函数
  9. const randomDelay = (min, max) =>
  10.   new Promise(resolve => setTimeout(resolve, Math.random() * (max - min) + min));
  11. await randomDelay(1000, 3000);  // 等待1-3秒
复制代码

五、常见问题

Q1: 启动报错找不到Chromium?
A: 设置环境变量或手动指定路径:
  1. const browser = await puppeteer.launch({
  2.   executablePath: '/usr/bin/chromium-browser'
  3. });
复制代码

Q2: 页面加载超时?
A: 增加超时时间或等待特定元素:
  1. await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
复制代码

Q3: 中文乱码?
A: 确保页面编码正确,必要时手动指定:
  1. await page.setExtraHTTPHeaders({
  2.   'Accept-Language': 'zh-CN,zh;q=0.9'
  3. });
复制代码

Q4: 内存占用过高?
A: 及时关闭不用的页面,使用page.close()代替browser.close()进行多页面操作。

六、总结

Puppeteer是一个功能强大的自动化工具,本文介绍了从基础到进阶的使用方法:


  • 基础抓取:获取页面内容和标题
  • 登录处理:保存和复用Cookie
  • 定时任务:自动化数据采集和存储
  • 反检测技巧:绕过常见的反爬虫机制


相比付费API,Puppeteer的优势在于完全免费、灵活性高、能处理复杂交互。无论是数据采集、自动化测试还是网页截图,它都能胜任。

扩展阅读:

  • Puppeteer官方文档:https://pptr.dev/
  • Playwright(微软出品,支持多浏览器):https://playwright.dev/


有问题欢迎在楼下交流!
回复

使用道具 举报

default_avator1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
快速回复 返回顶部 返回列表