ZVVQ代理分享网

Puppeteer无头浏览器爬虫教程

作者:zvvq博客网

Puppeteer无头浏览器爬虫教程

本教程将带你了解如何使用Puppeteer进行高效的网页抓取,特别适合处理动态内容和应对反爬虫策略。

性能优势

无头模式下,启动速度提升2倍,内存占用减少75%,大幅提高爬虫效率。

反爬应对

通过代理IP、请求头伪装和设备模拟等技术,有效应对网站的反爬虫机制。

动态内容处理

轻松处理JavaScript渲染的内容,包括无限滚动、表单提交和用户交互等复杂场景。

一、环境准备

1. 安装Node.js(需8+版本)

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash
sudo apt-get install -y nodejs

2. 安装Puppeteer

npm install puppeteer

注:国内用户可设置环境变量跳过Chromium下载,提高安装速度。

二、基础爬取流程

const puppeteer = require('puppeteer');

(async () => {
  // 启动浏览器(默认无头模式)
  const browser = await puppeteer.launch({
    headless: true,  // false可启动可视化浏览器
    args: ['--no-sandbox']
  });
  
  const page = await browser.newPage();
  
  // 导航到目标页(等待网络空闲)
  await page.goto('https://example.com', {
    waitUntil: 'networkidle0'
  });
  
  // 执行页面内JS获取数据
  const data = await page.evaluate(() => {
    return document.querySelector('h1').innerText;
  });
  
  console.log(data);
  await browser.close();
})();

关键点说明:

  • networkidle0:等待500ms无网络请求再继续
  • page.evaluate():在浏览器上下文执行JS

三、处理动态内容

1. 等待元素加载

await page.waitForSelector('.results', { timeout: 5000 });

2. 滚动加载更多

await page.evaluate(() => {
  window.scrollBy(0, window.innerHeight);
});

3. 点击交互元素

await page.click('button.load-more');

四、反爬虫对策

1. 代理IP配置

await puppeteer.launch({
  args: ['--proxy-server=http://user:pass@proxy_ip:port']
});

推荐结合腾讯云CVM服务器使用

2. 请求头伪装

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0...)');

3. 设备模拟

await page.emulate(puppeteer.devices['iPhone 11']);

五、高级功能

1. 拦截网络请求

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

2. 响应头捕获

const response = await page.waitForResponse(res => res.status() === 200);
console.log(response.headers());

3. PDF/截图生成

await page.pdf({ path: 'page.pdf' });
await page.screenshot({ path: 'screenshot.png' });

六、性能优化

1. 无头模式优势

启动速度提升2倍

内存占用减少75%

2. 并发控制

const promises = urls.map(url => processPage(url));
await Promise.all(promises);

3. 缓存复用

const browser = await puppeteer.launch({
  userDataDir: './user_data'
});

七、注意事项

 

遵守robots.txt协议,设置合理请求间隔

 

复杂场景推荐使用专业爬虫API(如Oxylabs)

 

可视化调试时设置headless: falsedevtools: true

教程资源

完整示例代码

查看Puppeteer官方示例代码库

最新文档

2024版Puppeteer支持Chrome/Chromium/Firefox