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日

相关文章

  • 详解nodejs之创建最小docker镜像

    “详解nodejs之创建最小docker镜像”的完整攻略可以包括以下内容: 创建最小的Node.js Docker镜像 前提条件 安装Docker 熟悉Node.js 步骤 1. 创建一个新目录,然后进入该目录 mkdir mynodeapp cd mynodeapp 2. 在该目录下创建一个名为app.js的文件 const http = require(…

    node js 2023年6月8日
    00
  • 详解node登录接口之密码错误限制次数(含代码)

    下面是对题目所提到的完整攻略的详细讲解。 标题:详解node登录接口之密码错误限制次数(含代码) 概述 密码错误限制次数是在用户登录时,为了防止恶意攻击和密码猜测,而限制用户输入错误密码的次数,达到一定的次数后,将会给用户一个提示,要么等待一段时间后继续登录,要么通过其他方式找回密码。本攻略将详细讲解如何在Node.js中实现密码错误次数限制功能。 实现思路…

    node js 2023年6月8日
    00
  • Nodejs从有门道无门菜鸟起飞必看教程

    首先,这是一篇关于Node.js的入门教程,主要适用于零基础或者基础薄弱的Node.js开发者。在这篇教程中,你将学会如何使用Node.js,包括如何安装、如何搭建开发环境、如何编写基础的Node.js程序、如何使用Node.js处理HTTP请求、如何使用模块等。下面是该教程的完整攻略: 安装Node.js 首先,你需要从官网(https://nodejs.…

    node js 2023年6月8日
    00
  • 详解webpack打包nodejs项目(前端代码)

    下面是详解webpack打包nodejs项目(前端代码)的完整攻略: 1. 安装webpack 首先,我们需要在命令行中安装 webpack: npm install webpack –save-dev 2. 配置webpack 接下来,我们需要创建一个 webpack.config.js 的文件,并配置它。示例代码如下: const path = req…

    node js 2023年6月8日
    00
  • 详解如何在vscode里面调试js和node.js的方法步骤

    在VS Code中调试JavaScript和Node.js的方法步骤如下: 步骤一:在项目中添加调试配置文件 在VS Code中,我们需要在项目中添加一个调试配置文件launch.json。该文件用于配置调试器的行为和选项,以便在调试时获取所需的上下文。 要添加launch.json文件,请按照以下步骤操作: 在VS Code中打开您的项目。 点击VS Co…

    node js 2023年6月8日
    00
  • node.js中的http.response.writeHead方法使用说明

    下面是关于“node.js中的http.response.writeHead方法使用说明”的完整攻略。 简介 在Node.js中,我们可以使用http模块来创建一个Web服务器。当服务器收到客户端请求后,服务器需要向客户端发送HTTP响应,可以使用http.response.writeHead方法来设置响应的头部信息。 http.response.write…

    node js 2023年6月8日
    00
  • 关于node+mysql数据库连接池连接

    我来为你讲解一下关于node.js和mysql数据库连接池连接的完整攻略。 1. 安装 mysql 模块 我们需要先安装mysql模块来连接mysql数据库,输入以下命令来安装: npm install mysql 2. 创建连接池 接下来,我们需要创建数据库连接池,并配置连接数据库的信息,如下所示: const mysql = require(‘mysql…

    node js 2023年6月8日
    00
  • nodejs的安装使用与npm的介绍

    Node.js是一个能够在服务器端运行JavaScript的开放源代码,跨平台的运行环境。它是构建在Chromium的V8 JavaScript引擎上的。 安装Node.js 1. Windows环境下的安装 在Windows环境下,你可以直接在Node.js官网(https://nodejs.org/en/)下载Windows安装包,根据安装向导完成安装。…

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