在本文结束时,你将了解:
- 什么是用户代理以及为什么要在HTTP请求中设置它
- Wget设置的默认用户代理
- 如何更改Wget用户代理字符串
- 如何在Wget中实现用户代理轮换
让我们开始吧!
用户代理:定义及其设置原因
用户代理是由浏览器、发出网络请求的应用程序和HTTP客户端在User-Agent HTTP头中设置的字符串,用于识别请求来源的客户端软件。这个字符串通常包含浏览器或应用程序类型、操作系统及其他相关信息。
例如,这是在访问网页时Chrome设置的用户代理:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.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引擎和Mozilla使用的Gecko布局引擎的兼容性。
- Chrome/125.0.0.0:浏览器名称及其版本。
- Safari/537.36:与Safari的兼容性。
换句话说,用户代理对于确定请求是否来自已知的浏览器或其他软件至关重要。
抓取机器人通常使用不一致或默认的用户代理字符串,暴露其自动化特性。因此,User-Agent头有助于网站采用的反机器人解决方案确定当前用户是真实用户还是机器人。
了解更多信息,请阅读我们的用户代理指南。
Wget的默认用户代理是什么?
在发出HTTP请求时,Wget会将User-Agent头设置为以下值:
Wget/X.Y.Z
复制
X.Y.Z字符串与您机器上安装的Wget版本匹配。
要验证上述字符串是否确实是Wget的用户代理,请对httpbin.io的/user-agent端点执行GET请求。这将返回传入请求的User-Agent头中的字符串,是验证HTTP客户端使用的用户代理的好方法。
使用以下指令对/user-agent端点发出GET请求:
wget -O "response.json" "https://httpbin.io/user-agent"
注意:在Windows上,将wget替换为wget.exe。这是因为在PowerShell中,wget是Invoke-WebRequest的别名,而wget.exe指向Wget Windows可执行文件。
上述命令将下载端点返回的响应,并将其存储在本地的response.json中,内容如下:
{
"user-agent": "Wget/1.21.4"
}
在这种情况下,Wget设置的用户代理是Wget/1.21.4。可以想象,这明显表明请求来自Wget。反机器人解决方案可以很容易地将这样的请求标记为非真实用户发出的,并立即阻止它。因此,了解一些更改Wget用户代理的方法非常重要!
如何设置Wget用户代理
在Wget中设置用户代理有两种可能的方法。让我们分别探讨一下!
直接设置自定义用户代理
Wget提供了更改用户代理的选项。详细来说,-U或–user-agent选项允许你覆盖Wget在User-Agent头中使用的默认字符串。使用以下语法在Wget中设置用户代理字符串:
wget [other_options] -U|--user-agent "<user-agent_string>" "<url>"
现在,看看下面的例子:
wget -O "response.json" -U "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
打开response.json,你会看到:
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
太好了,Wget设置用户代理策略完美奏效!
不要忘记,前面的Wget命令等同于:
wget.exe -O "response.json" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
要从请求中删除User-Agent头,请传递一个空字符串给-U。你可以通过定位httpbin.io的/headers端点进行验证,该端点返回传入请求的HTTP头:
wget -O "response.json" -U "" "https://httpbin.io/headers"
response.json文件将包含:
{
"headers": {
"Accept": [
"*/*"
],
"Accept-Encoding": [
"identity"
],
"Connection": [
"Keep-Alive"
],
"Host": [
"httpbin.io"
]
}
}
正如预期,没有User-Agent头。
如果你想取消设置User-Agent头,请传递一个单个空格给-U:
wget -O "response.json" -U " " "https://httpbin.io/headers"
response.json中的内容将是:
{
"headers": {
"Accept": [
"*/*"
],
"Accept-Encoding": [
"identity"
],
"Connection": [
"Keep-Alive"
],
"Host": [
"httpbin.io"
],
"User-Agent": [
""
]
}
}
User-Agent头在那里,但它包含一个空字符串。
注意:删除或取消设置User-Agent头是不好的做法,可能会触发反机器人技术。
设置自定义用户代理HTTP头
由于User-Agent是一个HTTP头,你可以像在Wget中设置其他头一样使用–header选项设置它,通过以下语法:
wget [other_options] --header "User-Agent: <user-agent_string>" "<url>"
在下面的示例中看到–header选项的作用:
wget.exe -O response.json --header "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" "https://httpbin.io/user-agent"
response.json中的结果将是:
{
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
很棒,响应中的用户代理值与–header选项中的字符串匹配。
要取消设置Wget用户代理头,请使用“User-Agent:”头值。如果需要完全删除头,则必须使用前面解释的-U选项。
在Wget中实现用户代理轮换
使用静态的User-Agent值——即使是来自真实世界浏览器的用户代理——在用Wget发出自动化请求时可能不是一个成功的方法。问题在于,反机器人技术监控所有传入请求,当检测到某个IP的请求有太多相同的头时,可能会禁止它。
随机化请求是避免检测和封锁的关键。如何使请求不那么相似?通过使用用户代理轮换!这种方法有助于模拟来自不同浏览器的请求,减少触发封锁或临时禁止的风险。
你可以通过以下三个步骤在Wget中实现用户代理轮换:
- 获取一些用户代理:从浏览器收集一组真实的用户代理字符串。
- 实现轮换逻辑:从列表中随机选择一个用户代理。
- 随机化请求:在Wget请求中设置选定的用户代理字符串。
实现这一过程需要几行代码,你可以使用Unix Bash或Windows PowerShell编写。你也可以通过将Wget与Python集成来完成。
现在,深入了解如何在Windows和基于UNIX的系统上处理Wget中的用户代理轮换!
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))
# extract a user agent string from the list
# and return it
echo "${user_agents[$index]}"
}
调用该函数获取一个随机用户代理,并在Wget命令中使用它:
# get the random user agent
user_agent=$(get_random_user_agent)
# perform a Wget request to a given URL
# using the random user agent
wget -O "response.json" -U "$user_agent" "https://httpbin.io/user-agent"
Note: Modify the target URL to suit your goals.
Put it all together, and you will get the following bash script:
#!/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))
# extract a user agent string from the list
# and return it
echo "${user_agents[$index]}"
}
# get the random user agent
user_agent=$(get_random_user_agent)
# perform a Wget request to a given URL
# using the random user agent
wget -O "response.json" -U "$user_agent" "https://httpbin.io/user-agent"
将上述代码添加到一个.sh脚本中并运行它。这将在脚本所在的文件夹中生成一个response.json文件。打开它,查看/user-agent端点返回的用户代理。多次执行脚本,你会看到不同的用户代理。
做得好!Wget用户代理轮换已实现。
PowerShell
从WhatIsMyBrowser.com等网站获取一些真实世界的用户代理字符串。然后,将这些字符串存储在一个PowerShell数组变量中:
$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从列表中随机选择一个用户代理字符串并返回:
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
# extract a user agent string and return it
return $user_agents[$index]
}
调用该函数获取一个随机用户代理字符串,并在Wget请求中使用它:
# get the random user agent
$user_agent = Get-RandomUserAgent
# make an HTTP request to a given URL
# using the random user agent
wget.exe -O "response.json" -U "$user_agent" "https://httpbin.io/user-agent"
Put it all together to get the following code:
# 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
# extract a user agent string and return it
return $user_agents[$index]
}
# get a random user agent
$user_agent = Get-RandomUserAgent
# make an HTTP request to a given URL
# using the random user agent
wget.exe -O "response.json" -U "$user_agent" "https://httpbin.io/user-agent"
将上述逻辑存储在一个.ps1脚本中。多次执行它,你将在response.json输出文件中看到不同的用户代理字符串。
瞧!你现在已经掌握了Wget更改用户代理的程序。
结论
在本指南中,你探索了为什么总是应该在HTTP客户端中设置User-Agent头以及如何在Wget中设置它。这种方法可以欺骗简单的反机器人系统,使其相信你的请求来自合法的浏览器。然而,先进的反机器人解决方案仍然可以检测并阻止你的请求。为了绕过限制措施,你可以使用代理与Wget。不幸的是,这可能还不够!
避免所有这些麻烦,试试Scraper API。作为一个功能全面的抓取API,它提供了你用Wget或任何其他HTTP客户端执行自动化网络请求所需的一切。这一整合解决方案可以绕过任何反机器人技术,具有IP和用户代理轮换功能。进行自动化请求从未如此简单!
找到适合你需求的完美产品,立即注册。