使用 Express 和 Node js 进行网页内容的抓取

以前老俊总是通过PHP脚本来抓取网页数据,近几年,得益于node的发展,老俊越多越多的使用了node技术栈来做爬虫,据统计,使用nodejs来爬取数据已经成为了从网站提取数据的最流行的方法之一。

想象一下,您想要创建一家在线服装商店,但您不确定要在网站上放置什么衣服。网页抓取可以拯救您!这就像有一个特殊的工具,可以去其他网上商店,查看他们的衣服,并带回重要信息,例如衣服的名称、它们的外观以及它们的价格。该工具可以帮助您从不同的商店收集所有这些详细信息,以便在您的网站上使用它们。这就像从其他地方借用一些信息来帮助建立自己的商店一样。 网络抓取意味着从网站获取数据。然后收集这些数据并将其转换为更有用的格式,例如将其放入电子表格中或以称为 API 的特殊方式使其可供使用。这就像从网站中挑选出重要的内容并使人们更容易使用一样。

我们如何使用Node js 进行网页抓取呢?

本篇文件介绍如何使用 Node.js 构建 JavaScript 网络抓取工具。

先决条件

  • Node.js 与 npm
  • 支持 JavaScript 的 IDE。我正在使用可视化代码编辑器,老俊无条件选择vscode

本教程基于 Node.js 18.12 和 npm 8.19

搭建步骤

第 1 步:设置 Node.js 项目

shell 复制代码
mkdir web-scraper
cd web-scraper
npm init -y

此命令将为您设置一个新的 npm 项目。请注意,需要 -y 标志来使 npm 初始化默认项目而不经过交互过程。如果省略 -y 标志,系统会在终端中询问您一些问题。

web-scrapper 现在应该包含如下所示的 package.json:

我打算在我的项目中使用其他 Node.js 包,即 nodemon、express、axios 和 Cheerio。

  • express:这是一个广泛认可的 Node.js Web 框架,可以简化构建 Web 应用程序的过程。
  • axios:一个非常流行的 JavaScript 库,用于发出 HTTP 请求,促进流畅的网络通信。
  • nodemon:为了增强我的开发过程,我将使用nodemon。该工具持续监控源代码更改并自动重新启动服务器以简化测试。
  • cheerio : 为了在服务器端执行网络爬虫,我将使用 cheerio。这是一种 JavaScript 技术,以其在解析和处理 HTML 内容方面的实用性而闻名。如需深入了解,请参阅 cheerio.js.org/docs/intro 上的官方文档。
shell 复制代码
npm install express axios nodemon cheerio

之后,我们需要在 package.json 文件中指定启动 nodemon 服务器,如下所示

创建 Index.js 文件

随后,在终端中输入命令"npm start"。此操作将启动您的服务器。通过在网络浏览器中导航到"localhost:5000",您将收到一条"欢迎🙌"消息,确认您的服务器已启动并正在运行。

步骤 3:启动网页抓取过程

这里我们将举例从这个网站提取数据:www.octaveclothing.com/men

在此,我们将提取产品标题、描述和价格等信息。

通过将以下两行代码添加到 index.js 来导入 cheerio 和 axios :

javascript 复制代码
// index.js 

const cheerio = require("cheerio")
const axios = require("axios")

现在借助 axios 下载目标网站数据,如下所示:

javascript 复制代码
// index.js

await axios("https://www.octaveclothing.com/men").then((response) => {
  const html_data = response.data;
})

现在,我们已将网页数据加载到 html_data 变量中。

之后,我们将在 Cheerio 的帮助下加载这些数据。

javascript 复制代码
const $ = cheerio.load(html_data);

Cheerio load() 方法接受字符串形式的 HTML 内容。您应该调用 Cheerio 变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> ,因为 C h e e r i o 与 j Q u e r y 的语法基本相同。 < b r / > 我们可以使用 C h e e r i o 的类来选择 H T M L 元素 : c o n s t h t m l E l e m e n t = ,因为 Cheerio 与 jQuery 的语法基本相同。<br />我们可以使用 Cheerio 的类来选择 HTML 元素:const htmlElement = </math>,因为Cheerio与jQuery的语法基本相同。<br/>我们可以使用Cheerio的类来选择HTML元素:consthtmlElement=(".elementClass")

javascript 复制代码
async function cryptopriceScraper() {
    const url = "https://www.octaveclothing.com/men";
    const result = [];
    await axios(url).then((response) => {
      const html_data = response.data;
      const $ = cheerio.load(html_data);
      
      const keys = ["Title","Description","Price"];
      const selectedElem = ".views-infinite-scroll-content-wrapper > .row > .col-6 > .product-7 > .product-body"
      
      $(selectedElem).each((parentIndex, parentElem) => {
        let keyIndex = 0;
        const data = {};
        if (parentIndex) {
          $(parentElem)
          .children()
          .each((childId, childElem) => {
            const value = $(childElem).text();
              if (value) {
                data[keys[keyIndex]] = value;
                keyIndex++;
              }
            });
          result.push(data);
        }
      });
    });
    return result;
  }

此 Node.js 片段从目标网页(即 ( www.octaveclothing.com/men )中选择所有产品卡主体。

然后,它迭代所有 HTML 元素。对于每个产品卡片,它都会爬取产品的标题、描述和价格

现在,我们创建一个 get 类型的 API 并在其中调用该函数。

javascript 复制代码
app.get("/data-scrapper", async (req, res) => {
    try {
      const data = await cryptopriceScraper();
      return res.status(200).json({
        result: data,
      });
    } catch (err) {
      return res.status(500).json({
        err: err.toString(),
      });
    }
});

现在,在浏览器中使用此 API 接口时,先显示我们需要爬取的数据并且以json格式显示。

我们拿到JSON后,就可以进行二次加工或者导出,比如可以直接导出到excel。

总结

在这个项目中,我们了解了如何从在线商店的网站收集信息。您还掌握了使用 Cheerio 来理解和修改 HTML 元素的窍门。现在,有了这些知识,我们就可以从不同的网站抓取数据。请记住,在开始抓取网站之前,请先检查一下他们的网页结构,有的网页采用的是Spa模式,这种就会比较难抓取到,但借助更高级的工具如poputeer我们还是可以抓取到的。

相关推荐
EasyNTS10 分钟前
无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
前端·javascript·vue.js
老码沉思录15 分钟前
React Native 全栈开发实战班 - 数据管理与状态之Zustand应用
javascript·react native·react.js
老码沉思录20 分钟前
React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
javascript·react native·react.js
guokanglun34 分钟前
Vue.js动态组件使用
前端·javascript·vue.js
我认不到你1 小时前
antd proFromSelect 懒加载+模糊查询
前端·javascript·react.js·typescript
scc21401 小时前
spark的学习-06
javascript·学习·spark
我是苏苏2 小时前
C# Main函数中调用异步方法
前端·javascript·c#
好看资源平台2 小时前
爬虫开发工具与环境搭建——环境配置
爬虫·python
转角羊儿2 小时前
uni-app文章列表制作⑧
前端·javascript·uni-app
Bio Coder3 小时前
学习用 Javascript、HTML、CSS 以及 Node.js 开发一个 uTools 插件,学习计划及其周期
javascript·学习·html·开发·utools