在 JavaScript 中用 ES8 async/await 实现网页爬虫

阅读时长 5 分钟读完

现如今,互联网已经成为人们获取各类信息的主要渠道,网站的数量也在不断地增长,这就给网络爬虫带来了很大的挑战。网页爬虫相当于网络中的“蚂蚁”,可以在网络上爬行收集数据,可以应用于搜索引擎、数据分析、人工智能等领域。

JavaScript 现在已经成为前端开发的主要语言,同时在 Node.js 中也得到了广泛的应用,因此使用 JavaScript 来实现网页爬虫是一种简单高效的方法。而 ES8 中的 async/await 语法则可以让我们更加方便地实现异步操作,因此它们被广泛地应用于 Node.js 中的网络爬虫中。

异步操作和 Promise

在深入讲解 async/await 之前,我们需要了解 JavaScript 异步操作和 Promise 的概念。

JavaScript 是一门单线程语言,这导致了它不能像其他多线程语言一样可以同时执行多个任务。而异步编程是指让程序在等待某些操作完成的同时可以执行其他操作,从而提高程序的效率。在 JavaScript 中,我们通常使用回调函数和 Promise 来实现异步操作。

回调函数指的是在一个函数中将需要等待的操作传递给一个参数,并定义了一个回调函数作为该操作完成后要执行的操作。但是这种方式会导致代码的阅读性变差,且容易出现回调地狱的问题。

Promise 是一种通过对象的状态来实现异步编程的方法。Promise 对象有以下三种状态:

  • Pending(等待):初始状态,既不是成功,也不是失败状态。
  • Fulfilled(成功):意味着操作成功完成,Promise 对象传递的值作为 then() 方法的参数进行处理。
  • Rejected(失败):意味着操作失败,Promise 对象传递的值作为 catch() 方法的参数进行处理。

ES8 的 async/await

ES8 中的 async/await 语法可以让我们更加方便地处理异步操作。async 函数必定返回一个 Promise 对象,而在 async 函数中使用 await 可以等待其他异步操作完成后再进行下一步操作。

async 函数的基本结构如下:

接下来,我们以实际代码为例,讲解如何使用 async/await 实现网页爬虫。

网页爬虫实例

下面我们以 Node.js 中的 cheeriorequre 模块来实现一个简单的网页爬虫。

首先,需要安装两个 npm 包,分别是 requestcheerio。命令行输入以下命令即可安装。

然后,我们需要编写一个程序来获取指定网站的 HTML 代码,以便我们从中提取所需的数据:

-- -------------------- ---- -------
-- ----
----- ------- - -------------------
----- ------- - -------------------

-- ------
----- --- - --------------------------

-- - ------- ---- ---- --
------------ ----- --------- ----- -- -
  -- --------------
  -- ----- -
    -----------------
    -------
  -

  -- - ------- ---- ---- --
  ----- - - -------------------

  -- -------
  ----- ----- - ------------------
  -------------------
---

在上面的代码中,我们首先引入了 requestcheerio 模块,然后使用 request 模块获取指定网站的 HTML 代码,如果请求失败,捕获错误,并输出错误提示信息。如果请求成功,则用 cheerio 模块将 HTML 代码解析成 DOM 树,接着我们可以从中提取出我们需要的数据。

上面的代码使用了回调函数来实现异步操作,但是如果业务逻辑中有多个异步操作,代码就会变得很难维护。我们可以使用 async/await 来优化代码:

-- -------------------- ---- -------
-- ----
----- ------- - -------------------
----- ------- - -------------------

-- ------
----- --- - --------------------------

-- ----- ----
----- -------- ------ -
  -- ------- --
  ----- ---- - ----- --- ------------------------- ------- -
    ------------ ----- --------- ----- -- -
      -- ----- ------------
      --------------
    ---
  ---

  -- - ------- ---- ---- --
  ----- - - -------------------

  -- -------
  ----- ----- - ------------------
  -------------------
-

-- -- ----- --
----------------------------

在上面的代码中,我们定义了一个 async 函数 main,使用 Promise 对 request 做了一层封装,接着使用 await 等待异步操作完成,然后使用 cheerio 模块解析 HTML 代码,并从中提取所需数据。

总结,在 JavaScript 中,使用 async/await 可以让我们更加方便地处理异步操作,使用它可以优化代码结构,也更加易于维护,上述实例中,我们使用了 async/await 来实现了一个简单的网页爬虫,为实际业务的实现提供了技术指导和学习意义。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64803d7b48841e9894fbab97

纠错
反馈