使用 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我们还是可以抓取到的。

相关推荐
爱滑雪的码农3 小时前
详细说说React大型项目结构以及日常开发核心语法
前端·javascript·react.js
solo_993 小时前
Python 爬取小红书 文章标题和内容 仅供学习
爬虫
@大迁世界4 小时前
43.HTML 事件处理和 React 事件处理有什么区别?
前端·javascript·react.js·html·ecmascript
ZC跨境爬虫4 小时前
跟着 MDN 学 HTML day_38:(DocumentFragment 文档片段接口详解)
前端·javascript·ui·html·音视频
@大迁世界6 小时前
41.ShadCN 是什么?它如何和 Tailwind CSS 集成,从而更容易构建可访问且可自定义的 React 组件?
前端·javascript·css·react.js·前端框架
xiangxiongfly9157 小时前
Vue3 根据角色权限动态加载路由
前端·javascript·vue.js·动态加载路由
费曼学习法9 小时前
React 18 并发模式(Concurrent Mode):Fiber 架构的终极进化
javascript·react.js
_风满楼9 小时前
TDD 进阶:换个角度看会议室预约
前端·javascript·github
子兮曰9 小时前
SuperSplat 深度解析:7.6K Stars 的浏览器端 3D 高斯泼溅编辑器 — 在 Web 上编辑现实
前端·javascript·webgl
xiangxiongfly9159 小时前
Vue3 动态加载静态资源
前端·javascript·vue.js