新一代爬虫神器puppeteer介绍

Puppeteer是NPM库,它提供了NodeJS高级API来控制Chrome。Puppeteer 默认以无头(无界面)方式运行,但也可以配置为运行有界面的Chrome。Puppeteer 提供了一系列 API,通过 Chrome DevTools Protocol 协议控制 Chromium/Chrome 浏览器的行为。其对应的Python版本为pyppeteer。

仓库地址

https://github.com/puppeteer/puppeteer

安装

npm install puppeteer --save

Puppeteer具有以下特性:

  • 使用 DevTools 协议 与浏览器进行通信。
  • Browser 实例可以拥有浏览器。
  • BrowserContext 浏览器上下文。
  • Page 至少有一个框架:主框架。 可能还有其他框架由 iframe 或 框架标签 创建。
  • frame 至少有一个执行上下文 - 默认的执行上下文 - 框架的 JavaScript 被执行。 一个框架可能有额外的与 扩展 关联的执行上下文。
  • Worker 具有单一执行上下文,并且便于与 WebWorkers 进行交互。

示例

const url = 'http://61.163.88.227:8006/hwsq.aspx?sr=0nkRxv6s9CTRMlwRgmfFF6jTpJPtAv87';
(async () => {
  // 1. Open browser
  const browser = await puppeteer.launch({
    // headless: false
  });
  // 2. Create a new page
  const page = await browser.newPage();
  // 3. Go to the target website
  await page.goto(url, { waitUntil: "networkidle2" });
  // await page.waitFor(3000);
  // 4. Get data
  const dateInput = await page.$('#ContentLeft_menuDate1_TextBox11')
  const submit = await page.$('#ContentLeft_Button1')
  const now = Date.now();
  for (let i = 0; i < 8280; i++) {
    const offset = 1000 * 60 * 60 * 24 * i;
    const date = new Date(now - offset).format('yyyy-MM-dd');
    await page.evaluate((el, value) => el.setAttribute('value', value),
      dateInput, date
    )
    submit.click();
    await page.waitFor(3000)
    await page.waitForSelector("#ContentLeft_menuDate1_TextBox11");
    // console.log(dateInput)
    let data = await page.evaluate(getInfo);
    console.log(date + '...')
    fs.writeFileSync('./data/' + date + '.txt', data)
  }

  // 5. Print out the data in the console
  // console.log(data);
  // 6. Close browser
  await browser.close();
})();
async function getInfo() {
  const table = document.querySelectorAll('.mainTxt');
  const vList = table[0].innerText.split(/\t/)
  return vList
}

Puppeteer的其他用途

  • 网页截图或者生成 PDF
  • 自动提交表单,进行 UI 测试,键盘输入等。
  • 创建一个时时更新的自动化测试环境。 使用最新的 JavaScript 和浏览器功能直接在最新版本的Chrome中执行测试。
  • 捕获网站的时间线,帮助诊断性能问

版权声明:本文为xtfge0915原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。