用你的Linux终端中从互联网上下载文件。
wget是一个下载网页文件的免费工具。它将互联网上的数据保存到一个文件或展示在终端上。实际上这也是像Firefox或Chromium这样的网页浏览器的工作原理。有一个区别是,网页浏览器默认将网页渲染render在图形窗口中,并且通常需要用户主动来操作它们。而wget工具是无交互的使用方式,也就是说你可以使用脚本或定期使用wget来下载文件,不论你人是否在电脑面前。
使用wget下载文件
你可以通过提供一个特定URL的链接,用wget下载一个文件。如果你提供一个默认为index.html的URL,那么就会下载该索引页。默认情况下,文件会被下载到你当前的工作目录,并保持原来的名字。
$wgethttp://example.com--2021-09-2017:23:47--http://example.com/Resolvingexample.com...93.184.216.34,2606:2800:220:1:248:1893:25c8:1946Connectingtoexample.com|93.184.216.34|:80...connected.HTTPrequestsent,awaitingresponse...200OKLength:1256(1.2K)[text/html]Savingto:'index.html'
通过使用--output-document和-符号,你可以指示wget将数据发送到标准输出stdout:
$wgethttp://example.com--output-document-|head-n4
你可以使用--output-document选项(简写为-O)将下载文件命名为任何你想要的名称:
$wgethttp://example.com--output-documentfoo.html
断点续传
如果你正在下载一个超大文件,你可能会遇到中断下载的情况。使用--continue(简写为-c),wget可以确定从文件的哪个位置开始继续下载。也就是说,下次你在下载一个4GB的Linux发行版ISO时,如果出现了错误导致中断,你不必重新从头开始。
$wget--continuehttps://example.com/linux-distro.iso
下载一系列的文件
如果你要下载的不是单个大文件,而是一系列的文件,wget也能提供很好的帮助。假如你知道要下载文件的路径以及文件名的通用范式,你可以使用Bash语法指示一个数字范围的起始和终点来表示这一系列文件名:
$wgethttp://example.com/file_{1..4}.webp
使用--mirror选项你可以下载整个站点,包括它的目录结构。这与使用选项--recursive--levelinf--timestamping--no-remove-listing的效果是一样的,该选项表明可以进行无限制的递归,得到你指定域下的所有内容。但你也可能会得到比预期多得多的内容,这取决于站点本身的老旧程度。
如果你正在使用wget来打包整个站点,选项--no-cookies--page-requisites--convert-links非常有用,它可以确保打包的站点是全新且完整的,站点副本或多或少是自包含的self-contained。
修改HTML标头
在计算机发送的通信报文里含有大量用于数据交换的元数据metadata。HTTP标头是初始数据的组成部分。当你浏览某个站点时,你的浏览器会发送HTTP请求标头。使用--debug选项可以查看wget为每个请求发送了什么样的标头信息:
$wget--debugexample.com---requestbegin---GET/HTTP/1.1User-Agent:Wget/1.19.5(linux-gnu)Accept:*/*Accept-Encoding:identityHost:example.comConnection:Keep-Alive---requestend---
你可以使用--header选项修改请求标头。实际上经常使用这种方式来模仿某特定浏览器,来测试或兼容某些编码糟糕、只能与特定代理通信的站点。
让请求被识别为来自Windows系统的MicrosoftEdge:
$wget--debug--header="User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36Edg/91.0.864.59"http://example.com
你也可以假装为某个移动设备:
$wget--debug--header="User-Agent:Mozilla/5.0(iPhone;CPUiPhoneOS13_5_1likeMacOSX)AppleWebKit/605.1.15(KHTML,likeGecko)Version/13.1.1Mobile/15E148Safari/604.1"http://example.com
查看响应标头
与浏览器发送请求标头的方式一样,响应也包含有标头信息。你可以使用--debug选项来查看响应中的标头信息:
$wget--debugexample.com[...]---responsebegin---HTTP/1.1200OKAccept-Ranges:bytesAge:188102Cache-Control:max-age=604800Content-Type:text/html;charset=UTF-8Etag:"3147526947"Server:ECS(sab/574F)Vary:Accept-EncodingX-Cache:HITContent-Length:1256---responseend---200OKRegisteredsocket3forpersistentreuse.URIcontentencoding='UTF-8'Length:1256(1.2K)[text/html]Savingto:'index.html'
处理301响应
200响应码意味着一切都在预料之中。而301响应则表示URL已经被永久迁移到了另外一个地方。这是站点管理员的一种常用手段,内容迁移后,为访问旧地址的用户留下寻找新地址的“线索”。wget会默认跟随重定向redirect,这也是大部分情况下用户所希望的。
当然,你可以使用--max-redirect选项,用于控制wget默认处理301响应重定向的次数。设置为0意味着不会自动重定向到新的地址:
$wget--max-redirect0http://iana.org--2021-09-2111:01:35--http://iana.org/Resolvingiana.org...192.0.43.8,2001:500:88:200::8Connectingtoiana.org|192.0.43.8|:80...connected.HTTPrequestsent,awaitingresponse...301MovedPermanentlyLocation:https://www.iana.org/[following]0redirectionsexceeded.
同时,你也可以设置为其他的数值来控制wget能重定向多少次。
展开URL缩写
使用--max-redirect选项用于在实际访问之前查看URL缩写shortenedURL非常有用。缩写URL可用于用户无法完整拷贝和粘贴一个长URL时的印刷媒体printmedia,或是具有字数限制的社交网络(在类似Mastondon这种现代开源的社交网络上这并不是一个问题)。这种缩写具有一定的风险,因为本质上这些目的地是隐藏的。组合使用--head选项和--location选项来来查看HTTP头部并解开最终的目的地,你可以在不加载整个资源的情况下查看到缩写URL的完整内容:
$wgethttp://example.com--output-document-|head-n40
从Location开始的倒数第二行输出,展示了实际的目的地。
使用wget
若你开始考虑使用单个命令来实现整个网站访问的过程,wget可以快速高效的帮你获取互联网上的信息,而不用在图形界面上耗费精力。为了帮你将它构造在你平常的工作流中,我们创建了一个wget常用使用方式和语法清单,包括使用它来查询API的概述。在这里下载Linuxwget速查表。