返回博客
指南
Suciu Dan2022年10月20日阅读时间:11分钟

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

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

Node-fetch

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

Code snippet showing the npm command to install node-fetch version 2

图片来源

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

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

Code snippet showing a node-fetch polyfill that assigns fetch and related APIs to globalThis

图片来源

此外,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

Code snippet showing the npm command to install axios

图片来源

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

Code snippet showing an axios POST request example with method, URL, and JSON data

图片来源

由于其简单易用,一些开发者更倾向于使用 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

Code snippet showing the npm command to install the got HTTP client

图片来源

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

Code snippet showing a got POST request example that returns a JSON response

图片来源

与 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

Code snippet showing the npm command to install superagent

图片来源

在 Node 中的用法

Code snippet showing a superagent POST request example with headers and a JSON body

图片来源

您还可以通过创建自己的插件来扩展功能。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 注册表的模块之一。

Code snippet showing a Node.js request callback printing error, status code, and response body

图片来源

它每周下载量超过 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 封禁及自动重试的解决方案,全面管理这些情况。您只需专注于自己的目标,其余一切都由他们处理。

WebScrapingAPI homepage banner promoting REST APIs for web scraping

来源

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

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

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

WebScrapingAPI homepage section showing product use cases and a world map with country markers

图片来源

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

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

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

优点

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

缺点

目前尚无。

定价

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

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

为何 WebScrapingAPI 是我的首选推荐:

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

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

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

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

WebScrapingAPI site section explaining JavaScript rendering for scraping single-page apps, with a global network graphic

图片来源

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

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

这难道不酷吗?

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

WebScrapingAPI marketing section showing customer logos and a headline about ready-to-use scraping APIs

来源

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

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

关于作者
Suciu Dan, 联合创始人 @ WebScrapingAPI
Suciu Dan联合创始人

Suciu Dan 是 WebScrapingAPI 的联合创始人,他撰写了关于 Python 网页抓取、Ruby 网页抓取以及代理基础设施的实用指南,这些指南专为开发者而设计。

开始构建

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

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