使用 Node.js 进行网络抓取入门(JavaScript)

扫描, Jan-08-20225 分钟阅读

您是否正在寻找利用新技术的方法?网络提取或网络刮擦为您提供了一种以自动化方式收集结构化网络数据的方法。例如,在电子商务领域,网络搜索可用于监控竞争对手服务和产品的定价。网络搜索的其他使用案例

目录

您是否正在寻找利用新技术的方法?网络提取或网络刮擦为您提供了一种以自动化方式收集结构化网络数据的方法。例如,在电子商务领域,网络搜索可用于监控竞争对手服务和产品的定价。以下是网络采集的其他使用案例。

  • 查找社交媒体网站上的趋势数据
  • 从其他网站收集数据用于自己的网站
  • 从发布公开电子邮件的网站中提取电子邮件地址
  • 搜索在线商店的产品图片和销售数据

您将学习如何使用 Node.js 进行网络刮擦。首先,我们来了解一下什么是 Node.js。它是一个开源服务器端平台,用于开发服务器端和网络应用程序。其程序库的代码执行速度非常快,因为其应用程序不缓冲任何数据。它们只需分块输出数据。以下是我们可以使用 Node.js 的一些领域。

  • 数据流应用
  • 单页应用程序
  • 输入/输出绑定应用
  • 数据密集型实时应用

为什么使用 Node.js 进行网络抓取?

以下是使用 Node.js 进行网络刮擦的原因。

易于学习 - Javascript 是前端开发人员常用的编程语言。由于 Node.js 是一种简单的 Javascript,他们可以很快学会并在后端使用 Node.js。因此,他们不必为学习 Node.js 付出额外的努力。

单一编程语言-- 您可以使用 Node.js 以 Javascript 编写服务器端应用程序。简而言之,Node.js 开发人员使用 Javascript 编写前端和后端网络应用程序。他们无需使用任何其他服务器端编程语言。因此,他们可以轻松部署网络应用程序,因为几乎所有的网络浏览器都支持 Javascript。 

可扩展性 - Node.js 开发人员可以轻松地在水平和垂直方向上扩展应用程序。他们可以在现有系统中添加额外的节点,以横向扩展应用程序。他们可以通过向单个节点添加额外资源来纵向扩展应用程序。 

高性能 - Node.js 使用 Google 的 V8 Javascript 引擎来解释 Javascript 代码,并将其直接编译为机器代码。因此,您可以使用该引擎有效地执行代码。 

缓存-- 开发人员还可以使用 Node.js 的开源运行时环境缓存单个模块。缓存可使应用程序更快地加载网页,因此开发人员无需重复使用代码。   

使用 Node.js 进行网络抓取

在使用 Node.js 进行网络刮擦时,我们将使用以下两个npm 模块。

cheerio -这是一种 Javascript 技术,用于从网站中提取数据。它有助于选择、编辑和查看 DOM 元素。

request-promise - 它是一个简单的 HTTP 客户端,可用于快速、轻松地进行 HTTP 调用。

项目设置

您必须创建一个新的项目文件夹。在该文件夹中创建一个index.js文件。然后安装依赖项。为此,请打开命令行并键入以下命令。 

npm install --saverequest request-promise cheerio

您必须使用下面的代码在 index.js 文件中要求request-promise 和 cheerio。

const rp= require('request-promise');
const cheerio= require('cheerio');

设置要求

我们知道,request-promise 是一个支持 Promise 的客户端"请求"。换句话说,它接受一个对象作为输入,并返回一个 Promise。 

const options = {
 uri: `https://www.yourURLhere.com`,
 transform: function (body) {
   return cheerio.load(body);
 }
};

在上述代码中,选项 对象必须做两件事。

  • 通过传递 URL,您要抓取
  • 使用 cheerio 加载返回的 HTML,以便使用。

代码中的uri关键字是您要抓取的网站。

转换 密钥使用请求承诺将返回的正文加载到 cheerio 中,然后再返回给我们。

提出请求

您可以使用下面的代码提出申请。

rp(OPTIONS)
   .then(function (data) {
       // REQUEST SUCCEEDED: DO SOMETHING
   })
   .catch(function (err) {
       // REQUEST FAILED: ERROR OF SOME KIND
   });

在上述代码中,我们将选项对象传递给 request-promise。然后,我们等待请求成功或失败。 

现在,我们创建自己的代码版本,在其中使用箭头函数,如下所示。

rp(options)
 .then(($) => {
   console.log($);
 })
 .catch((err) => {
   console.log(err);
 });

您必须将占位符uri 替换为您要抓取的网站。然后打开控制台,在 index.js 文件中键入以下内容。

{ [Function: initialize]
 fn:
  initialize {
    constructor: [Circular],
    _originalRoot:
     { type: 'root',
       name: 'root',
       namespace: 'http://www.w3.org/1999/xhtml',
       attribs: {},
       ...

这就是如何使用 Node.js 进行第一次刮擦。下面是我们目前所做的全部代码。

const rp = require('request-promise');
const cheerio = require('cheerio');
const options = {
  uri: `https://www.google.com`,
  transform: function (body) {
    return cheerio.load(body);
  }
};

rp(options)
  .then(($) => {
    console.log($);
  })
  .catch((err) => {
    console.log(err);
  });

使用数据

您可以使用 cheerio 提取您想要的数据。cheerio 选择器的实现与 jQuery 的几乎相同。您可以使用选择器方法来遍历和选择文档中的元素。您还可以用它来获取和设置数据。例如,您想抓取某个网站的以下 HTML 内容。

 id="cities">
 class ="large">欧洲
 id="medium">土耳其>
 class ="small">萨利姆>

我们可以使用"#"来选择 id,使用". "来选择类。如下图所示,可以通过标签名称选择元素。

$('.large').text()
// 欧洲
$('#medium').text()
// 土耳其
$('li[class=small]').html()

我们可以使用each()函数遍历多个元素。我们可以使用如上所示的 HTML 代码返回列表项的内部文本。

$('li').each(function(i, elem) {
 cities[i] = $(this).text();
});

这就是使用 Node.js 从网站中抓取数据的方法。您还可以使用其他方法来提取列表中子元素的数据或网站的 HTML。

通过代理使用 Node.js 的重要性

大家都知道,代理在请求资源的客户端和提供资源的服务器之间起着中介的作用。代理有三种不同类型,如下所示。

住宅代理 - 这种代理包含来自本地互联网服务提供商(ISP)的 IP 地址,因此目标网站无法确定浏览网站的是真实的人还是搜刮者。 

数据中心代理 - 这类代理由云服务提供商提供,因为比住宅代理便宜,所以使用的人很多。

移动代理 - 移动 代理是私人移动设备的 IP,其工作原理与住宅代理相同。它们由移动网络运营商提供,价格非常昂贵。 

您可以使用 Python 的requests 模块来使用代理进行网络搜刮。首先,必须导入 requests 模块。然后,创建一个代理池并迭代它们。您可以使用 requests.get()发送GET请求,将代理作为参数传递给 URL,如下图所示。

import requests
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
# Sending a GET request to the url and
# passing the proxy as a parameter.
page = requests.get(url,
                   proxies={"http": proxy, "https": proxy})
 # Printing the content of the requested url.
print(page.text)

您将得到以下输出结果。

使用 Node.js 进行网络抓取的结论

到目前为止,我们已经讨论过可以使用称为网络刮擦的自动化方法从网站中提取结构化数据。您可以使用不同的语言刮擦网站,但在本文中,我们学习了如何使用 Node.js 从网站收集数据。我们所要做的就是在项目文件夹的 index.js 文件中添加代码。设置好项目后,我们就可以设置并提出提取数据的请求。此外,我们还可以将数据用于各种用途。要知道,从网站上搜刮数据并不安全。因此,你必须使用代理从你想要的网站收集数据。您可以使用住宅代理或数据中心代理,但最好使用住宅代理,因为它们速度快,不易被发现。