如何用wget设置代理服务器
Wget 是一个免费的 GNU 命令行实用程序,用于通过 HTTP、HTTPS 和 FTP 检索内容。它主要用于镜像网站、下载大文件和备份网页内容。
但是,某些网站可能会将您标记为机器人并最终阻止您的请求,从而导致您的下载不断失败。那么该怎么办?一个可靠的解决方案是通过代理服务器路由您的请求以避免机器人检测。
在本指南中,您将了解如何使用 Wget 代理以及网络抓取的最佳实践和协议。让我们开始吧!
什么是 Wget 代理?
Wget 代理是一个服务器,它允许用户访问网站内容而无需直接连接到他们。它充当用户和目标服务器之间的中间人,有助于提高隐私和安全性。
也就是说,当您发出请求时,它会首先通过代理服务器重新路由。之后,代理服务器向网站发送请求,接收响应,返回给你。
Wget速成班
在继续之前,让我们介绍一下 Wget 的一些基础知识。
安装 Wget
首先在本地机器上安装 Wget。您可以在 Linux、Mac 和 Windows 等主要操作系统上执行此操作。虽然可以从其官方网站下载并手动安装 Wget,但使用包管理器还是很方便的。
在 Linux 上安装 Wget
不同类别的 Linux 发行版使用不同的包管理器。
如果您使用的是基于 Debian 的发行版,例如 Ubuntu,请使用以下命令安装apt
:
sudo apt-get install wget
如果您使用其他
wget --version
流行的包管理器,则需要以下内容:
将以下内容用于 YUM:
sudo yum install wget
至于ZYpp,你可以这样安装:
sudo zypper install wget
现在,检查以确认安装是否成功:
wget --version
如果一切顺利,您将收到反馈,显示您的机器上安装了 Wget 版本。如果不是这种情况,请重新运行安装命令。
在 Mac 上安装 Wget
在 MacOS 上,我们建议使用 Homebrew 包管理器:
brew install wget
在 Windows 上安装 Wget
对于 Windows 用户,一个合适的包管理器是Chocolatey:
choco install wget
Wget 语法
Wget 的帮助命令的输出wget -h
揭示了它的语法:
wget [OPTION]... [URL]...
[OPTIONS]
是可用于自定义 Wget 行为的各种可选标志或参数,而 是[URL]
要下载的文件的 URL。
使用上面的 Wget 帮助命令可以找到所有可用的选项或标志。以下是一些最常用的:
-c
恢复先前暂停或中断的下载。-O <filename
: 定义下载文件的名称。-r
从指定的 URL 重复下载文件。
现在您知道 Wget 的语法是什么样的,让我们继续。
使用 Wget 下载文件
您可以使用 Wget 从网页下载内容。假设您的目标网站是IdentMe。我们可以通过运行以下命令获取其内容:
wget -qO- https://ident.me/
该q
标志用于安静模式,O-
指示wget
生成标准输出并打印到终端。
运行命令后,你应该得到你的 IP 地址(输出),这是 IdentMe 页面的内容:
197.210.7...
通过 Wget 获取输出文件
我们如何将 IdentMe 的输出保存到文件中?在没有任何标志的情况下运行上一个命令:
wget https://ident.me/
Wget 将输出内容类型理解为 HTML,并自动将其保存到与index.html
运行命令相同的目录中的文件中。
或者,您可以使用以下标志指定要下载 HTML 文件的目录-P
:
wget -P ./save_here https://ident.me/
如果指定的目录不存在,Wget 会自动创建它。上面的命令将下载输出并将文件保存在save_here
目录中。
您还可以使用该选项为下载的文件指定一个名称,而不是默认名称-O
。这会将内容下载到text.txt
同一目录中的文件中。
wget -O 'text.txt' https://ident.me/
如何从命令行使用 Wget 和代理
现在,让我们看看如何使用 Wget 代理。第一步是获取您想要的代理,并在保存wgetrc
Wget 配置内容的文件中设置 HTTP 和 HTTPS 的代理变量。
让我们首先使用 Wget 向HTTPBin发出请求,以查看我们机器的 IP 地址:
wget -qO- https://httpbin.org/ip
你会得到类似这样的输出:
{ "origin": "197.210.7..." }
密钥的值origin
是您的 IP 地址。现在,让我们使用代理,看看输出(IP 地址)是否会改变。如果您没有可用的代理,请从免费的 代理服务器列表中获取一个。
您的代理应采用以下格式:
<PROXY_PROTOCOL>://<PROXY_IP_ADDRESS>:<PROXY_PORT>
要使用代理,Wget 会检查http_proxy
、https_proxy
和ftp_proxy
变量是否设置在:
wgetrc
默认配置文件,位于/usr/local/etc/wgetrc
..wgetrc
配置文件,位于$HOME/.wgetrc
.- 通过文件传递给它的配置文件
--config
。 - 设置代理环境变量。
- 使用
-e
标志执行命令。
我们将探讨选项三:创建配置文件并将其传递给 Wget。
Wget 配置文件的语法如下:
variable = value
在您的当前目录中创建一个配置文件(例如,.wgetrc
)并向其中添加以下内容:
use_proxy = on http_proxy = http://15.229.24.5:10470 https_proxy = http://15.229.24.5:10470 ftp_proxy = http://15.229.24.5:10470
用新代理更新代理并保存。向 HTTPBin 发出请求,但这次传递配置文件如下:
wget --config ./.wgetrc -qO- https://httpbin.org/ip
这一次,您应该使用不同的 IP 地址:您的代理地址。
{ "origin": "15.229.24.5" }
需要 Wget 代理身份验证:用户名和密码
一些代理服务器在授予访问权限之前要求客户端身份验证是常见的做法,尤其是在处理高级服务时。如果是这种情况,您的 Wget 代理字符串将需要身份验证选项以在连接到代理服务器时指定用户名和密码。--proxy-user
这可以通过将和--proxy-password
选项传递给来完成wget
:
wget --config ./.wgetrc --proxy-user <USERNAME> --proxy-password <PASSWORD> -qO- https://httpbin.org/ip
或者,您可以在代理字符串中包含您的身份验证凭据:
<PROXY_PROTOCOL>://<USERNAME>:<PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>
使用 Wget 的旋转代理
轮换代理是不断更改 IP 地址的代理服务器。由于每个请求都来自不同的 IP,网站检测和阻止自动流量变得更加困难。
让我们使用 Wget 设置一个旋转代理。
使用免费解决方案轮换 IP
一个免费的解决方案是创建一个具有不同 IP 的代理列表,然后随机选择和使用一个。Wget 没有随机选择代理的标准方法,但您可以使用简单的 shell 脚本。
创建一个proxies.txt
文件并添加您打算使用的所有代理。每个 Wget 代理都应该在一个新行上。
http://113.53.231.133:3129 http://15.229.24.5:10470
创建一个 shell 脚本,它使用 GNU 的shuf
实用程序从中随机选择一个代理proxies.txt
,并使用执行选项在 Wget 中设置代理-e
:
for i in {1..3} do proxy=$(shuf -n 1 proxies.txt) # Pick random proxy from proxies wget --config ./.wgetrc -qO- -e use_proxy=yes -e http_proxy=$proxy -e https_proxy=$proxy -e ftp_proxy=$proxy --proxy-user=your_username --proxy-password=PASSWORD https://httpbin.org/ip done
在这里,我们添加了一个循环来执行 Wget 命令 3 次,以测试 IP 是否发生变化。将脚本粘贴到您的终端并运行它。您会发现 IP 随每个请求随机变化:
{ "origin": "113.53.231.133" } { "origin": "113.53.231.133" } { "origin": "15.229.24.5" }
这个免费的解决方案实施旨在向您展示 IP 轮换的基础知识,但它并不可靠。由于缺乏足够的活动代理列表,您可能会被阻止,主要是如果它们不是住宅代理。为了证明这一点,让我们使用这种方法从G2 的主页上抓取数据:
for i in {1..3} do proxy=$(shuf -n 1 proxies.txt) # Pick random proxy from proxies wget --config ./.wgetrc -qO- -e use_proxy=yes -e http_proxy=$proxy -e https_proxy=$proxy -e ftp_proxy=$proxy --proxy-user=your_username --proxy-password=PASSWORD https://g2.com done
运行此脚本将产生不适当的输出或根本没有输出,因为 G2 已阻止对它发出的所有请求。
让我们在下一节中看到一个更好的选择。
高级代理以避免被阻止
高级代理服务是避免被阻止同时确保更高稳定性和更快连接速度的最佳方法。ZenRows 是一个很好的选择,因为它提供了多种有效的功能。您将获得地理定位、每月 49 美元起的灵活定价、仅对成功的请求收费以及高级代理轮换。
让我们看看如何使用 ZenRows 的 Wget 代理来抓取之前阻止我们的 G2 主页。注册一个新帐户即可获得您的 ZenRows API 密钥和 1,000 个免费积分。您将可以访问易于导航的仪表板,如下图所示:
.wgetrc
使用以下内容更新您的配置文件:
use_proxy = on check_certificate = off http_proxy = http://<YOUR_ZENROWS_API_KEY>:[email protected]:8001 https_proxy = http://<YOUR_ZENROWS_API_KEY>:[email protected]:8001
check_certificate
此处关闭该选项以防止 SSL 证书错误。从仪表板复制 API 密钥并<YOUR_ZENROWS_API_KEY>
用它替换配置。
现在,使用以下命令向 G2 发出新请求:
wget --config ./.wgetrc https://g2.com
惊人的!默认情况下,Wget 会将响应保存在一个index.html
文件中,看到请求数据内容类型是text/html
. 您可以打开该文件以查看您抓取的数据。
值得注意的是,除了旋转代理外,ZenRows 还旋转用户代理,使抓取过程更加有效。
Wget 抓取的最佳实践
让我们看看您可以采用哪些最佳实践来避免在使用 Wget进行网页抓取时被阻止。
为 Wget 抓取设置真实用户代理
您的浏览器向目标网站的服务器发送一串称为用户代理 (UA) 的数据,其中包含有关您使用的浏览器和操作系统的信息。反机器人技术通常会检查 UA 以区分实际浏览器和机器人。
通过使用看起来真实的自定义默认 Wget 用户代理,您可以减少被阻止的机会。向HTTPBin 标头端点发出请求以查看 Wget 的默认 UA 是什么样子的:
wget -qO- https://httpbin.org/headers
你应该得到类似这样的响应:
{ "headers": { "Accept": "*/*", "Accept-Encoding": "identity", "Host": "httpbin.org", "User-Agent": "Wget/1.21.3", "X-Amzn-Trace-Id": "Root=1-64685ea4-60786d911f48365f63075608" } }
默认值为Wget/1.21.3
,这不是有效的浏览器 UA。因此,具有反机器人措施的网站很容易将您标记为机器人。
这是一个有效的浏览器 (Chrome) 用户代理的样子:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
您可以从我们的顶级用户代理列表中获取一些用于网络抓取的用户代理。user_agent
现在,您可以通过在配置文件中指定选项或--user-agent=agent-string
在请求中使用标志 来设置 Wget 用户代理。
.wgetrc
像这样更新您的配置文件:
user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
更新您的请求以包含配置并运行它:
wget --config ./.wgetrc -qO- https://httpbin.org/headers
您应该会得到与之前类似的响应,但这次使用的是您设置的 UA:
{ "headers": { "Accept": "*/*", "Accept-Encoding": "identity", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-64686fe3-14aa555967dcfdf972c3e336" } }
使用 Wget 进行速率限制以避免被阻塞
建议降低请求速率以避免被阻塞或服务器过载。Wget 提供了两个选项,wait
orwaitretry
和limit_rate
,可以将它们添加到您的配置文件中,以分别设置请求之间的延迟和限制下载速度。
或者,您可以使用等效的命令行:--wait
or--wait-entry
和--limit-rate
。
例如,--wait=3
设置三秒延迟,同时--limit-rate=60k
限制下载速度为 60 KB/s。虽然没有确保安全的通用速度限制或请求延迟,但您可以遵守一些通用准则和经过验证的技巧,以避免在抓取时被阻止。
使用像 ZenRows 这样的 Web 抓取 API 时,速率限制不是问题,因为它有很大的代理池。
如何修复常见错误
使用 Wget 进行网页抓取时,您可能会遇到几个错误:
错误 407:需要 Wget 代理身份验证
Wget 的错误 407 意味着您的代理服务器需要身份验证,因此提供有效的凭据将解决此问题。基本身份验证凭据包括用户名和密码。--proxy-user
您可以使用和选项直接在命令中指定它们--proxy-password
:
wget --proxy-user=<USERNAME> --proxy-password=<PASSWORD> <TARGET_URL>
或者,您可以使用配置文件中的proxy_user
和proxy_password
选项在代理后面使用 Wget。分别用您的代理服务器的<USERNAME>
用户名、密码和目标 URL 替换 、 和<PASSWORD>
。<TARGET_URL>
如果凭据正确,您将不会再次收到此错误。
错误 400:Wget 代理错误请求
Wget 的错误 400 通常意味着您发送到代理服务器的请求不正确。您可以通过验证您的 Wget 代理服务器的设置来解决这个问题,例如它的地址、端口和任何其他可用的配置。如果目标服务器有问题,也可能出现该错误。要确认,请尝试在没有代理的情况下直接访问它。
结论
在抓取网络时,Wget 代理可以帮助绕过 IP 块并查看您所在国家/地区受限制的内容。你现在知道了:
- Wget 的基础知识。
- 如何将代理与 Wget 一起使用并对其进行身份验证。
- 如何使用免费和高级代理轮换解决方案。
- 使用 Wget 进行网页抓取的最佳实践。