沃梦达 / IT编程 / 数据库 / 正文

详解Node使用Puppeteer完成一次复杂的爬虫

一、概述

一、概述

在Node.js中,Puppeteer是一个高效的爬虫工具。因为它使用的是Chrome浏览器的Headless模式,可以对JavaScript动态生成的网页进行操作。同时,Puppeteer还提供了WebAPI,可以模拟用户的行为,如键盘鼠标操作、表单提交等。本攻略将详细讲解使用Puppeteer完成一次复杂的爬虫。

二、安装Puppeteer

npm install puppeteer

三、使用Puppeteer

1.启动浏览器

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  // ... more code
  await browser.close();
})();

2.访问页面

await page.goto('http://example.com');

3.截图

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

4.获取元素

const usernameInput = await page.$('#username');

5.模拟用户行为

await usernameInput.type('admin');

6.表单提交

await Promise.all([
  page.click('#submit'),
  page.waitForNavigation()
]);

7.获取响应

const response = page.waitForResponse('url');
const body = await response.text();

四、示例说明

1.爬取图片

const puppeteer = require('puppeteer');
const http = require('http');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('http://example.com');
  const imageLinks = await page.evaluate(() => {
    const links = [];
    document.querySelectorAll('img').forEach(img => {
      links.push(img.src);
    });
    return links;
  });
  imageLinks.forEach((src, index) => {
    http.get(src, response => {
      response.pipe(fs.createWriteStream(`${index}.png`));
    })
  });
  await browser.close();
})();

2.爬取动态生成的数据

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.example.com/page/1');
  while (true) {
    const data = await page.evaluate(() => {
      const list = [];
      document.querySelectorAll('.item').forEach(item => {
        const title = item.querySelector('.title').innerText;
        const author = item.querySelector('.author').innerText;
        list.push({
          title,
          author
        });
      });
      return list;
    });
    console.log(data);
    const nextButton = await page.$('.next');
    if (nextButton) {
      await nextButton.click();
      await page.waitForNavigation();
    } else {
      break;
    }
  }
  await browser.close();
})();

以上就是使用Puppeteer完成一次复杂的爬虫攻略的详细讲解。

本文标题为:详解Node使用Puppeteer完成一次复杂的爬虫