可以使用wget以编程方式下载文件和页面。但是让我们把它带到下一个层次,使用wget和代理服务器来抓取网页而不会被阻止。
Wget 与 cURL 非常相似。它允许你使用终端发送命令并从 URL 下载文件。这意味着你可以将该命令安排为每天自动运行,从而不再担心。
但是,如果你想使其真正自动化,需要一个代理。当你抓取站点时,很容易被阻止。使用代理是防止这种情况的快速方法。因此,今天我们将探索如何使用 Wget、如何使用代理、如何安装它、如何处理最常见的问题等。
关键,这是一个交互式指南,因此你可以按照指南操作并使用我们链接的站点测试命令。那我们就开始吧!
Wget代理命令行
wget命令的语法很简单
wget [options] [url]
当谈到wget代理的使用时,你有两个主要的选择。可以将代理数据作为选项在命令中传递,也可以全局保存代理数据,这样就不需要每次都启动它。
但是在我们研究wget代理本身之前,让我们看看如何使用wget。运行命令:
wget -V
除非你安装了wget,否则你会看到一个错误。让我们先解决这个问题。
Wget 命令未找到
一些操作系统默认安装了 wget。特别是大多数 Linux 发行版。但是,如果你正在运行 macOS 或 Windows,当你第一次尝试运行 wget 时,可能会看到一个错误。这只是意味着你还没有安装它。不过,这很容易解决。
Macbook 和 macOS 的 Wget
在Mac上安装wget最简单的方法是使用自制软件。你可以在你的终端上运行这个命令:
brew install wget
如果你没有自制软件,还有其他的选择。你可以简单地下载这个库(甚至使用cURL!)并安装它。
Windows 的 Wget
你可以直接从GNU项目下载wget的windows版本。然后你就可以打开安装程序并按照屏幕上的说明操作。现在可以使用wget了。但你应该这样做吗?为什么不使用cURL呢?让我们看看哪一个是最适合你的选择。
Wget vs. cURL
这个比较的简短版本是,wget 更易于使用(默认启用更多选项),而 cURL 更灵活,允许多种不同的协议和连接类型。
从实际功能上来说,cURL 可以使用 26 种不同的协议,而 wget 只使用基本的 HTTP、HTTPS 和 FTP 协议。你可以使用 wget 代理身份验证以及 cURL 代理身份验证。但是,wget 的连接类型更简单,你也受到其限制。
一般来说,wget可以很好地完成简单的抓取工作。你可以浏览网页,点击重定向,点击链接。另一方面,由于其灵活性,cURL可以完成所有这些任务和其他一些任务。
现在,让我们看看一些真实的 wget 命令示例,以及如何使用它们来获取页面。
通过代理使用 Wget – 不被阻止的网页抓取
当你使用 wget 时,即使是无害的调用,你也可能会被阻止。这是因为网站所有者不想与网页抓取者打交道,即使它们是完全合法的。
检测用户是否为 bot 的最简单方法是检查他们在网站上的浏览习惯。因此,你可以检查某个 IP 地址的访问页面,然后查看他们是否查看了太多页面、是否同时查看、或其他可能是 bot 的迹象。
但是,注意检测用户的关键点是查看来自同一个 IP 地址的连接。因此,你可以使用如 IPRoyal 和 SOAX之类的住宅代理服务来隐藏你的 IP 地址。这样,网站所有者就无法追踪你访问了哪些页面,因为他们将看到每次访问的完全不同的 IP 地址。
现在你只将wget连接到代理并隐藏你的IP地址。你可以通过在wget命令之前使用http_proxy或https_proxy变量来实现,如下所示:
http_proxy=http://[username]:[password]@geo.iproyal.com:12321 wget -v http://ipv4.icanhazip.com/
还有其他类似的方法,例如使用-e,甚至是别名。例如,将整个代理调用保存为别名,然后在wget命令之前调用它。
一般来说,如果不希望wget代理影响整个操作系统,那么单行命令是使用wget代理的好方法。你只能在当前终端中获得代理连接,仅此而已。但是如果你想要存储这些信息,你可以这样做。
如何存储 Wget 的 http_proxy 变量
Wget 使用 http_proxy 和 https_proxy 变量,因此你可以永久编辑这些变量,并改变所有 Wget 命令的运行方式。请注意,这也会影响其他命令的运行方式,如 cURL。
系统会查看以下几个文件(按顺序):
- ~/.wgetrc:用户启动文件。
- /etc/wgetrc:全局启动文件。
- ~/.bash_profile:用户特定环境。
- /etc/profile:系统范围环境。
因此,系统会查看 ~/.wgetrc 文件。如果没有设置代理信息,那么它将查看 /etc/wgetrc 文件。然后,它将继续查看列表,直到找到这些信息。
你可以编辑任何这些文件,并取消注释/添加以下行:
use_proxy=yes http_proxy=http://username:password@domain:port/ https_proxy=https://username:password@domain:port/ ftp_proxy=http://username:password@domain:port/
对于.bash_profile和/etc/profile文件,你需要使用shell命令来设置代理,如下所示:
export http_proxy=http://username:password@domain:port/ export https_proxy=https://username:password@domain:port/ export ftp_proxy=http://username:password@domain:port/
将用户名/密码/地址/端口替换为你自己的信息。就是这样!你可能需要重置你的终端浏览器,但是你的下一个连接正在使用你的wget代理信息。
Wget跟随重定向
这不是直接的wget代理问题,但它与你将面临的问题有关。使用wget最有用的方法之一是遵循重定向,从而允许它在重定向链的末端下载文件。
默认情况下,wget遵循重定向。例如:
wget -v http://google.com
你会在输出中看到这样的内容:
And you’ll see something like this in the output: Resolving google.com (google.com)... Connecting to google.com (google.com)... connected. HTTP request sent, awaiting response... 301 Moved Permanently Location: http://www.google.com/ [following] Resolving www.google.com (www.google.com)... Connecting to www.google.com (www.google.com)... connected. HTTP request sent, awaiting response... 200 OK Saving to: ‘index.html’
注意,wget首先尝试加载google.com,然后它被重定向到www.google.com。没问题,wget会立即按照新的路径下载index.html。如果由于某种原因wget重定向不能为你工作,请检查max_redirects属性,有时它被设置为1,删除任何进一步的重定向。
Wget忽略证书
有时候,我们需要在http和https之间切换,或者需要爬取具有过期证书的页面。如果你尝试在浏览器中加载这些页面,会遇到安全错误,这是有充分理由的。你正在混合明文内容和加密内容,或者可能正在访问具有过期SSL证书的页面。
但是,当涉及到网页爬取时,有时候你只是想让它工作。你可以将wget代理命令与这个命令结合使用,以忽略wget中的证书错误:
wget --no-check-certificate https://google.com
这允许你忽略证书错误,并且仍然可以看到页面的内容。
Wget –no-proxy
也许你已经保存了代理信息,但你只想在某个特定命令中禁用它。不用担心,–no-proxy设置可以帮你解决这个问题。你可以使用这个命令来覆盖任何代理数据,例如:
wget --no-proxy https://google.com
当然,如果你想使此更改永久保存,可以随时编辑设置文件。但这应该是一个快速解决方案。
Wget 基础命令
这里有一份简单的 wget 命令列表,供你使用 wget 代理爬虫。
- 设置输出文件名: wget -o [filename] [url]
-o命令是-output-file =name的别名。
因此,你可以使用这个命令以自定义名称保存文件:
wget -v -o test.html https://google.com
- 保存到指定路径: wget -P [path] [url]
你可以使用 -P 选项将文件保存到自定义路径。这样,你可以运行 wget 代理,并将网站的所有文件保存到一个特定文件夹中,例如:
wget -v -P path https://google.com
- 设置用户代理: wget -user-agent =[name] [url]
用户代理是机器人活动的另一个明显标志。有些机器人甚至不发送有效的用户代理。这种行为非常可疑,因为大多数浏览器都会发送这些信息。
wget --user-agent=Safari https://google.com
- 转换链接: wget -convert-links [url]
你可以下载文件,并将所有链接从固定链接转换为本地路径的本地链接。如果你想使用浏览器测试下载的文件,这特别有用。
wget --convert-links https://google.com
你会在转换链接作业的末尾看到此消息:
Converting links in index.html... 0-9 Converted links in 1 file in 0 seconds.
这意味着一旦你访问 index.html,所有过去的链接将引用你服务器中的相应页面。
- 下载页面列表: wget -i links.txt
另一个适合使用 wget 进行网页爬取的功能是从列表中加载页面。你可以创建一个简单的 txt 文件,每行添加一个链接,然后使用这个命令:
wget -i links.txt
使用它,wget下载该列表中的每个链接。这对于批量下载很方便。
常见问题
wget代理中出现Https错误
有时,你可能会得到HTTPs错误。你可以使用忽略证书设置来修复它,或者确保你的代理与预期的协议匹配。例如,如果你的代理是http,请确保将其设置为http_proxy而不是https_proxy。
如何删除wget代理
你可以通过编辑以下文件之一来删除代理设置:
- ~/.wgetrc : 用户启动文件。
- /etc/wgetrc : 全局启动文件。
- ~/.bash_profile : 用户特定的环境。
- /etc/profile : 系统范围的环境。
你的设置可能在其中一个(或全部)中,因此,如果只想修复问题而不查看每个特定文件,只需在~/中添加代理删除代码。Wgetrc文件,因为这是第一个要加载的文件。
Wget: 不是http或ftp url
通常在使用错误的协议时可能会出现错误。所以仔细检查你的下载是http, https还是ftp。在大多数情况下,这只是修复URL的问题。
结 论
我们学习了如何使用wget代理进行简单的文件下载和网页抓取。我们希望你喜欢它,下次再见!