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

yizhihongxing

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使用gm拼装sprite图片

    如何使用 Node.js 和 gm 模块拼装 sprite 图片?下面是完整攻略: 安装依赖 首先,要确保 Node.js 和 gm 模块已经安装到了本地开发环境中,如果没有的话可以使用以下命令进行安装。 # 安装 Node.js sudo apt-get install nodejs # 安装 gm 模块 sudo npm install gm –sav…

    node js 2023年6月8日
    00
  • nodejs取得当前执行路径的方法

    要取得Node.js当前执行路径,可以使用内置的__dirname变量。__dirname是一个指向当前执行脚本所在目录的绝对路径的字符串。下面是一些细节和示例说明。 获取当前执行路径的方法 使用__dirname __dirname是一个全局变量,它指的是当前执行文件所在目录的绝对路径。使用方法如下: console.log(__dirname); // …

    node js 2023年6月8日
    00
  • Node实现前端本地开发接口代理服务

    下面是关于“Node实现前端本地开发接口代理服务”完整攻略的详细说明。 什么是接口代理服务 前端开发过程中,常常需要请求后端接口获取数据。但是在本地开发环境中,由于前后端不在同一个服务器上,经常会遇到跨域问题。为了解决这个问题,我们可以使用接口代理服务。 接口代理服务,指将前端开发环境中的某个 API 请求转发到真实的后端 API 服务器上,并将其响应结果返…

    node js 2023年6月8日
    00
  • NodeJS远程代码执行

    NodeJS远程代码执行是指攻击者通过网络将恶意代码传递到目标服务器上,并执行该代码。这种攻击方式往往能够导致服务器系统的完全崩溃或者数据泄露等严重后果,因此需要我们注意和提高防御能力。 下面是远程代码执行的攻击途径和防御措施: 攻击途径 由于网络协议漏洞或脆弱性的存在 通过注入不受信任或者非法内容到网络请求中 通过渗透 web 程序环境中的代码脆弱性,绕过…

    node js 2023年6月8日
    00
  • Node.js基础入门之使用方式及模块化详解

    Node.js是基于Chrome V8引擎的JavaScript运行环境,它采用事件驱动、非阻塞I/O模型,可以构建高并发、高性能、可扩展的网络应用程序。本篇攻略将详细介绍Node.js的使用方式及模块化原理。 Node.js使用方式 安装Node.js 首先需要在官网上下载并安装Node.js:https://nodejs.org/en/安装完成后,可以在…

    node js 2023年6月7日
    00
  • Node.js fs模块原理及常见用途

    Node.js中的fs模块提供了文件操作相关的API,它是Node.js核心模块之一,可以被任何一个模块所调用。 fs模块原理 文件读写原理: Node.js通过Libuv提供的异步IO进行文件读写,避免阻塞主线程。当文件读写操作完成后,将通过事件机制将结果告知Node.js执行环境。 文件读取流(Read Stream)原理: 文件读取流提供数据的读取,目…

    node js 2023年6月8日
    00
  • node中的cookie的具体使用

    接下来我将为你详细介绍“Node.js中的Cookie的具体使用”的攻略。 什么是Cookie 在Web开发中,Cookie是一种由服务器通过HTTP协议写入客户端计算机中的小文件,它可以保存一些用户身份验证、页面定位、状态保持等相关信息。之后客户端每次请求页面都会携带该Cookie信息,从而完成用户身份的认证和页面状态的保持。 Node.js中的Cooki…

    node js 2023年6月8日
    00
  • koa-router源码学习小结

    下面是对“koa-router源码学习小结”的完整攻略。 1. 入口文件 “koa-router”模块的入口文件是“index.js”。 const Router = require(‘./lib/router’); function router(opts) { return new Router(opts); } PATTERN_FLAGS.forEac…

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