返回博客
指南
Raluca PenciucLast updated on Mar 31, 20263 min read

用于发送 HTTP 请求的 5 大 Node-Fetch 替代方案

用于发送 HTTP 请求的 5 大 Node-Fetch 替代方案

node-fetch 团队的成员都知道,安装该模块是多么简单。只需执行一句简单的 npm install node-fetch,即可立即获取所需资源。您无需自行实现 XMLHttpRequest。

学习如何获取数据可能会让人感到不知所措,因为市面上有成千上万种解决方案。每种方案都声称自己比其他方案更优越。有些方案提供跨平台支持,而另一些则专注于开发者体验。

Web 应用程序需要频繁与 Web 服务器通信以获取各种资源。您可能需要向 API 或外部服务器发送或获取数据。

在本篇博客中,我将带您深入了解 node-fetch。您将明白它是什么以及如何使用它。此外,我还列出了您可以选择的 node-fetch 替代方案。

言归正传,让我们开始吧!

Node-fetch

Node-Fetch 是一个小型模块,用于为 Node.js 添加 Fetch API。

图片来源

借助 fetch(无论是浏览器中的还是通过 Node-Fetch),您可以结合 await 和 .then 语法,让读取流并将其转换为 JSON 的过程变得更加顺畅——因此数据,

如下面的示例所示,它直接包含 JSON 数据,无需使用难看的中间变量。

图片来源

此外,Node Fetch 还支持一些实用的扩展功能,例如响应大小限制、重定向限制以及用于调试的显式错误处理。

您可以使用多种库(包括 NodeJS 中的 node-fetch)来发布或获取数据。而在客户端,JavaScript 的 Fetch API 也可用于实现相同功能

在获取 Google 主页之前,您可以加载 node-fetch 模块。您向 fetch() 方法提供的唯一参数是您发送 HTTP 请求的目标服务器地址。 

由于 node-fetch 基于 Promise 机制,您可以串联多个 .then() 操作来处理请求的响应和数据。

URL 字段仅包含我们要获取的资源的实际 URL。如果它不是绝对 URL,该函数将失败。 

当您希望将 get() 用于标准 GET 请求以外的情况时,我们会使用可选的 options 参数,但我们稍后会详细讨论这一点。

该方法返回一个 Response 对象,该对象提供了实用函数和 HTTP 响应信息,例如:

  • Text() - 将响应正文作为字符串返回。
  • JSON() - 将响应正文转换为 JSON 对象,若无法处理则返回错误。
  • Status 和 statusText - 这些字段包含有关 HTTP 状态码的信息。
  • Ok - 若状态码为 2xx 状态码(成功状态),则返回 true。
  • Headers - 一个包含响应头信息的对象;可使用 get() 函数获取单个响应头。

流行度

  • 800 万次 npm 每周下载量
  • +6.8K 依赖 node-rest 的模块
  • +383 次分叉
  • 3.8K GitHub 星标
  • 38 位贡献者

node-fetch 的功能

  • 保持与 window.fetch API 的一致性。
  • 在遵循流规范和 WHATWG fetch 规范的实现细节时,进行审慎的权衡,并描述已知的差异。
  • 使用异步函数和原生 Promise 
  • 在请求和响应中,均使用原生 Node 流处理正文。
  • 正确解码内容编码(gzip/brotli/deflate),并自动将字符串输出(包括 res.json() 和 res.text())转换为 UTF-8。
  • 为了便于调试,有价值的补充包括响应大小限制、重定向限制和显式错误。

优点

  • Node-fetch 的安装大小约为 150 KB,可能是最轻量级的 HTTP 请求模块。 
  • 它提供了令人印象深刻的功能,例如 JSON 模式、Promise API、浏览器兼容性、请求取消,以及替换其 Promise 库或解码 deflate/gzip 等现代 Web 编码的能力。 
  • 它遵循最新的 JavaScript HTTP 请求模式,并且仍然是仅次于 request 的下载量最大的模块,每周下载量约为 800 万次(超过 Got、Axios 和 Superagent)。

为何需要 Node-fetch 的替代方案

  • 它不支持 HTTP/2 或 Cookie
  • Node-fetch 不支持符合 RFC 标准的缓存
  • Node-fetch 在请求失败时不会重试 
  • 它不支持进度事件、元数据错误、高级超时或钩子。

我推荐的顶级 Node-fetch 替代方案

以下是我推荐的 5 大 Node-fetch 替代方案,可供您在解决方案中使用

  • Axios
  • Got
  • Superagent
  • Request
  • WebscrapingAPI

我将逐一为您介绍,以便您更好地了解它们是什么以及它们能提供什么。

让我们开始吧!

1. Axios

Axios 是一个基于 Promise 的 HTTP 客户端,适用于 Node.js 和浏览器。它与 SuperAgent 一样,能够自动解析 JSON 响应。Axios 支持并发查询的能力使其更具优势。总之, 

安装 Axios

图片来源

您可以通过传递相应的配置来进行请求。

图片来源

由于其简单易用,一些开发者更倾向于使用 Axios 而不是内置 API。然而,许多人高估了此类库的必要性。node-fetch 完全能够实现 Axios 的核心功能。

流行度

  • +440万次 npm 下载
  • +1.56 万个模块依赖于它
  • +5.7 万 GitHub 星标
  • 71位贡献者
  • +4.4K 个分叉

功能

  • 在浏览器中发起 XMLHttpRequest
  • 支持 Promise API
  • 在 Node.js 中发起 HTTP 请求
  • 拦截响应和请求
  • 取消请求
  • 转换响应和请求数据
  • JSON 数据自动转换
  • 自动数据对象序列化
  • 客户端支持

优点

  • Axios 允许您通过提供一个配置对象来全面设置和自定义请求。它能够监控 POST 请求的状态,并自动对 JSON 数据进行修改。
  • Axios 也是使用最广泛的前端 HTTP 请求模块。它广受欢迎,并遵循最新的 JavaScript 设计模式。它支持请求取消、重定向、gzip/deflate 压缩、元数据处理以及钩子功能。

缺点

  • Axios 不支持 HTTP/2、Stream API 和 Electron。它也不支持请求重试,且仅在内置 Promise 支持的 Node.js 环境中运行。旧版本需要 Q Promise 或 Bluebird 支持。 2. Got

Got 是另一个面向 Node.js 的易用且强大的 HTTP 请求框架。它最初是作为流行包 Request 的轻量级替代方案而设计的。请查看这张详尽的对比表,了解 Got 与其他库的差异。

安装 Got

图片来源

Got 提供了 JSON 有效负载处理选项。 

图片来源

与 SuperAgent 和 Axios 不同,Got 不会自动解析 JSON。要启用此功能,需在代码中添加 { JSON: true } 作为参数。

根据文档记载,Got 的诞生源于请求体积过大(其大小达数GB!)。(实际接收数据为 4.46 MB 对比 302 KB)。

流行度

  • +620 万次 npm 下载
  • +2.5K 个依赖 Got 的模块
  • +280 个分叉
  • +5,000 GitHub 星标
  • 71 位贡献者

功能

  • 支持 HTTP/2
  • 支持 PromiseAPI 和 StreamAPI
  • 失败时重试
  • 支持重定向

优点

  • 与其他替代方案相比,Got 支持更多功能,且因其易于使用、安装体积小巧,并紧跟所有 JavaScript 新趋势,正日益受到欢迎。

缺点

  • Got 不支持浏览器 3. SuperAgent

SuperAgent 是一个微型 HTTP 请求库,可在 Node.js 和浏览器中用于执行 AJAX 请求。 

SuperAgent 提供了数千个插件,可用于执行诸如防止缓存、转换服务器有效载荷以及对 URL 添加后缀或前缀等任务。 

安装 SuperAgent

图片来源

在 Node 中的用法

图片来源

您还可以通过创建自己的插件来扩展功能。SuperAgent 还能为您解析 JSON 数据。

流行度

  • 250 万次 npm 下载
  • +6.4K 个模块依赖于 SuperAgent
  • +1.2K 分支
  • GitHub 上 +1.4 万个星标
  • 182 位贡献者

优点

  • SuperAgent 以提供流畅的 HTTP 请求接口、插件架构以及多种现成插件而闻名(例如,其 prefix 插件可为每个 URL 添加前缀)。
  • Superagent 还提供了流和 Promise API、请求取消、请求失败时的重试、支持 gzip/deflate 以及处理进度事件。

缺点

  • Superagent 当前构建失败。此外,它不提供类似 XMLHttpRequest 的上传进度跟踪功能
  • 它不支持定时器、元数据错误或钩子。 4. Request

Request 是最受欢迎的 Node.js 简单 HTTP 请求客户端之一,也是最早发布到 npm 注册表的模块之一。

图片来源

它每周下载量超过 1400 万次,旨在成为在 Node.js 中执行 HTTP 请求的最简单方式。 

文件也可以流式传输到 POST 或 PUT 请求中。此方法将比较文件扩展名映射内容类型到文件扩展名。 

您还可以在 options 对象中自定义 User-Agent 等 HTTP 头。

属性

  • +900 万次 npm 下载
  • +6.4K 个模块依赖于 Request
  • +3.2K 分支
  • GitHub 上 +2.52 万个星标
  • 126 位贡献者

功能

  • 默认支持 HTTPS
  • ,并跟随重定向。

优点

  • Request 易于入门且使用简单。
  • 这是一个用于发起 HTTP 请求的流行且广泛使用的模块

缺点

自 2020 年起,该模块已被完全弃用。预计不会有新的更新

5. WebScrapingAPI

我必须承认,WebScrapingAPI 为我从网络抓取数据时遇到的难题提供了切实可行的解决方案。WebScrapingAPI 帮我节省了时间和金钱,让我能够专注于产品开发。

WebScrapingAPI 是一款企业级、可扩展且易于使用的 API,可帮助收集和管理 HTML 数据。别忘了,您所有的网络爬虫解决方案都集成在一个 API 中,这意味着代码更加简洁。

图片来源

向 API 发送最基础的请求非常简单:只需设置 API 密钥、URL 参数以及您要抓取网站的访问密钥即可。

了解 WebScrapingAPI 提供的功能对于我们的网页抓取之旅至关重要。这些信息可在详尽的文档中获取,其中包含多种编程语言的代码示例。

我曾多次遭遇反制措施,它们会检测并阻止我的机器人执行任务。这是因为并非所有网站都能被抓取。有些网站会采用浏览器指纹识别和验证码等反制措施,这确实令人头疼。

应对机器人检测技术可能颇具挑战,但 WebScrapingAPI 提供了从 CAPTCHA 到 IP 封禁及自动重试的解决方案,全面管理这些情况。您只需专注于自己的目标,其余一切都由他们处理。

来源

该平台拥有卓越的技术实力,配备超过 1 亿个代理,确保您不会被封禁。这是因为某些网站仅允许在全球特定地区进行抓取。为此,您需要通过代理来访问其数据。

鉴于管理代理池难度较大,WebScrapingAPI将为您包办一切。它拥有数百万个轮换代理,确保您始终不被察觉。您还可以通过特定IP地址访问受地理限制的内容。

该 API 支持 JavaScript 渲染。您可通过真实浏览器启用此功能。启用后,您将看到用户端显示的全部内容,包括使用 AngularJS、React 或其他库构建的单页应用。

图片来源

用户所见即您所获。还有什么比这更强大的竞争优势呢?

此外,该 API 的基础设施构建于亚马逊网络服务(AWS)之上,为您提供海量、安全且可靠的全球数据访问。

坦率地说,使用 WebScrapingAPI 绝对是明智之选。

优点

  • 基于 AWS 构建
  • 价格实惠
  • 极致追求速度的架构
  • 每个包都支持 JavaScript 渲染
  • 优质服务、高在线率及绝对稳定性
  • 超过 1 亿个轮换代理,有效降低被封锁风险
  • 可自定义功能

缺点

目前尚无。

定价

  • 使用此 API 的入门套餐为每月 49 美元。 
  • 免费试用选项

如果您觉得没有时间从头开始构建网络爬虫,WebScrapingAPI 是一个不错的选择。不妨去了解一下。 

为何 WebScrapingAPI 是我的首选推荐:

我推荐 WebScrapingAPI,因为它通过一个 API 为所有人提供了简单直观的网页抓取解决方案。它还拥有业界顶尖的用户界面,让数据抓取变得轻而易举。

该 API 功能强大,足以胜任您的任务。

让我们花点时间想想,您将掌握多少数据资源。别忘了,您可以借此获取行业竞争情报,从而为客户提供更优惠的方案。 

WebScrapingAPI 助您实现定价优化。如何做到?让我这样解释:通过更清晰地掌握竞争对手动态,您的业务将获得显著增长。当行业价格波动时,您可以利用该 API 的数据来制定企业生存策略。

图片来源

在搜索您想购买的商品时,WebScrapingAPI 非常实用。您可以利用这些数据比较不同供应商的价格,从而选择最划算的交易。

此外,您无需担心被封禁。为什么?因为该 API 确保您能无障碍获取所需数据。凭借数百万个轮换代理,您可保持隐身状态,并通过特定 IP 地址访问受地理限制的内容。

这难道不酷吗?

该 API 的基础设施还构建在亚马逊网络服务(AWS)之上,为您提供海量、安全且可靠的全球数据。因此,Steelseries、德勤(Deloitte)和 Wunderman Thompson 等公司都信赖该 API 来满足其数据需求和网络爬虫服务。

来源

此外,月费仅需 49 美元。我对它的速度着迷不已。凭借全球轮换代理网络,目前已有超过 10,000 名用户在使用其服务。这就是为什么我推荐使用 WebScrapingAPI 进行数据抓取。

使用领先的网页抓取 REST API,开启您的抓取之旅

关于作者
Raluca Penciuc, 全栈开发工程师 @ WebScrapingAPI
Raluca Penciuc全栈开发工程师

Raluca Penciuc 是 WebScrapingAPI 的全栈开发工程师,主要负责开发爬虫、优化规避机制,并探索可靠的方法以降低在目标网站上的被检测概率。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。