Node.js 用户代理指南:设置与更改

了解设置 User-Agent 标头的重要性、Node.js 中的默认用户代理,以及如何实现用户代理轮换来规避反爬虫检测。
4 min read
Node.js用户代理指南

在这篇 Node.js 用户代理设置指南中,你将了解到:

  • 为什么设置 User-Agent 标头很重要
  • Node.js 中默认的用户代理是什么样子的
  • 如何使用 Fetch API 设置用户代理
  • 如何在 Node.js 中实现用户代理轮换

让我们开始吧!

为什么设置用户代理如此重要

User-Agent 标头是一个字符串,用来标识发出 HTTP 请求的客户端软件。它通常包括有关浏览器或应用程序、操作系统以及请求来源的系统架构的详细信息。该标头通常由网页浏览器、HTTP 客户端或执行网络请求的任何软件设置。

例如,以下是 Chrome 在请求页面时设置的当前用户代理:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36

下面是该用户代理字符串的组成部分的详细解析:

  • Mozilla/5.0:最初用于表示与 Mozilla 浏览器的兼容性,现在这个前缀通常为了兼容性而添加。
  • Windows NT 10.0; Win64; x64: 表示操作系统(Windows NT 10.0)、平台(Win64)和系统架构(x64)。
  • AppleWebKit/537.36:指 Chrome 使用的浏览器引擎。
  • (KHTML, like Gecko):显示与 KHTML 和 Gecko 布局引擎的兼容性。
  • Chrome/127.0.0.0:指定浏览器的名称和版本。
  • Safari/537.36:表示与 Safari 的兼容性。

本质上,用户代理可以揭示请求是否来自可信的浏览器或其他类型的软件。

网页爬虫 和自动化脚本通常使用默认或非浏览器用户代理字符串,这些字符串可能会暴露它们的自动化特性,从而引发反爬虫系统的警觉。这些系统通过分析 User-Agent 标头,可以判断请求是否来自真实用户还是爬虫。

欲了解更多信息,请查看我们关于 网页爬虫用户代理 的指南。

什么是 Node.js 的默认用户代理?

从版本 18 开始,Node.js 引入了 fetch() 方法作为 Fetch API 的内置实现方式。这是 Node.js 中执行 HTTP 请求的推荐方式,因为它不需要任何外部依赖项。了解更多关于如何使用 Fetch API 进行 Node.js HTTP 请求的内容。

与大多数其他 HTTP 客户端类似,fetch() 在发出请求时会自动设置一个默认的 User-Agent 标头。例如,Python 的 requests 库 也有类似的情况。

特别地,fetch() 在 Node.js 中设置的默认用户代理是:

node

你可以通过向 httpbin.io/user-agent 端点发出 GET 请求来验证这一点。这个端点返回的是传入请求的 User-Agent 标头,从而帮助你发现 HTTP 客户端设置的用户代理。

创建一个 Node.js 脚本,定义一个 async 函数,并使用 fetch() 发出所需的 HTTP 请求:

async function getFetchDefaultUserAgent() {

// make an HTTP request to the HTTPBin endpoint

// to get the user agent

const response = await fetch("https://httpbin.io/user-agent");

// read the default user agent from the response

// and print it

const data = await response.json();

console.log(data);

}

getFetchDefaultUserAgent();

执行上面的 JavaScript 代码,你将收到如下字符串:

{ 'user-agent': 'node' }

如你所见,Node.js 中由 fetch() 设置的用户代理仅为 node。该字符串与浏览器使用的用户代理有很大不同,这可能会触发 反爬虫系统的警觉。

反爬虫解决方案会监控传入请求中的可疑模式,例如异常的用户代理字符串。一旦检测到,这些请求将被标记为来自爬虫并被阻止。这就是为什么更改默认的 Node.js 用户代理值是避免被标记的重要措施!

如何使用 Fetch API 更改 Node.js 用户代理

Fetch API 规范并未提供专门更改用户代理的方法。与此同时,User-Agent 仅仅是一个 HTTP 标头,这意味着你可以通过 fetch() 的标头选项自定义其值。

看看如何在 Node.js 中使用 fetch() 设置 User-Agent 标头吧!

本地设置用户代理

fetch() 通过 headers 选项支持标头自定义。使用此选项在发出特定 HTTP 请求时设置 User-Agent 标头,如下所示:

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent":

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

},

});

将这些内容整合在一起,你将得到:

async function getFetchUserAgent() {

// make an HTTP request to HTTPBin

// with a custom user agent

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent":

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

},

});

// read the default user agent from the response

// and print it

const data = await response.json();

console.log(data);

}

getFetchUserAgent();

启动上面的脚本,这次结果将是:

{

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'

}

太棒了!API 返回的用户代理与代码中配置的用户代理相匹配。现在你知道如何更改 Node.js 用户代理了。

全局设置用户代理

按请求设置 User-Agent 相对简单,但可能导致重复的样板代码。如果你想全局更改 Node.js 的默认用户代理怎么办?不幸的是,截至目前,fetch() API 并没有提供一种全局覆盖其默认设置的方法。

你可以做的是创建一个包装函数,通过所需的配置自定义 fetch() 的行为:

function customFetch(url, options = {}) {

// custom headers

const customHeaders = {

"User-Agent":

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

...options.headers, // merge with any other headers passed in the options

};

const mergedOptions = {

...options,

headers: customHeaders,

};

return fetch(url, mergedOptions);

}

现在你可以通过调用 customFetch() 而不是 fetch() 来发出带有自定义用户代理的 HTTP 请求:

const response = await customFetch("https://httpbin.io/user-agent");

完整的 Node.js 脚本将是:

function customFetch(url, options = {}) {

// add a custom user agent header

const customHeaders = {

"User-Agent":

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

...options.headers, // merge with any other headers passed in the options

};

const mergedOptions = {

...options,

headers: customHeaders,

};

return fetch(url, mergedOptions);

}

async function getFetchUserAgent() {

// make an HTTP request to HTTPBin

// through the custom fetch wrapper

const response = await customFetch("https://httpbin.io/user-agent");

// read the default user agent from the response

// and print it

const data = await response.json();

console.log(data);

}

getFetchUserAgent();

启动上面的 Node.js 脚本,它将打印:

{

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'

}

太好了!你刚刚学会了如何使用 fetch() 在 Node.js 中全局设置用户代理。

在 Node.js 中实现用户代理轮换

使用真实浏览器的用户代理覆盖 HTTP 客户端的默认 User-Agent 标头可能还不足以避免反爬虫检测。如果你使用相同的用户代理从同一 IP 地址发出过多请求,反爬虫系统仍然可以识别出你的活动是自动化的。问题在于你的请求仍然会显示出非人类的行为。

为了减少在 Node.js 中被检测为爬虫的风险,你应该在 HTTP 请求中引入可变性。一种有效的技术是用户代理轮换,即在每个请求中更改 User-Agent 标头。此方法使你的自动化请求看起来像是来自不同的浏览器,从而降低了被反爬虫系统标记的可能性。

在接下来的部分中,你将学习如何在 Node.js 中实现用户代理轮换!

步骤#1:获取用户代理列表

访问类似 WhatIsMyBrowser.com 的网站,并填充一些有效的用户代理值列表:

const userAgents = [

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",

"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/126.0.2592.113",

// other user agents...

];

提示:该数组包含的真实世界用户代理字符串越多,越能避免反爬虫检测。

步骤#2:随机选择一个用户代理

创建一个函数,从列表中随机选择并返回一个用户代理字符串:

function getRandomUserAgent() {

const userAgents = [

// user agents omitted for brevity...

];

// return a user agent randomly

// extracted from the list

return userAgents[Math.floor(Math.random() * userAgents.length)];

}

让我们来分解一下这个函数中发生的事情:

  • Math.random() 生成一个介于 0 到 1 之间的随机数
  • 然后这个数字乘以 userAgents 数组的长度。
  • Math.floor() 将结果数字向下舍入为小于或等于该数字的最大整数。
  • 前面操作产生的数字对应于一个随机生成的索引,该索引从 0 到 userAgents.length - 1
  • 然后该索引用于从用户代理数组中返回一个随机用户代理。

每次调用 getRandomUserAgent() 函数时,你很可能会得到不同的用户代理。

步骤#3:使用随机用户代理发出 HTTP 请求

要在 Node.js 中使用 fetch() 实现用户代理轮换,请使用 getRandomUserAgent() 函数的值设置 User-Agent 标头:

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent": getRandomUserAgent(),

},

});

通过 Fetch API 执行的 HTTP 请求现在将具有一个随机的用户代理。

步骤#4:将所有内容整合在一起

将前面步骤中的代码片段添加到 Node.js 脚本中,然后将使用 fetch() 发出请求的逻辑包装在一个 async 函数中。

以下是你的最终 Node.js 用户代理轮换脚本的样子:

function getRandomUserAgent() {

const userAgents = [

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",

"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/126.0.2592.113",

// other user agents...

];

// return a user agent randomly

// extracted from the list

return userAgents[Math.floor(Math.random() * userAgents.length)];

}

async function getFetchUserAgent() {

// make an HTTP request with a random user agent

const response = await fetch("https://httpbin.io/user-agent", {

headers: {

"User-Agent": getRandomUserAgent(),

},

});

// read the default user agent from the response

// and print it

const data = await response.json();

console.log(data);

}

getFetchUserAgent();

运行脚本 3 到 4 次。从统计学上讲,你应该会看到如下所示的不同用户代理响应:

different user agent responses

这表明用户代理轮换功能正常。

大功告成!你现在掌握了如何在 Node.js 中使用 Fetch API 设置用户代理的技能。

结论

在本教程中,你了解了为什么要设置 User-Agent 标头以及在 fetch() 中默认的 Node.js 用户代理是什么样子的。你还探索了如何覆盖该值并在 Node.js 中实现用户代理轮换,以避免基本的反爬虫系统。然而,更高级的系统仍然可以检测并阻止你的自动化请求。为了避免 IP 封禁,你可以 在 Node.js 中配置代理,但即便如此,也并不总是足够!

为了更强大的解决方案,可以考虑 Web Scraper API—下一代抓取服务,可以简化 Node.js 或任何其他技术中的自动化网页请求。它通过 IP 和用户代理轮换等功能有效地绕过反爬虫措施,使网页抓取比以往更加简单。

立即注册并为你的项目找到最好的产品。马上开始你的免费试用吧!