专业编程基础技术教程

网站首页 > 基础教程 正文

Node.js+Puppeteer:新一代动态爬虫利器,高效抓取不再难!

ccvgpt 2025-05-30 13:08:37 基础教程 6 ℃

在数据为王的时代,爬虫技术已成为开发者必备技能。虽然Python的Scrapy、BeautifulSoup等工具占据主流视野,但Node.js凭借其异步特性与Puppeteer的无头浏览器能力,正在悄然掀起动态爬虫的新革命!今天,我们揭秘如何用Node.js+Puppeteer高效攻破复杂网站,轻松获取动态数据!


为什么选择Node.js+Puppeteer?

  1. 无头浏览器王者
    Puppeteer由谷歌官方维护,直接操控Chromium浏览器,完美模拟用户操作(点击、滚动、表单提交),轻松破解JavaScript动态渲染页面,传统爬虫难以企及!
  2. 异步性能杀手锏
    Node.js事件驱动架构天生适合高并发I/O操作,结合async/await语法,实现毫秒级多页面并行抓取,效率提升10倍+!
  3. 一站式解决方案
    截图、PDF生成、自动化测试一把抓,爬取数据的同时还能完成UI监控,一箭双雕!

实战:5分钟爬取电商价格数据

场景需求
抓取某电商平台搜索“智能手机”的结果,提取商品名称、价格、评分。

Node.js+Puppeteer:新一代动态爬虫利器,高效抓取不再难!

代码实现

const puppeteer = require('puppeteer');

(async () => {
  // 启动浏览器,设置视口和代理
  const browser = await puppeteer.launch({ 
    headless: 'new', // 新版本无头模式
    args: ['--no-sandbox', '--proxy-server=ip:port'] 
  });
  const page = await browser.newPage();
  await page.setViewport({ width: 1280, height: 800 });

  // 设置UA和绕过检测
  await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
  await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, 'webdriver', { get: () => false });
  });

  // 导航到目标页面
  await page.goto('https://example.com/search?q=智能手机', {
    waitUntil: 'networkidle2',
    timeout: 60000
  });

  // 滚动加载全部内容(针对懒加载页面)
  await autoScroll(page);

  // 提取数据
  const products = await page.$eval('.product-item', items => 
    items.map(item => ({
      title: item.querySelector('.title').innerText.trim(),
      price: item.querySelector('.price').innerText.replace('yen', ''),
      rating: item.querySelector('.rating').getAttribute('data-score')
    }))
  );

  console.log(products);
  await browser.close();
})();

// 自动滚动函数
async function autoScroll(page) {
  await page.evaluate(async () => {
    await new Promise((resolve) => {
      let totalHeight = 0;
      const distance = 100;
      const timer = setInterval(() => {
        const scrollHeight = document.body.scrollHeight;
        window.scrollBy(0, distance);
        totalHeight += distance;
        if (totalHeight >= scrollHeight) {
          clearInterval(timer);
          resolve();
        }
      }, 100);
    });
  });
}

进阶技巧:突破反爬防线

  1. 指纹伪装
  • 使用puppeteer-extra-plugin-stealth插件消除Headless特征
  • 随机化硬件指纹(屏幕分辨率、时区、字体列表)
  1. 智能等待策略
// 元素级精准等待
await page.waitForSelector('.price', { visible: true, timeout: 5000 });

// 网络请求拦截(捕获AJAX数据)
page.on('response', async response => {
  if (response.url().includes('/api/data')) {
    const data = await response.json();
    console.log(data.items);
  }
});

3.分布式架构

  • 结合bull队列实现任务调度
  • 使用puppeteer-cluster管理多实例浏览器池

性能优化指南

资源拦截 – 屏蔽图片/CSS减少带宽消耗

await page.setRequestInterception(true);
page.on('request', req => {
  if (['image', 'stylesheet'].includes(req.resourceType())) {
    req.abort();
  } else {
    req.continue();
  }
});

内存管控 – 定时清理页面实例

// 每处理50个页面重启一次浏览器
let pageCount = 0;
if (++pageCount % 50 === 0) {
  await browser.close();
  browser = await puppeteer.launch();
}

立即行动!

npm install puppeteer

项目开源地址:

https://gitee.com/mirrors/puppeteer-nodejs

中文文档推荐:

https://puppeteer.bootcss.com/

Tags:

最近发表
标签列表