Puppeteer 爬取动态生成的网页实战

Puppeteer 爬取动态生成的网页实战攻略

介绍

Puppeteer 是一个由 Google 开源的 Node.js 库,它提供了一个高级的 API 来与 headless Chrome 进行交互。Puppeteer 可以模拟用户的交互行为,并且可以获取网页中动态生成的内容,非常适合用来做爬虫。

步骤

1. 安装 Puppeteer

在安装 Puppeteer 前需要先安装 Node.js ,安装命令可以在 Node.js 官网 查看。

安装 Puppeteer ,只需要执行以下命令即可:

npm install puppeteer

2. 打开浏览器

使用 Puppeteer 前需要先启动一个 headless Chrome 浏览器,执行以下代码:

const puppeteer = require('puppeteer');

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

这里的const browser = await puppeteer.launch()会启动一个无头浏览器,可以通过传入参数来配置。const page = await browser.newPage()会创建一个新的空白页面。

3. 打开网页并获取内容

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com/');
  const content = await page.content();
  console.log(content);
  // ...
})();

这里的await page.goto('https://example.com/')会导航到指定网站,之后使用await page.content()会返回网站的 HTML 内容,打印到控制台上。

4. 模拟用户操作和事件

Puppeteer 可以模拟用户的交互行为,例如点击、输入等操作:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com/');
  await page.type('#search-box', 'test'); // 在表单中输入 'test'
  await page.click('#search-button'); // 点击提交按钮
  // ...
})();

这里的await page.type()会在表单元素中输入指定文本,await page.click()会模拟点击事件。这些操作会启动 JavaScript 引擎并执行相应的代码。

5. 获取动态生成的内容

如果网页中的内容通过 Ajax 或 JavaScript 动态生成,那么可以使用page.waitFor()来等待指定的元素出现,之后使用page.evaluate()来获取元素的属性或文本:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com/');
  await page.type('#search-box', 'test');
  await page.click('#search-button');
  await page.waitFor('#search-results');
  const results = await page.evaluate(() => {
    const links = Array.from(document.querySelectorAll('#search-results a'));
    return links.map(link => ({ title: link.textContent, href: link.href }));
  });
  console.log(results);
  // ...
})();

这里的await page.waitFor('#search-results')会等待网页中指定的元素出现,await page.evaluate()会执行指定的 JavaScript 代码,并返回执行结果。

示例

示例一: 抓取煎蛋网妹子图

以下代码使用 Puppeteer 爬取煎蛋网 (https://jandan.net/) 的妹子图。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://jandan.net/ooxx/');
  for(let i = 0; i < 3; i++) {
    const images = await page.$$eval('#comments img', imgs => imgs.map(img => img.src));
    console.log(images);
    await page.click('#comments > div:nth-child(14) > div > div.cp-pagenavi > a:nth-child(3)');
    await page.waitFor(1000);
  }
  await browser.close();
})();

代码解析:

此代码首先打开煎蛋网的妹子图页面 (https://jandan.net/ooxx/),之后模拟点击翻页,循环获取其中的图片链接,最后关闭浏览器。

示例二: 抓取贴吧帖子

以下代码使用 Puppeteer 爬取贴吧帖子,包括标题、图像、作者和时间。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://tieba.baidu.com/p/1234567');
  const title = await page.title();
  const posts = await page.$$eval('.d_post_content', divList => {
    return divList.map(div => {
      const author = div.querySelector('.d_author a').textContent;
      const time = div.querySelector('.d_post_content_main .tail-info').textContent;
      const imgList = Array.from(div.querySelectorAll('.BDE_Image')).map(img => img.src);
      return { author, time, imgList };
    });
  });
  console.log(title, posts);
  await browser.close();
})();

代码解析:

此代码首先打开贴吧帖子 (https://tieba.baidu.com/p/1234567),之后获取主题的标题,之后使用page.$$eval()来获取帖子中所有发表的内容,并解析出图片、作者和发布时间。最后关闭浏览器。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Puppeteer 爬取动态生成的网页实战 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node.js域名解析实现方法详解

    Node.js域名解析实现方法详解 什么是域名解析 域名解析是将域名解析成IP地址的过程,它是Internet世界中最基本的服务之一。在网络互联世界中,我们经常使用域名来访问网站,但是计算机语言只能认识IP地址,因此我们需要用域名解析成IP地址才能访问网站。 Node.js域名解析 在Node.js中,我们可以使用内置的dns模块来实现域名解析功能。该模块提…

    node js 2023年6月8日
    00
  • node.js入门教程之querystring模块的使用方法

    下面是“node.js入门教程之querystring模块的使用方法”的完整攻略。 一、querystring模块的基本介绍 querystring 模块是 Node.js 中内置的一个提供了一些实用工具的模块,可以用来进行 URL 查询字符串的解析和序列化,常用于处理 HTTP 请求和响应中的参数。 二、querystring模块常用方法 1. query…

    node js 2023年6月8日
    00
  • vue中node_modules中第三方模块的修改使用详解

    当我们使用 Vue 框架进行前端开发时,通常会依赖不同的第三方模块。如果在实际开发过程中,我们发现某一个第三方模块的功能不满足我们的需求,需求修改这个模块。那么如何在 Vue 项目中修改使用第三方模块功能呢? 下面是修改使用 Node_modules 中第三方模块的步骤: 1. 将需要修改的第三方模块从 node_modules 中复制到 src 中 cp …

    node js 2023年6月8日
    00
  • 关于npm主版本升级及其相关知识点总结

    关于npm主版本升级及其相关知识点总结,我会从以下几个方面逐一进行讲解: npm版本号格式 npm主版本升级的含义 如何进行npm主版本升级 升级后的注意事项 1. npm版本号格式 在深入讲解npm主版本升级之前,我们首先需要了解npm版本号的格式。npm版本号是由三个部分组成的,分别是:主版本号、次版本号和修订号,格式为:X.Y.Z。 其中,X代表主版本…

    node js 2023年6月8日
    00
  • webstorm配置支持nodejs并自动补全的方法

    WebStorm是一款功能强大的JavaScript IDE,支持Node.js开发,能够提供一些非常便利的功能,例如代码自动补全、代码风格检查和调试等等。以下是配置WebStorm支持Node.js并自动补全的方法: 1. 下载并安装Node.js 首先,需要在计算机上安装Node.js。你可以前往Node.js官网 https://nodejs.org/…

    node js 2023年6月8日
    00
  • 详解用node搭建简单的静态资源管理器

    详解用node搭建简单的静态资源管理器 什么是静态资源管理器 静态资源管理器是一种用于管理前端静态资源(如html、css、js、图片等)的工具,可以通过该工具实现静态资源的访问、上传、删除、编辑等操作。 搭建静态资源管理器的前置条件 安装node.js及npm 掌握node.js基本语法 掌握npm依赖包管理 步骤一:创建工程目录 mkdir static…

    node js 2023年6月8日
    00
  • nodemon实现Typescript项目热更新的示例代码

    这里是详细讲解“nodemon实现Typescript项目热更新的示例代码”的完整攻略。 简介 在开发Typescript项目时,为了方便调试、测试,我们通常会使用nodemon来实现热更新。nodemon是一个能够监控文件改变并自动重启应用的工具,能够极大提高开发效率。这里我们将介绍如何使用nodemon实现Typescript项目热更新,解决修改代码后需…

    node js 2023年6月8日
    00
  • 快速掌握Node.js中setTimeout和setInterval的使用方法

    以下是“快速掌握Node.js中setTimeout和setInterval的使用方法”的完整攻略: 一、介绍 在 Node.js 中,可以使用 setTimeout 或 setInterval 实现定时器的功能。setTimeout 用来设定一个定时器,在指定的时间间隔后执行一次指定的函数,而 setInterval 则用于重复执行函数。本篇攻略将详细讲解…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部