Node.js 爬虫实战:使用 cheerio 抓取网页数据的技巧

阅读时长 9 min read

在前端开发中,经常需要从互联网上获取数据。常用的方法是通过 HTTP 调用 API,收到服务器发回来的数据后进行处理并显示在页面上。然而,在某些情况下,API 并不能满足前端工程师的需求,比如:API 返回数据不完整、API 访问速度慢等等。这时,就需要使用爬虫技术了。

本文将介绍如何使用 Node.js 爬虫技术来抓取网页数据,并使用 cheerio 这个 Node.js 模块来处理 HTML 文档。我们将从以下方面来讲解:

  • 爬虫原理
  • 使用 Node.js 发送 HTTP 请求
  • 使用 cheerio 处理 HTML 文档

爬虫原理

爬虫是指通过程序自动访问和抓取互联网上的信息。其基本原理是从指定的网页 URL 开始,利用 HTTP 请求模拟浏览器发送请求,获取网页源码,然后对源码按需求进行解析和处理。

对于前端工程师而言,爬虫的作用是获取那些无法通过 API 接口获取到的数据,比如爬取京东的价格、抓取虎扑体育的赛事信息。在使用爬虫之前,需要向网站所有者索取正式的 API 接口,并在遵守遵守伦理和法律的基础上进行爬虫操作。

使用 Node.js 发送 HTTP 请求

Node.js 提供了 httphttps 模块来发送 HTTP/HTTPS 请求。最常用的是 http.request() 方法,该方法接受一个 URL 字符串作为参数,返回一个 http.ClientRequest 类的实例,该实例用于向服务器发送请求,并提供了一些有用的方法和事件来操作和处理请求。

以下是使用 Node.js 发送 HTTP 请求的示例:

在以上示例中,我们发送了一个 GET 请求到 www.example.com 网站,当服务器返回数据时,数据会被存入 data 变量中,并在请求结束后,打印在控制台上。该模式是非常基础的,实际使用中需要添加更多参数来满足不同的需求。

使用 cheerio 处理 HTML 文档

对于前端工程师来说,抓取到的网页源码通常都是 HTML 文档。为了便于处理 HTML 文档,我们可以使用 Node.js 的 cheerio 模块。

cheerio 模块是 jQuery 核心的某些功能的精简实现,可以在服务器端使用 jQuery 样式的语法来操作 HTML 文档,提供了一种快速、灵活和具有表现力的方式来处理 HTML 文档,是 Node.js 中处理 HTML 实时爬取的首选代码库。

以下是使用 cheerio 解析 HTML 文档的示例:

在以上示例中,我们首先将 HTML 文档加载到 cheerio 中,然后使用 jQuery 语法中的 text() 方法获取了 title 标签中的文本内容,并打印在控制台上。

除了使用 text() 方法,我们还可以使用其他 jQuery 样式的语法来操作 HTML 文档,例如:find()html()attr() 等方法。cheerio 还具有强大的选择器功能,允许我们使用类似于 CSS 的选择器来查找和定位 DOM 节点,比如 $(".container .item:even") 可以选择所有偶数位置的 .item 元素。学习选择器,可以参考 Cheerio 官方文档

实战演练:抓取电影排行榜

我们使用 Node.js 爬虫技术和 cheerio 模块来抓取一个电影排行榜网站的数据,过程如下:

第一步:加载网页

首先,我们需要了解电影排行榜网站的数据请求和返回方式,并按照网站的要求获取数据,这里我们使用 http.request() 方法来发送 HTTP 请求,代码如下:

注意:由于在 Node.js 中发送 HTTP 请求需要输入完整的 URL 地址,所以需要根据电影排行榜网站的要求,填写合适的参数。

第二步:解析 HTML 文档

将网页源码收集到变量 data 中后,就可以使用 cheerio 模块来解析数据了。在编写代码之前,我们可以先查看一下电影排行榜网站的 HTML 结构,并根据结构来编写代码。

网页结构如下:

解析该 HTML 文档,获取下列信息:

  • 电影名字
  • 导演姓名
  • 主演姓名
  • 电影评分
  • 评价人数

代码如下:

以上代码首先利用 cheerio.load() 方法将抓取的 HTML 文档载入节点,然后使用 list.each() 方法遍历每个电影条目,按照查询节点的方式找到网页中需要的信息,并在控制台上打印。

到此,我们已经学会了如何使用 Node.js 和 cheerio 模块来实现爬虫,在实际使用中可以根据不同的需求进行调整和优化。在操作上,爬虫有很多细节需要注意,比如网站反爬虫技术、多次请求频率过高导致被封 IP 等,需要综合考虑遵守商业道德和相关法律法规。

Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67c014ba314edc2684629dd3