Skip to content

puppeteer

puppeteer 是一个 Node 库,它提供了一个高级 API 来控制 Chrome 或 Chromium 浏览器。它可以实现在浏览器的页面上执行本地脚本,并将执行结果返回给 Node 进程(保存到内存中)。

普通爬虫的局限性

一般的爬虫是通过设置请求头来模拟浏览器,请求获取网页内容。再对网页内容进行解析,获取需要的数据。这对于一些简单的展示数据网页来说是可行的。但是对于一些复杂的网页,比如需要通过 js 动态加载的网页(SPA),原始内容中没有直接数据,而是一堆浏览器环境的 js 程序,此时就无法拿到需要的数据了。

安装 puppeteer

bash
npm install puppeteer

bash
npm install puppeteer-core

如果安装 puppeteer 失败且已安装了chrome浏览器,可以尝试安装 puppeteer-core

puppeteer-core 是 puppeteer 的轻量级版本,相比于 puppeteer ,它不包含浏览器,需要在使用过程中指定浏览器路径。

使用 puppeteer 控制浏览器

js
const puppeteer = require('puppeteer');

(async () => {
  // 打开浏览器
  const browser = await puppeteer.launch();
  // 打开新页面
  const page = await browser.newPage();
  // 访问页面
  await page.goto('https://www.baidu.com');
  
  // 等待页面脚本执行完成(可以根据需要设置等待条件)
  await new Promise(resolve => setTimeout(resolve, 2000));
  // 将本地脚本通过字符串的格式注入到页面中
  await page.evaluate(`
    window.fun = function() {
      console.log("done")
      return window.origin
    }
    // window.fun = fun.toString()
  `);
  // 执行页面上的 JavaScript 脚本
  const res = await page.evaluate(() => {
    return window.fun()
  });
  console.log(res) // https://www.baidu.com
  await browser.close();
})();

使用 puppeteer-core 控制浏览器

因为 puppeteer-core 不包含浏览器,需要在使用过程中指定浏览器路径。

js
const puppeteer = require('puppeteer-core');

(async () => {
  // 打开浏览器
  const browser = await puppeteer.launch();
  // 打开新页面
  const page = await browser.newPage();
  // 访问页面
  await page.goto('https://www.baidu.com');
  
  // 等待页面脚本执行完成(可以根据需要设置等待条件)
  await new Promise(resolve => setTimeout(resolve, 2000));
    // 将本地脚本通过字符串的格式注入到页面中
  await page.evaluate(`
    window.fun = function() {
      console.log("done")
      return window.origin
    }
    // window.fun = fun.toString()
  `);
  // 执行页面上的 JavaScript 脚本
  const res = await page.evaluate(() => {
    return window.fun()
  });
  console.log(res) // https://www.baidu.com
  await browser.close();
})();

拿到页面数据后,就可以在本地进行数据解析了。