Node.js 中的 Web Scraping

2025年2月26日 | 阅读 6 分钟

在本篇文章中,我们将学习 Node.js 中的网页抓取,包括其语法和示例。

引言

在现代虚拟技术中,从网站访问和获取信息对于许多用途(包括机构情报、自动化以及研究和评估)变得越来越重要。网页抓取是以编程方式提取和操作网站 HTML 内容的技术。

语法

在进行其他示例之前,让我们先了解一下 Node.js 中网页抓取的语法。就像 Cheerio 可用于 HTML 解析一样,Axios 库可以是处理 HTTP 请求的首选工具。

示例 1

让我们抓取一个简单的网页并提取一些信息。考虑一个包含文章列表的网页,每篇文章都包含在一个具有 class “article” 的<div> 中。

现在,我们要提取这些文章的标题和描述。

输出

 
Title: Title 1
Description: Description 1
 
Title: Title 2
Description: Description 2   

说明

  • 在此示例中,我们使用 Axios 向网页发送 HTTP GET 请求。
  • 收到响应后,我们使用 Cheerio 加载 HTML 内容。
  • 接下来,我们使用类似 jQuery 的语法选择所有 class 为 “articles” 的元素,并遍历每个元素。
  • 对于每个元素,我们查找其中的 <h2> 和 <p> 元素,并提取它们的文本内容。
  • 最后,我们为每篇文章记录提取的标题和描述。

附加要点

  • 管理动态内容:初步页面加载后,网站经常使用 JavaScript 加载动态内容。我们可能需要使用 Puppeteer 等程序,它运行一个无头浏览器来抓取这类页面。
  • 检查 Robots.Txt:我们必须仔细评估网站的 robots.Txt 文件,以确定是否允许抓取,并观察可能受到保护的任何建议。
  • 配置 Headers 和 User Agents:如果网站认为请求来自机器人,它可以通过配置与有效浏览器类似的 headers 和用户代理来拒绝该请求。
  • 处理分页:如果我们所需的数据分布在多个页面上,我们将不得不处理分页。这通常意味着动态地构建 URL 并逐个网页地重新导航以收集所需的事实。
  • 重试和错误处理:在抓取过程中,可能会出现服务器和网络错误。开发强大的错误处理和重试策略,以确保网页抓取程序的可靠性。
  • 清理和验证数据:抓取的数据也可能包含错误或不一致。在信息用于分析之前,需要对其进行检查和清理。
  • Cookies 和会话管理:某些网站使用 cookie 来跟踪会话或要求身份验证。除了发送请求来抓取经过身份验证的内容外,我们可能还需要处理 cookie 传递或登录会话。
  • 优化性能:大规模抓取可能需要大量资源。实施优化,例如缓存、限制请求速率以及使用异步处理,以提高速度并减轻目标服务器的负担。
  • 管理反抓取机制:网站可能会使用 IP 封锁或 CAPTCHA 作为反抓取技术。为了绕过这些限制,可以考虑轮换用户代理或使用代理。

示例 2

让我们通过 Node.js 进行实际的网页抓取示例。假设我们要从新闻网站提取最新头条。我们将获取页面的 HTML 内容,并使用 Cheerio 提取头条。

首先,我们将安装必要的库

现在,让我们编写代码

输出

 
Latest Headlines:
- Breaking News: Earthquake Strikes Region
- New Study Reveals Surprising Health Benefits of Chocolate
- Tech Giant Announces Launch of Revolutionary Product   

说明

  • 使用Axios,我们首先向新闻网站发送 HTTP GET 请求。
  • 在获得响应后,我们将 HTML 内容加载到 Cheerio 对象中,这样我们就可以使用类似 jQuery 的语法来遍历和操作 DOM。
  • 使用.each()方法,在选择所有 class 为 “headline” 的元素后,我们遍历每个元素。
  • 我们使用$(element)来检索每个头条元素。使用 text() 将其插入到数组中。
  • 最后,将头条数组记录到控制台。

示例 3

考虑以下 HTML 结构

让我们编写代码来抓取此信息

输出

 
Products:
- Title: Product 1
  Price: $50
  Rating: 4.5 stars
- Title: Product 2
  Price: $80
  Rating: 4.2 stars   

说明

  • 与前面的示例一样,我们首先向网站发送 HTTP GET 请求。
  • 在加载 HTML 内容后,我们使用.each()函数遍历每个 .product 元素。
  • 对于每个产品,我们通过导航其子元素来提取标题、价格和评分。
  • 现在,我们将此信息推送到产品数组中。
  • 最后,我们将结构化的产品数据记录到控制台。

示例 4

让我们探索另一个抓取带有分页的网站数据的示例。我们将抓取一个论坛网站,该网站在多个页面上列出了帖子及其作者。

考虑论坛的 HTML 结构

我们的目标是从多个页面提取每个帖子的标题及其作者。让我们编写代码

输出

 
Threads - Page 1:
- Title: Thread 1
  Author: User1
- Title: Thread 2
  Author: User2
 
Threads - Page 2:
- Title: Thread 3
  Author: User3
- Title: Thread 4
  Author: User4   

说明

  • 在此示例中,我们定义了一个函数scrapePage来抓取给定页码的帖子。
  • 在此函数内部,我们向带有指定页码的论坛页面发送 HTTP GET 请求。
  • 使用 Cheerio,我们提取每个帖子的标题和作者,并将它们推送到数组中。
  • 之后,我们记录当前页面的帖子数据。
  • 抓取完页面后,我们检查分页元素,看是否有下一页。如果存在,我们将页码加一,并递归调用 scrapePage 来抓取下一页。

结论

  • 总而言之,Node.js 中的网页抓取为开发人员提供了一种强大的方式来提取网站数据以满足各种需求。通过示例和要素,我们利用 Axios 和 Cheerio 等流行库探索了网页抓取的基础知识。
  • 从抓取新闻头条、提取产品信息到管理分页,我们已经看到了 Node.js 如何能够有效地从网络收集结构化数据。但是,以负责任和合乎道德的方式处理网页抓取至关重要。
  • 始终遵守我们抓取网站的服务条款,避免因请求而使服务器过载,并注意法律问题,包括版权法和数据隐私规定。
  • 通过学习本博客中概述的工具和最佳实践,我们可以根据我们的需求构建强大的网页抓取解决方案,无论是用于研究、分析还是自动化。