在本指南中,您将学习:
- 什么是 User-Agent 头及其重要性
- 默认的 cURL 用户代理头是什么
- 两种设置 cURL 用户代理字符串的方法
- 如何在 cURL 中实现用户代理轮换逻辑
让我们开始吧!
什么是用户代理及其重要性?
用户代理是浏览器、发出 Web 请求的应用程序和 HTTP 客户端在 User-Agent HTTP 头中设置的字符串,用于标识发出请求的客户端软件。这个字符串通常包括浏览器/应用程序类型、操作系统等信息。
例如,这是来自 Chrome 请求的真实用户代理字符串:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
此头中的信息对于确定请求是来自已知浏览器还是其他软件至关重要。抓取机器人往往使用不一致或默认的用户代理字符串,从而暴露其自动化性质。因此,用户代理头有助于反机器人解决方案了解当前用户是人还是机器人。
欲了解更多信息,请查看我们的 Web 抓取用户代理指南。
默认的 cURL 用户代理是什么?
与大多数 HTTP 客户端一样,cURL 在发出 HTTP 请求时设置 User-Agent 头。具体来说,cURL 用户代理字符串是:
curl/X.Y.Z
其中 X.Y.Z 是您机器上安装的 cURL 版本。
要验证这一点,可以向 httpbin.io 项目的 /user-agent 端点发出 cURL 请求。此 API 返回调用者设置的 User-Agent 头字符串。
使用以下指令向 /user-agent 端点发出 GET 请求:
curl "https://httpbin.io/user-agent"
注意:在 Windows 上,将 curl 替换为 curl.exe。这是因为 curl 是 PowerShell 中 Invoke-WebRequest 的别名,而 curl.exe 指向 cURL 的 Windows 可执行文件。
端点应该返回如下内容:
{
"user-agent": "curl/8.4.0"
}
如您所见,cURL 设置的用户代理是 curl/8.4.0。这不好,因为它清楚地标识请求来自 cURL。反机器人解决方案采用的网站可以轻易地将该请求标记为不来自真实用户,并相应地阻止它。
这就是为什么您需要了解如何设置 cURL 用户代理头字符串。
如何设置 cURL 用户代理头
有两种方法可以在 cURL 中设置用户代理。让我们来看看它们!
直接设置自定义用户代理
设置用户代理非常流行,cURL 提供了一个选项专门用于此。在 -A 或 –user-agent 选项中,您可以指定在 cURL 发出的 HTTP 请求的 User-Agent 头中设置的字符串。
这是使用该选项设置 cURL 用户代理头的语法:
curl -A|--user-agent "<user-agent_string>" "<url>"
例如:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
输出将是:
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
很好!httpbin.io 的 /user-agent 端点检测到的用户代理与请求中设置的相同。
请记住,上述请求等同于:
curl --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
虽然不推荐,但要完全取消 User-Agent 头,可以将空字符串传递给 -A。通过目标 httpbin.io 的 /headers 端点验证,此端点返回传入请求的头:
curl -A "" "https://httpbin.io/headers"
结果将是:
{
"headers": {
"Accept": [
"*/*"
],
"Host": [
"httpbin.io"
]
}
}
如预期的那样,没有 User-Agent 头。
如果您想保留 User-Agent 头但将其设为空值,请将单个空格字符串传递给 -A:
curl -A " " "https://httpbin.io/headers"
这次,端点将返回:
{
"headers": {
"Accept": [
"*/*"
],
"Host": [
"httpbin.io"
],
"User-Agent": [
""
]
}
}
注意空的 User-Agent 字符串值。
设置自定义用户代理头
归根结底,User-Agent 只是一个 HTTP 头。这意味着您可以像在 cURL 中设置任何其他 HTTP 头一样,通过使用 -H 或 –header 选项来设置它:
curl -H|--header "User-Agent: <user-agent_string>" "<url>"
有关完整的教程,请阅读我们的 如何在 cURL 中发送 HTTP 头的指南。
以下示例展示了 -H 选项的使用:
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
请注意,HTTP 头被设计为不区分大小写,所以 User-Agent 等同于 user-agent。
结果将是:
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
太棒了!用户代理值已按预期设置。
上述 cURL 命令等同于:
curl --header "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
对于特殊使用情况,请考虑以下两个 cURL 用户代理头字符串:
- “User-Agent:” 从请求中删除 User-Agent 头。
- “User-Agent: ” 将 User-Agent 头设置为空字符串。
在 cURL 中实现用户代理轮换
在使用 cURL 进行大规模自动化请求时,设置固定的 User-Agent 值可能不够。问题在于 反机器人技术监控所有传入请求。如果它们看到太多具有相同头和来自同一 IP 的请求,可能会采取行动。
避免在进行自动化请求时被网站检测和阻止的关键是对请求进行随机化。在这方面,轮换用户代理有助于模拟来自不同浏览器的请求。这减少了触发临时禁令或阻止的风险。
通过以下三个步骤实现 cURL 用户代理轮换:
- 收集用户代理:收集来自各种浏览器、不同版本和不同设备的真实用户代理字符串列表。
- 实现轮换逻辑:从列表中随机选择一个用户代理。
- 随机化请求:在 cURL 请求中设置所选的用户代理字符串。
实现这一过程需要几行代码,因此在 Unix 系统和 Windows 系统中有所不同。了解如何在这两种环境中实现 cURL 用户代理轮换!
Bash
从像 User Agent String.com 这样的站点收集有效用户代理列表,并将其存储在数组变量中:
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0"
# ...
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
)
然后,使用 RANDOM 实现一个从列表中随机提取用户代理的函数:
get_random_user_agent() {
# number of user agents in the list
local count=${#user_agents[@]}
# generate a RANDOM number from 0 to count
local index=$((RANDOM % count))
# return the randomly extracted user agent string
echo "${user_agents[$index]}"
}
调用该函数,获取一个轮换用户代理,并在 cURL 中设置:
# get the random user agent
user_agent=$(get_random_user_agent)
# perform a cURL request to the given URL
# using the random user agent
curl -A "$user_agent" "https://httpbin.io/user-agent"
注意:根据您的目标更改目标 URL。
将其全部放在一起,您将得到以下 bash 文件:
#!/bin/bash
# list of user agent strings
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0"
# ...
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
)
get_random_user_agent() {
# number of user agents in the list
local count=${#user_agents[@]}
# generate a RANDOM number from 0 to count
local index=$((RANDOM % count))
# return the randomly extracted user agent string
echo "${user_agents[$index]}"
}
# get the random user agent
user_agent=$(get_random_user_agent)
# perform a cURL request to the given URL
# using the random user agent
curl -A "$user_agent" "https://httpbin.io/user-agent"
启动上述脚本,每次您都会看到不同的用户代理。任务完成!
PowerShell
从像 WhatIsMyBrowser.com 这样的站点检索真实用户代理列表。接下来,将这些数据存储在一个 数组变量中:
$user_agents = @(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0"
# ...
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
)
然后,创建一个从列表中随机选择用户代理字符串并返回的函数:
function Get-RandomUserAgent {
# number of user agents in the list
$count = $user_agents.Count
# generate a random number from 0 to $count
$index = Get-Random -Maximum $count
# return the randomly extracted user agent
return $user_agents[$index]
}
最后,调用该函数,获取随机用户代理,并在 cURL 中使用:
# get the random user agent
$user_agent = Get-RandomUserAgent
# make an HTTP request to the given URL
# using the random user agent
curl.exe -A "$user_agent" "https://httpbin.io/user-agent"
将其全部放在一起,您将得到以下代码:
# list of user agents
$user_agents = @(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0"
# ...
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
)
function Get-RandomUserAgent {
# number of user agents in the list
$count = $user_agents.Count
# generate a random number from 0 to $count
$index = Get-Random -Maximum $count
# return the randomly extracted user agent
return $user_agents[$index]
}
# get a random user agent
$user_agent = Get-RandomUserAgent
# make an HTTP request to the given URL
# using the random user agent
curl.exe -A "$user_agent" "https://httpbin.io/user-agent"
将其存储在 .ps1 脚本中并执行几次。每次,您将获得不同的用户代理字符串。
就这样!您现在已经掌握了在 cURL 中设置用户代理头字符串的技能。
结论
在本指南中,您了解了在 HTTP 客户端中设置 User-Agent 头的重要性及其在 cURL 中的设置方法。这样,您可以愚弄某些反机器人系统,使它们认为您的请求来自真实的浏览器。同时,先进的反机器人解决方案仍然能够阻止您的请求。为了绕过诸如速率限制等措施,您可以 在 cURL 中集成代理。然而,这可能还不够!
避免所有这些压力,尝试 Scraper API。作为一种一体化的下一代综合抓取 API,它提供了使用 cURL 或任何其他 HTTP 客户端执行自动化 Web 请求所需的一切。这个功能齐全的解决方案提供了 IP 和用户代理轮换,并且可以绕过任何反机器人技术。进行自动化 HTTP 请求从未如此简单!
立即注册 Bright Data 的 Web 抓取基础设施免费试用,或与我们的数据专家讨论我们的抓取解决方案。