返回博客
指南
苏丘·丹2022年10月20日阅读时长:11分钟

五大 Node-Fetch HTTP 请求替代方案

五大 Node-Fetch HTTP 请求替代方案

Node-fetch

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

代码片段展示了用于安装 node-fetch 2.0 版本的 npm 命令

图片来源

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

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

代码片段展示了一个 node-fetch 补丁,该补丁将 fetch 及相关 API 映射到 globalThis

图片来源

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

您可以使用多种库(包括 Node.js 中的 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 状态码的信息。
  • 好的——如果状态码为 2xx 状态码(表示成功),则返回 true。
  • Headers - 一个用于存储响应头信息的对象;可使用 get() 函数获取单个响应头。

人气

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

node-fetch 的特点

  • 保持与窗口 .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/grip 等现代 Web 编码格式的能力。 
  • 它遵循最新的 JavaScript HTTP 请求规范,仍是继 request 之后下载量最高的模块,每周下载量约为 800 万次(超过 Got、Axios 和 Superagent)。

为什么你需要一个 Node-fetch 的替代方案

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

我最推荐的 node-fetch 替代方案

以下是我精选的 5 款 node-fetch 替代方案,您可以将其应用于您的解决方案中

  • 阿克西奥斯
  • 已收到
  • 超级经纪人
  • 请求
  • WebscrapingAPI

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

让我们开始吧!

1. Axios

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

安装 Axios

代码片段展示了用于安装 axios 的 npm 命令

图片来源

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

代码片段展示了包含方法、URL 和 JSON 数据的 axios POST 请求示例

图片来源

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

人气

  • +440万次 npm 下载
  • +15.6K 个模块依赖于它
  • +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 HTTP 客户端的 npm 命令

图片来源

Got 提供了一项用于处理 JSON 有效载荷的选项。 

代码片段展示了一个成功处理 POST 请求的示例,该请求返回 JSON 响应

图片来源

Unlike SuperAgent and Axios, Got does not automatically parse JSON. To enable this capability, { JSON: true } is added as an argument in a code.

根据文档显示,Got 报错是因为请求过大(其大小达数千兆字节!)。(实际发送量为 4.46 MB,而接收量仅为 302 KB)。

人气

  • +620万次 npm 下载
  • +2.5K 个模块取决于 Got
  • +280 次分叉
  • +5K GitHub 星标
  • 71位贡献者

特点

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

优点

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

缺点

  • Got 不支持浏览器 3. SuperAgent

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

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

安装 SuperAgent

代码片段展示了用于安装 superagent 的 npm 命令

图片来源

在 Node.js 中的用法

代码片段展示了包含头部信息和 JSON 正文的 superagent POST 请求示例

图片来源

您还可以通过创建自己的插件来增加功能。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 是 Node.js 中最受欢迎的简单 HTTP 请求客户端之一,也是首批发布到 npm 注册表的模块之一。

代码片段演示了 Node.js 请求回调如何输出错误信息、状态码和响应正文

图片来源

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

文件也可以通过 POST 或 PUT 请求进行流式传输。此方法将根据文件扩展名与内容类型的映射关系进行比对。 

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

属性

  • +900万次 npm 下载
  • +6.4K 个模块,具体取决于请求
  • +3.2K 次分叉
  • 在 GitHub 上获得 2.52 万个星标
  • 126位贡献者

特点

  • 它支持HTTPS
  • 默认情况下,会跟随重定向。

优点

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

缺点

该功能自2020年起已完全弃用。预计不会有新的变更。

5. WebScrapingAPI

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

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

图片来源

设置 API 密钥和 URL 参数,以及您对要抓取的网站的访问密钥,是您可以向 API 提出的最直接的基本请求。

了解 WebScrapingAPI 提供的各项功能,对于我们开展网络爬虫工作至关重要。相关 信息可在详尽的文档中查阅,其中包含多种编程语言的代码示例。

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

应对反机器人技术或许颇具挑战,但 WebScrapingAPI 提供了从验证码到 IP 封锁及自动重试的全方位解决方案,助您轻松应对。您只需专注于自身目标,其余事宜皆由他们代劳。

WebScrapingAPI 主页横幅,用于推广用于网页抓取的 REST API

消息来源

它拥有出色的技术实力,配备超过1亿个代理服务器,确保您不会被封禁。这是因为某些网站的数据只能在全球特定地区进行抓取。为此,您需要使用代理服务器来访问这些数据。

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

此 API 支持 JavaScript 渲染。您可以在真实浏览器中启用 JavaScript 渲染。启用后,您将看到用户端显示的所有内容。这包括使用 AngularJS、React 或其他库构建的单页应用程序。

WebScrapingAPI 主页上的一个板块,展示了产品的应用场景以及带有国家标记的世界地图

图片来源

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

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

在我看来,使用 WebScrapingAPI 就是一场胜利。

优点

  • 基于 AWS 构建
  • 价格合理
  • 痴迷速度的建筑
  • 每个包都包含 JavaScript 渲染
  • 优质服务、高可用性及绝对稳定性
  • 超过1亿个轮换代理,以减少阻塞
  • 可定制的功能

缺点

目前还没有。

定价

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

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

为什么 WebScrapingAPI 是我的首选推荐:

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

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

让我们花点时间,仔细看看您手头的所有数据。别忘了,您可以了解竞争对手的定价,从而为客户提供更优惠的方案。 

WebScrapingAPI 为您提供价格优化服务。如何实现?让我这样解释:通过更清晰地了解竞争对手,您的业务可以实现显著增长。随着行业内价格的波动,您可以利用该 API 提供的数据,从而明确企业如何在市场中立足。

WebScrapingAPI 网站中关于通过 JavaScript 渲染抓取单页应用的说明部分,附带一张全球网络示意图

图片来源

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

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

这有多酷啊?

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

WebScrapingAPI 的营销板块展示了客户徽标以及一条关于即用型爬取 API 的标题

消息来源

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

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

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

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

开始构建

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

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