使用Puppeteer构建博客内容的自动标签生成器

news2024/10/6 12:21:53

亿牛云代理

导语

标签是一种用于描述和分类博客内容的元数据,它可以帮助读者快速找到感兴趣的主题,也可以提高博客的搜索引擎优化(SEO)。然而,手动为每篇博客文章添加合适的标签是一件费时费力的工作,有时候也容易遗漏或重复。本文将介绍如何使用Puppeteer这个强大的Node.js库来构建一个博客内容的自动标签生成器,它可以根据博客文章的标题和正文内容,自动提取出最相关的标签,并保存到数据库中。

概述

Puppeteer是一个Node.js库,它提供了一个高级API来控制Chrome或Chromium浏览器。使用Puppeteer,我们可以实现各种浏览器自动化任务,例如网页抓取、网页截图、网页测试、PDF生成等。Puppeteer的核心功能是创建一个Browser对象,它代表了一个浏览器实例,然后通过Browser对象创建一个或多个Page对象,它代表了一个浏览器标签页。通过Page对象,我们可以对网页进行各种操作,例如导航、点击、输入、等待等。

为了构建一个博客内容的自动标签生成器,我们需要使用Puppeteer来完成以下步骤:

  1. 启动一个浏览器实例,并设置代理IP和User-Agent等选项,以提高爬虫效果和防止被目标网站屏蔽。
  2. 创建一个浏览器标签页,并打开目标博客网站的首页。
  3. 获取首页上所有博客文章的链接,并保存到一个数组中。
  4. 遍历数组中的每个链接,打开对应的博客文章页面,并获取文章的标题和正文内容。
  5. 使用一个第三方API(例如[Text Analysis API])来对文章的标题和正文内容进行自然语言处理(NLP),并返回最相关的标签。
  6. 将文章的链接、标题、正文内容和标签保存到数据库中(例如[MongoDB])。
  7. 关闭浏览器实例,并结束程序。

正文

下面我们来具体看看如何使用Puppeteer来实现上述步骤。

1. 启动浏览器实例

首先,我们需要安装Puppeteer这个Node.js库,可以使用npm命令:

npm install puppeteer

然后,在我们的JavaScript文件中,我们需要引入Puppeteer模块,并使用puppeteer.launch()方法来启动一个浏览器实例。这个方法接受一个可选的配置对象作为参数,我们可以在这里设置代理IP等选项。例如,我们可以使用亿牛云提供的爬虫代理IP服务,它可以帮助我们隐藏真实IP地址,并提供不同地区和运营商的IP资源。我们只需要在亿牛云爬虫代理官网注册一个账号,并获取相应的域名、端口、用户名和密码,然后在puppeteer.launch()方法中设置args属性和headless属性即可。args属性是一个数组,用于传递给浏览器进程的命令行参数。其中--proxy-server参数用于设置代理服务器地址,格式为protocol://username:password@host:portheadless属性是一个布尔值,用于设置是否以无头模式运行浏览器,即是否显示浏览器界面。如果设置为false,则可以看到浏览器的操作过程,方便调试。我们还可以设置userAgent属性,用于设置浏览器的用户标识字符串,以模拟不同的浏览器和设备类型。例如,我们可以使用[User-Agent Switcher]这个Chrome扩展程序来获取不同的用户标识字符串,并随机选择一个作为参数。下面是一个示例代码:

// 引入Puppeteer模块
const puppeteer = require('puppeteer');

// 定义亿牛云爬虫代理的域名、端口、用户名和密码
const proxyHost = 'http://www.16yun.cn';
const proxyPort = '8100';
const proxyUser = '16YUN';
const proxyPass = '16IP';

// 定义一个用户标识字符串数组
const userAgents = [
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15',
  'Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1',
  'Mozilla/5.0 (Linux; Android 11; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Mobile Safari/537.36'
];

// 随机选择一个用户标识字符串
const userAgent = userAgents[Math.floor(Math.random() * userAgents.length)];

// 启动一个浏览器实例,并设置亿牛云爬虫代理
(async () => {
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyUser}:${proxyPass}@${proxyHost}:${proxyPort}`],
    headless: false,
    userAgent: userAgent
  });
})();

2. 创建浏览器标签页,并打开目标博客网站的首页

启动浏览器实例后,我们可以使用browser.newPage()方法来创建一个新的浏览器标签页,并返回一个Page对象。然后,我们可以使用page.goto()方法来打开目标博客网站的首页,并等待页面加载完成。这个方法接受一个URL字符串作为参数,以及一个可选的配置对象,其中可以设置waitUntil属性,用于指定何时认为页面导航完成。我们可以设置为networkidle2,表示当网络连接数小于等于2时,认为页面导航完成。下面是一个示例代码:

// 创建一个新的浏览器标签页,并返回一个Page对象
const page = await browser.newPage();

// 定义目标博客网站的首页URL
const blogUrl = 'https://example.com';

// 打开目标博客网站的首页,并等待页面加载完成
await page.goto(blogUrl, {waitUntil: 'networkidle2'});

3. 获取首页上所有博客文章的链接,并保存到一个数组中

打开目标博客网站的首页后,我们可以使用page.$$eval()方法来获取首页上所有博客文章的链接,并保存到一个数组中。这个方法接受两个参数,第一个参数是一个选择器字符串,用于指定要匹配的元素;第二个参数是一个回调函数,用于对匹配到的元素进行操作,并返回结果。例如,我们可以使用CSS选择器a.post-link来匹配所有包含博客文章链接的a元素;然后在回调函数中,我们可以使用Array.from()方法来将匹配到的元素转换为数组

4. 遍历数组中的每个链接,打开对应的博客文章页面,并获取文章的标题和正文内容

获取到首页上所有博客文章的链接后,我们可以使用for...of循环来遍历数组中的每个链接,然后使用page.goto()方法来打开对应的博客文章页面,并等待页面加载完成。然后,我们可以使用page.$eval()方法来获取文章的标题和正文内容,并保存到一个对象中。这个方法接受两个参数,第一个参数是一个选择器字符串,用于指定要匹配的元素;第二个参数是一个回调函数,用于对匹配到的元素进行操作,并返回结果。例如,我们可以使用CSS选择器h1.post-title来匹配文章的标题元素;然后在回调函数中,我们可以使用element.textContent属性来获取元素的文本内容,并返回结果。同理,我们可以使用CSS选择器div.post-content来匹配文章的正文内容元素,并返回结果。下面是一个示例代码:

// 定义一个空数组,用于存放所有博客文章的信息
const posts = [];

// 遍历数组中的每个链接
for (const link of links) {
  // 打开对应的博客文章页面,并等待页面加载完成
  await page.goto(link, {waitUntil: 'networkidle2'});

  // 获取文章的标题和正文内容,并保存到一个对象中
  const post = await page.$eval('h1.post-title', element => {
    return {
      title: element.textContent, // 获取元素的文本内容
      content: element.nextElementSibling.textContent // 获取元素的下一个兄弟元素(正文内容元素)的文本内容
    };
  });

  // 将对象添加到数组中
  posts.push(post);
}

5. 使用一个第三方API来对文章的标题和正文内容进行自然语言处理,并返回最相关的标签

获取到所有博客文章的标题和正文内容后,我们可以使用一个第三方API来对文章的标题和正文内容进行自然语言处理,并返回最相关的标签。这里我们可以使用[Text Analysis API]这个免费的API服务,它提供了多种自然语言处理功能,例如情感分析、关键词提取、实体识别、摘要生成等。我们可以使用它提供的关键词提取功能,来根据文章的标题和正文内容,自动提取出最相关的标签,并返回一个数组。为了使用这个API服务,我们需要先在[Text Analysis API]官网注册一个账号,并获取一个API密钥(API Key)。然后,我们可以使用Node.js内置的[http]模块来发送HTTP请求,并处理响应结果。下面是一个示例代码:

// 引入http模块
const http = require('http');

// 定义Text Analysis API的URL和API密钥
const apiUrl = 'http://api.meaningcloud.com/topics-2.0';
const apiKey = '0123456789abcdef0123456789abcdef';

// 定义一个函数,用于发送HTTP请求,并返回一个Promise对象
function request(options, data) {
  return new Promise((resolve, reject) => {
    // 创建一个HTTP请求对象
    const req = http.request(options, res => {
      // 定义一个空字符串,用于存放响应数据
      let body = '';

      // 监听data事件,将响应数据拼接到字符串中
      res.on('data', chunk => {
        body += chunk;
      });

      // 监听end事件,将字符串转换为JSON对象,并调用resolve函数
      res.on('end', () => {
        resolve(JSON.parse(body));
      });
    });

    // 监听error事件,调用reject函数
    req.on('error', err => {
      reject(err);
    });

    // 将请求数据写入请求对象中
    req.write(data);

    // 结束请求
    req.end();
  });
}

// 定义一个函数,用于对文章的标题和正文内容进行自然语言处理,并返回最相关的标签
async function getTags(title, content) {
  // 定义请求选项,包括请求方法、请求头和请求路径
  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    path: apiUrl
  };

  // 定义请求数据,包括API密钥、语言、文章标题和文章正文内容
  const data = `key=${apiKey}&lang=en&txt=${title} ${content}&tt=a`;

  // 发送HTTP请求,并等待响应结果
  const response = await request(options, data);

  // 定义一个空数组,用于存放最相关的标签
  const tags = [];

  // 判断响应结果的状态码是否为0,表示成功
  if (response.status.code === '0') {
    // 遍历响应结果中的实体数组,提取每个实体的名称,并添加到标签数组中
    for (const entity of response.entity_list) {
      tags.push(entity.form);
    }
  }

  // 返回标签数组
  return tags;
}

6. 将文章的链接、标题、正文内容和标签保存到数据库中

获取到所有博客文章的链接、标题、正文内容和标签后,我们可以将它们保存到数据库中,以便后续的使用和分析。这里我们可以使用[MongoDB]这个免费的开源数据库,它是一种基于文档的数据库,适合存储JSON格式的数据。为了使用[MongoDB],我们需要先在[MongoDB]官网注册一个账号,并创建一个云数据库集群(Cluster)。然后,我们可以使用[MongoDB Node.js Driver]这个Node.js库来连接和操作数据库。为了使用这个库,我们需要先安装它,可以使用npm命令:

npm install mongodb

然后,在我们的JavaScript文件中,我们需要引入MongoDB模块,并使用MongoClient类来创建一个客户端对象。然后,我们可以使用client.connect()方法来连接数据库,并返回一个Promise对象。这个方法接受一个URL字符串作为参数,用于指定数据库的地址和配置选项。我们可以在[MongoDB]官网获取到这个URL字符串,并替换其中的用户名和密码。然后,在Promise对象的回调函数中,我们可以使用client.db()方法来获取一个数据库对象,并指定数据库的名称;然后使用db.collection()方法来获取一个集合对象,并指定集合的名称。集合相当于关系型数据库中的表,用于存储文档(Document)。然后,我们可以使用collection.insertMany()方法来将所有博客文章的信息作为文档插入到集合中,并返回一个Promise对象。这个方法接受一个数组作为参数,数组中的每个元素都是一个文档对象。最后,在Promise对象的回调函数中,我们可以打印出插入结果,并关闭数据库连接。下面是一个示例代码:

// 引入MongoDB模块
const { MongoClient } = require('mongodb');

// 定义MongoDB的URL字符串
const mongoUrl = 'mongodb+srv://username:password@cluster0.example.com/mydb';

// 创建一个客户端对象
const client = new MongoClient(mongoUrl);

// 连接数据库,并返回一个Promise对象
client.connect().then(() => {
  // 获取一个数据库对象,并指定数据库名称
  const db = client.db('mydb');

  // 获取一个集合对象,并指定集合名称
  const collection = db.collection('posts');

  // 将所有博客文章的信息作为文档插入到集合中,并返回一个Promise对象
  collection.insertMany(posts).then(result => {
    // 打印出插入结果
    console.log(result);

    // 关闭数据库连接
    client.close();
  });
});

7. 关闭浏览器实例,并结束程序

完成所有操作后,我们可以使用browser.close()方法来关闭浏览器实例,并结束程序。

结语

本文介绍了如何使用Puppeteer这个强大的Node.js库来构建一个博客内容的自动标签生成器,它可以根据博客文章的标题和正文内容,自动提取出最相关的标签,并保存到数据库中。这样,我们就可以省去手动为每篇博客文章添加合适的标签的工作,也可以提高博客的搜索引擎优化(SEO)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务

【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务 对象存储服务MinIOMinIO简介MinIO特点开箱使用docker安装启动管理控制台 快速入门Java 上传文件到minio配置访问权限 封装MinIO为starter创建模块zy-minio-starter配置类封装操作minIO类对外加入自动配置其他微服务使用 安…

好绝一数据可视化工具,零编程“BI+方案”

在一开始的时候,国外BI数据可视化工具的使用人群圈定在IT人员身上,所以我们可以看到国外BI数据可视化工具对使用者的IT技术要求较高,真正具有强烈数据分析需求的业务们反而无法按需分析。而现在,随着国产BI的崛起,面向…

Java线程概述 (二)线程实例演示

文章目录 🐒个人主页🏅JavaSE系列专栏📖前言:🎀创建线程的三种方式🐕使用java.lang包下的Thread类🪅实现Runnable接口🦓实现Callable接口 🐕synchronized简单介绍&#x…

Java手写数组队列和链表队列并使用java里面现成的队列方法

Java队列实现与常用使用方法介绍 说明使用数组手动实现队列功能使用单向链表手动实现队列功能Java中ArrayBlockingQueue和ArrayQueue和LinkedBlockingQueue使用ArrayQueue使用方法如下:ArrayBlockingQueue常用使用方法如下:LinkedBlockingQueue常用使用方法如下:ArrayBlockingQ…

Spring-mvc的参数传递与常用注解的解答及页面的跳转方式---综合案例

目录 一.slf4j--日志 二.常用注解 2.1.RequestMapping 2.2.RequestParam 2.3.RequestBody 2.4.PathVariable 三.参数的传递 3.1 基础类型 3.2 复杂类型 3.3 RequestParam 3.4 PathVariable 3.5 RequestBody 3.6 增删改查 四.返回值 4.1 void 返回值 4.2 String 返…

用go实现dns请求

一、DNS报文格式详解 1.1 报文格式 DNS分为查询请求和查询响应,两者的报文结构基本相同。DNS报文格式如下表展示 0 1516 31事务ID&#…

CVE-2023-28303(截图修复)

在做羊城杯的misc的时候发现了一个图片,典型的图片高度不对,修改之后对图片的高度进行不断修改尝试,发现图片很大,但是内容没有出现, 从这里指知道存在feld文件x 截出zip文件内容,把04 03 改为03 04 这里的…

SOLIDWORKS放样是什么意思?

SOLIDWORKS是一款广受欢迎的三维计算机辅助设计(CAD)软件,提供了许多强大的功能来帮助工程师实现他们的创意。其中一个重要的功能是放样功能,它在设计过程中起着至关重要的作用。本文将介绍SOLIDWORKS放样的概念、特点和应用。 放…

怎么将火狐浏览器中的书签或密码迁移到谷歌浏览器

文章目录 一、点击谷歌浏览器右上角二、选择书签–导入书签和设置…三、点击导入 一、点击谷歌浏览器右上角 二、选择书签–导入书签和设置… 在下拉框中选中Firefox,点击导入 三、点击导入

sublime text 格式化json快捷键配置

以 controlcommandj 为例。 打开Sublime Text,依次点击左上角菜单Sublime Text->Preferences->Key Bindings,出现以下文件: 左边的是Sublime Text默认的快捷键,不可编辑。右边是我们自定义快捷键的地方,在中括号…

手机便签功能在哪里?如何在便签里添加文字图片视频?

手机已成为我们生活中不可或缺的工具,而在使用手机的过程中,我们经常需要随手记录一些重要的事情。那么,如何高效便捷地记录这些事情呢?答案就是使用手机便签软件。但是,有很多人不知道手机便签功能在哪里?…

使用scp在两个linux系统之间传输文件

使用scp在两个linux系统之间传输文件 问题背景拷贝文件首先我们要从源设备(本文中是矩池云自己的服务器)传输文件至目标设备(本文中是A100设备)传输一个文件传输一个文件夹 从目标设备(本文中是A100设备)下…

Python基础之高级函数

异常捕获 Python中,使用trycatch两个关键字来实现对异常的处理。在我们平时的工作中,异常的出现是在所难免的,但是异常一旦出现,极有可能会直接导致程序崩溃,无法正常运行,所以异常一定要及时的做出对应的…

QT(9.5)QT连接OpenCV库完成人脸识别,c语言中的static和c++中的static的用法,在c和c++中const关键字的用法,Qt中基于TCP通信中的服务器和客户端的操作

1.QT完成人脸识别 pro文件: 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map&g…

【STL】模拟实现map和set {map和set的封装;核心结构;插入和查找;红黑树的迭代器;STL中的红黑树结构}

模拟实现map和set map和set是红黑树的两种不同封装形式&#xff0c;底层使用同一颗泛型结构的红黑树&#xff0c;只是存储类型不同。set是红黑树的K模型&#xff0c;存储key&#xff1b;map是红黑树的KV模型&#xff0c;存储pair<key,value>。 下面的代码和讲解着重体现…

Vue进阶(三十三)Content-Security-Policy(CSP)详解

文章目录 一、前言二、XSS 攻击都有哪些类型&#xff1f;三、CSP介绍3.1 使用HTTP的 Content-Security-Policy头部3.2 使用 meta 标签 四、CSP 实施策略五、Vue中可使用的防XSS攻击方式六、拓展阅读 一、前言 作为前端工程师你真的了解 XSS 吗&#xff1f;越来越多超级应用基于…

预付费电表和断路器的连接方式及注意事项

随着智能电网技术的不断发展&#xff0c;预付费电表已经在我国得到了广泛应用。预付费电表不仅可以实现远程自动抄表、实时监控用电量等功能&#xff0c;还可以有效防止偷电行为&#xff0c;提高用电安全。断路器作为低压配电系统中的重要组成部分&#xff0c;具有保护电路、防…

详细介绍 弹性盒子(display:flex)

文章目录 什么是弹性盒子 如何使用弹性盒子flex系列flex-direction 对齐方向 水平对齐垂直对齐flex-wrap 换行flex-flowflex模型说明容器的属性 justify-content X轴对齐方式align-content Y轴对齐方式总结属性值Y轴对齐的另外一种&#xff1a;align-itemsalign-content和alig…

基于Springboot跟rabbitmq实现的死信队列

概述 RabbitMQ是流行的开源消息队列系统&#xff0c;使用erlang语言开发。为了保证订单业务的消息数据不丢失&#xff0c;需要使用到RabbitMQ的死信队列机制&#xff0c;当消息消费发生异常时&#xff0c;将消息投入死信队列中。但由于对死信队列的概念及配置不熟悉&#xff0…

自然语言处理实战项目17-基于多种NLP模型的诈骗电话识别方法研究与应用实战

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目17-基于NLP模型的诈骗电话识别方法研究与应用&#xff0c;相信最近小伙伴都都看过《孤注一掷》这部写实的诈骗电影吧&#xff0c;电影主要围绕跨境网络诈骗展开&#xff0c;电影取材自上万起真…