📜  节点 |使用 Cheerio 进行网络爬取

📅  最后修改于: 2022-05-13 01:56:47.477000             🧑  作者: Mango

节点 |使用 Cheerio 进行网络爬取

通过向特定 URL 发送 HTTP 请求,然后提取该网页的 HTML 以获取有用信息,这称为爬网或网络抓取。

在 Nodejs 中用于爬取的模块:

  1. request:用于向 URL 发送 HTTP 请求
  2. Cheerio:用于解析 DOM 并提取网页的 HTML
  3. fs:用于读取或写入数据到文件中

这些模块的安装:
在 Nodejs 中安装模块的最简单方法是使用 NPM。
它可以通过两种方式完成:

  1. 全局安装:如果我们全局安装任何模块,那么我们可以在系统的任何地方使用它。
    可以通过以下命令完成:
    npm i -g package_name
  2. 本地安装:如果我们在本地安装任何模块,那么我们只能在该特定项目目录中使用它。
    可以通过以下命令完成:
    npm i package_name

对于此任务,我们将使用本地安装:

使用 Cheerio 进行网络爬取的步骤:

  • 第一步:为这个项目创建一个文件夹
  • 步骤 2:打开项目目录中的终端,然后键入以下命令:
    npm init

    它将创建一个名为

    package.json

    其中包含有关模块、作者、github 存储库及其版本的所有信息。
    要了解有关package.json的更多信息,请访问此链接:
    package.json 的解释

    要使用 NPM 在本地安装模块,只需执行以下操作:

    npm install request
    npm install cheerio
    npm install fs
    

    这也可以使用 NPM 在单行中完成:

    npm install request cheerio fs

    成功安装模块后,我们的 package.json 将具有如下结构:

    在此屏幕截图中,我们可以看到所有依赖项都已在依赖项对象中列出,这意味着我们已成功将所有依赖项安装在当前项目目录中。

  • 第 3 步:现在我们将为爬虫编写代码

    编码步骤:

    1. 首先,我们将导入所有需要的模块
    2. 然后,我们将向 URL 发送一个 HTTP 请求,然后所需网站的服务器将响应一个网页,这将通过请求模块完成
    3. 现在,我们有了网页的 HTML,我们的任务是从中提取有用的信息,所以我们将遍历 DOM 树并找出选择器
    4. 提取信息后,我们将其保存到文件中,此任务将在fs模块的帮助下完成
      爬虫代码:
    1. 创建一个名为server.js的文件并添加以下行:
      const request = require('request');
      const cheerio = require('cheerio');
      const mongoose = require('fs');
      

      这些代码行的解释:
      在这三行中,我们将抓取和数据保存所需的所有这三个模块导入文件中。

    2. 我们将点击我们想要抓取数据的 URL:
      在这里,我们将从电子商务网站 Flipkart 抓取智能手机列表。

      在 Flipkart 中显示智能手机列表的 URL 如下:

      const URL = "https://www.flipkart.com/search?q=mobiles";

      在这个 URL 网页上看起来像这样:

      现在我们将在

      request

      模块:

      request(URL, function (err, res, body) {
          if(err)
          {
              console.log(err, "error occured while hitting URL");
          }
          else
          {
              console.log(body);
          }
      });
      

      让我们理解这些代码:
      这里我们使用request模块向flipkart的智能手机URL发送HTTP请求,request模块内的函数分别接受三个参数error、response、body。
      在这里,如果出现错误,那么我们记录它,否则我们记录正文。

      为了测试它,我们何时运行我们的脚本

      node server.js

      我们可以在控制台中看到页面的整个 HTML。
      它是此 URL 的网页的完整 HTML。

      现在我们的任务是提取有用的信息,因此我们将访问 DOM 树并通过检查元素找出选择器。
      为此,请右键单击网页并转到类似的检查元素:

      现在我们将访问 DOM:

      现在我们将根据检查更改我们的请求以点击 URL:

      request(URL, function (err, res, body) {
          if(err)
          {
              console.log(err);
          }
          else
          {
      
              let $ = cheerio.load(body);  //loading of complete HTML body
          
              $('div._1HmYoV > div.col-10-12>div.bhgxx2>div._3O0U0u').each(function(index){
                  const link = $(this).find('div._1UoZlX>a').attr('href');
                  const name = $(this).find('div._1-2Iqu>div.col-7-12>div._3wU53n').text();
                  console.log(link);   //link for smartphone
                  console.log(name);   //name of smartphone
              });
          }
      });
      
    3. 将数据保存到文件中
      为此,我们将创建一个数组和一个对象
      let arr = [];  //creating an array
      
      let object =   
      {
         link : link,
         name : name,
      }  //creating an object
      
       fs.writeFile('data.txt', arr, function (err) {
                  if(err) {
                      console.log(err);
                  }
                      else{
                          console.log("success");
                      }
              });
      

      在每次迭代中,我们会将对象转换为字符串后将其推送到数组中;
      最后我们将整个数组写入文件。通过这种方法我们的完整数据将成功保存在文件中!

      现在我们的整个代码都会喜欢它:

      // Write Javascript code here
      const request = require('request');
      const cheerio = require('cheerio');
      const fs = require('fs');
        
        
      const URL = "https://www.flipkart.com/search?q=mobiles";
        
      request(URL, function (err, res, body) {
          if(err)
          {
              console.log(err);
          }
          else
          {
              const arr = [];
              let $ = cheerio.load(body);
              $('div._1HmYoV > div.col-10-12>div.bhgxx2>div._3O0U0u').each(function(index){
                    
                  const data = $(this).find('div._1UoZlX>a').attr('href');
                  const name = $(this).find('div._1-2Iqu>div.col-7-12>div._3wU53n').text();
                  const obj = {
                      data : data,
                      name : name
                  };
                  console.log(obj);
                  arr.push(JSON.stringify(obj));
              });
              console.log(arr.toString());
              fs.writeFile('data.txt', arr, function (err) {
                  if(err) {
                      console.log(err);
                  }
                      else{
                          console.log("success");
                      }
              });
        
          }
      });
      

    现在运行代码:

    node server.js

    运行代码时,您可以在终端上看到这样的输出:

    成功运行代码后,还有一个名为 data.txt 的文件,其中包含所有提取的数据!我们可以在我们的项目目录中找到这个文件。

    因此,这是一个简单的示例,说明如何使用 Cheerio 模块在 nodejs 中创建网络爬虫。从这里,您可以尝试废弃您选择的任何其他网站。如有任何疑问,请在评论部分下方发布。