如何更改Axios的用户代理

你有没有在使用 Axios 进行网页抓取时被阻止过?由于您的用户代理,目标站点很可能将您识别为机器人。UA是您的浏览器发送给网站服务器的一串数据,表示您使用的浏览器和操作系统等信息。

您需要更改 Axios 中的用户代理以避免检测并访问您想要的信息,我们将在本教程中探讨如何做到这一点。

Axios 中的用户代理是什么

用户代理是服务器识别客户端和传送适当内容(例如,为移动浏览器显示页面的移动版本)的基本指纹。每个 HTTP 请求都将其作为其标头的一部分。

UA一般有这样的格式:

User-Agent: <product> / <product-version> <comment>

这是网络浏览器使用的语法:

User-Agent: Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>

例如,Chrome UA 字符串如下所示:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36

以上字符串表示客户端兼容Mozilla产品,使用AppleWebKit渲染引擎,兼容Chrome和Safari。

或者,这是一个 Firefox UA 字符串:

Mozilla/5.0 (X11; Linux i686; rv:110.0) Gecko/20100101 Firefox/110.0.

对于大多数网站,机器人检测的第一步是检查 UA 字符串并阻止任何没有有效网络浏览器用户代理的客户端

我们将向您展示如何查看您的 UA,但首先要确保您拥有 NPM 附带的 Node。另外,使用 NPM 安装 Axios:

npm install axios

那么,如何查看你的 Axios User Agent 呢?发出请求时, HTTPBin端点会返回有关客户端标头的信息,包括其 UA 。GET让我们提出一个请求,看看我们得到了什么。

const axios = require('axios');
axios.get('https://httpbin.org/headers') 
    .then(({ data }) => console.log(data));

你应该有类似这样的回应:

{
  headers: {
    Accept: 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, compress, deflate, br',
    Host: 'httpbin.org',
    'User-Agent': 'axios/1.3.5',
    'X-Amzn-Trace-Id': 'Root=1-643cda26-6ce08bef6999e1d419d37041'
  }
}

这里的 User Agent 是axios/1.3.5Axios 为每个请求发送的默认 UA 字符串。可以想象,任何网站都可以轻松判断它不是有效的浏览器客户端并可能会阻止它。为 Axios 指定一个真正的 User Agent 是避免这种情况的必要条件。

使用 Axios 设置用户代理

您可以通过在请求配置的选项中指定来设置自定义 Axios 用户代理headers

假设这是我们要设置的 Chrome UA 字符串:

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

更新您的代码以将其添加到headers

const axios = require('axios');
const headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
axios.get('https://httpbin.org/headers', {
    headers,
}) 
    .then(({ data }) => console.log(data));

运行它,您将得到与以下类似的响应:

{
  headers: {
    Accept: 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, compress, deflate, br',
    Host: 'httpbin.org',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'X-Amzn-Trace-Id': 'Root=1-643d039e-36575b1273b5f45a18b7d9c9'
  }
}

UA改成了一套。

下一步,让我们为每个请求获取一个随机 UA。从创建数组开始(您可以在我们的顶级网络抓取用户代理列表中找到一些合适的选项)。

const userAgents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15',
];

更新User-Agent标头,添加循环并多次发出请求:

for (let i = 0; i < 3; i++) {
    // Get random UA
    const ua = userAgents[Math.floor(Math.random() * userAgents.length)];
    // Set UA in headers
    const headers = {
        'User-Agent':  ua,
    }
    // Make request
    axios.get('https://httpbin.org/headers', {
        headers,
    }) 
        .then(({ data }) => console.log(data));
}

现在,每次发出请求时你都会有一个随机的 UA:

{
  headers: {
    Accept: 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, compress, deflate, br',
    Host: 'httpbin.org',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'X-Amzn-Trace-Id': 'Root=1-643d15cc-32cfd88246735b5928a7fb29'
  }
}
{
  headers: {
    Accept: 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, compress, deflate, br',
    Host: 'httpbin.org',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'X-Amzn-Trace-Id': 'Root=1-643d15cc-0cfaab326c9e4cf859126dbf'
  }
}
{
  headers: {
    Accept: 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, compress, deflate, br',
    Host: 'httpbin.org',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15',
    'X-Amzn-Trace-Id': 'Root=1-643d15cc-231af09d4e31bc6e4a198345'
  }
}

然而,这种随机更改 Axios User Agent 的方法虽然很好,但效果不佳,因为可能很难获得许多有效字符串并不断重新测试和更新它们。那么,让我们看看如何正确地大规模地进行网络抓取。

对您的网络抓取工具一次又一次被封锁感到沮丧吗?

如何大规模更改 Axios 用户代理

创建一个巨大的用户代理列表来随机选择是有问题的。也就是说,您可能会在不知不觉中包含带有错误信息的 UA,例如无效的浏览器版本,或者它们很快就会过时。

然后,除了大多数网站可以发现恶意标头和其他相关组件这一事实之外,还会出现其他反抓取挑战,例如验证码。

幸运的是,您可以将 ZenRows 与 Axios 结合使用来生成有效的用户代理并绕过所有反机器人挑战。

medium_zenrows_httpbin_headers

接下来,为您的 API 密钥、目标 URL 和 ZenRows 的基本 URL 创建一个变量:

const targetUrl = 'http://httpbin.org/headers';
const apiKey = '<YOUR_API_KEY>';
const zenRowsBaseUrl = 'https://api.zenrows.com/v1/';

为要传递给 ZenRows 的基本 URL 的params所有参数创建一个对象:

// Parameters to pass to ZenRows' base URL
const params = {
    url: targetUrl,
    apikey: apiKey,
    antibot: true,
};

和参数是必需的,而参数配置ZenRowsurl绕过反机器人措施。您还可以添加其他人来避免检测和JavaScript 渲染。apikeyantibotpremium_proxyjs_render

现在,使用上面的 ZenRows 参数发出请求:

axios.get(zenRowsBaseUrl, {
    params,
}).then(({ data }) => console.log(data)); // page HTML

这是您完成的脚本的样子:

const axios = require('axios');

const targetUrl = 'http://httpbin.org/headers';
const apiKey = '<YOUR_API_KEY>';
const zenRowsBaseUrl = 'https://api.zenrows.com/v1/';

// Parameters to pass to ZenRows' base URL
const params = {
    url: targetUrl,
    apikey: apiKey,
    antibot: true,
};

axios.get(zenRowsBaseUrl, {
    params,
}).then(({ data }) => console.log(data)); // page HTML

您的输出应该与此类似:

medium_zenrows_httpbin_headers

当您发出请求时,ZenRows 将处理 Axios 用户代理随机化和其他反机器人挑战。

修复 Axios 中的错误:拒绝设置不安全的标头用户代理

User-Agent当您使用客户端 JavaScript 代码自行在 Axios 请求中设置自定义标头时,会出现“拒绝设置不安全标头 User-Agent”错误。那是因为现代网络浏览器认为您的 UA 不安全,不应在客户端设置。

要解决此错误,请从 Axios 请求中删除自定义 UA 标头或将其设置在服务器端。对于必须在客户端 JavaScript 代码中使用不同的用户代理的情况,您可以使用 ZenRows,因为它会在服务器端随机化 UA。

结论

在 Axios 中随机化您的用户代理会使网站更难检测到您的抓取活动,因为每个请求都来自不同的软件或设备。因此,必须适当地随机化您的 UA,以使您的请求看起来像是来自真实用户。

此外,除了使用用户代理进行机器人检测外,您还需要处理其他障碍,例如 IP 地址信誉和 JavaScript 挑战。查看我们关于不被阻止的网络抓取的文章,了解避免检测的最佳方法。

类似文章