Linux-wget指令

389 阅读7分钟

Linux-wget指令

1. 概述

wget是一个在命令行下使用的网络下载工具,它可以用来从网络上获取文件。wget支持HTTP、HTTPS和FTP协议,并且能够通过代理服务器下载。它的主要优点是支持断点续传、递归下载和自动处理重定向。

2. 基本语法

wget的基本语法如下:

wget [选项] [URL]

其中,[选项]是你可以添加的各种功能选项,而[URL]则是你要下载的文件地址。

3. 常见选项及实例

3.1 下载单个文件

最简单的用法是直接下载一个文件。例如,下载一个图片文件:

wget http://example.com/image.jpg

该命令将image.jpg下载到当前目录。

3.2 指定文件名保存

如果你希望将文件保存为特定的名称,可以使用-O选项:

wget -O new_name.jpg http://example.com/image.jpg

这个命令将文件保存为new_name.jpg。

3.3 断点续传

当网络中断时,可以使用-c选项进行断点续传:

wget -c http://example.com/largefile.zip

如果文件已经部分下载,wget会继续下载剩下的部分。

3.4 递归下载

wget可以递归下载网站上的所有内容,这对于备份网站或离线浏览非常有用。使用-r选项:

wget -r http://example.com

该命令将下载example.com网站的所有页面和资源。

3.5 下载整个网站并保持目录结构

使用-np选项可以防止wget下载父目录的内容。结合-k选项,wget可以将HTML文件中的链接转换为本地文件系统的链接:

wget -r -np -k http://example.com

这将下载整个网站并保持原有的目录结构。

3.6 限制下载速度

为了避免占用带宽,你可以使用--limit-rate选项限制下载速度。例如,将速度限制为200KB/s:

wget --limit-rate=200k http://example.com/largefile.zip

3.7 设置重试次数

默认情况下,wget会在网络不稳定时多次重试下载。你可以使用--tries选项设置重试次数,例如:

wget --tries=10 http://example.com/somefile.zip

这会将重试次数设置为10次。

3.8 代理服务器下载

如果你在使用代理服务器,可以通过设置环境变量或使用--proxy选项配置代理。例如:

wget --proxy=on http://example.com/somefile.zip

4. 高级用法

4.1 下载指定文件类型

通过-r和-A选项,wget可以递归下载特定类型的文件。例如,只下载网站上的PDF文件:

wget -r -A "*.pdf" http://example.com/

4.2 镜像网站

使用--mirror选项,wget可以创建网站的完整镜像,包括所有文件和目录结构:

wget --mirror -p --covert-links -P ./localdir http://example.com

4.3 下载列表中的所有URL

如果你有一个包含多个URL的文本文件,可以使用-i选项一次性下载所有文件:

wget -i urls.txt

4.4 用户代理设置

有些网站会检查请求的用户代理(User-Agent)。wget允许你自定义用户代理:

wget --user-agent="Mozilla/5.0" http://example.com

4.5 HTTP身份验证

对于需要登录的网站,wget支持HTTP基本认证。你可以使用--user和--password选项提供用户名和密码:

wget --user=username --password=secret http://example.com/protectedfile.zip

4.6 使用Cookies

wget可以使用和保存Cookies。例如,从某个网站下载需要先登录:

wget --save-cookies cookies.txt --post-data 'user=admin&password=secret' http://example.com/login
wget --load-cookies cookies.txt http://example.com/protectedfile.zip

4.7 多线程下载

虽然wget本身不支持多线程下载,但你可以通过使用-c选项和--limit-rage选项,结合xargs或parallel等工具实现多线程下载。例如:

echo "http://example.com/file.zip" | xargs -n 1 -P 4 wget -c --limit-rate=500k

这将使用4个并发线程下载文件。

4.8 使用POST请求

wget允许你使用POST方法发送数据,而不仅仅是GET请求。例如,上传一个文件:

wget --post-file=filename http://example.com/upload

4.9 避免下载已经存在的文件

使用-nc选项,可以避免wget下载已经存在的文件:

wget -nc http://example.com/somefile.zip

5. wget的组合与自动化

5.1 在脚本中使用wget

wget非常适合用在Bash脚本中,用于自动化下载任务。例如,编写一个脚本用来定期备份网站:

#!/bin/bash
wget --mirror -p --convert-links -P /backup/localdir http://example.com

5.2 配合cron定时任务

可以结合cron定时执行wget脚本,实现定期下载或备份任务。例如,配置cron每天凌晨2点执行备份:

0 2 * * * /path/to/backup_script.sh

5.3 处理失败的下载

在自动化任务中,处理下载失败的情况非常重要。可以使用if语句或wget的退出状态码进行处理:

wget http://example.com/somefile.zip
if [ $? -ne 0 ];then
	echo "Download failed,retring..."
	wget -c http://example.com/somefile.zip
fi

5.4 日志记录

使用-o选项,wget可以将日志记录到文件中,这在自动化任务中非常有用:

wget -o download.log http://example.com/somefile.zip

5.5 使用代理脚本

可以编写代理脚本,在wget下载前动态获取代理列表并进行下载。例如:

#!/bin/bash
proxy=$(curl -s https://proxy-list.com | grep -m 1 "proxy")
wget -e use_proxy=yes -e http_proxy=$proxy http://example.com/file.zip

6. 实战案例

6.1 批量下载图像并转换格式

假设你需要从网站上批量下载图片并将它们转换为不同的格式:

mkdir images
wget -r -l1 -nd -A jpg,jpeg,png -P images http://example.com/gallery/
for img in images/*;do
	convert $img ${img%.*}.png
done

6.2 自动备份Github仓库

#!/bin/bash
wget --mirror -p --convert-links -P /backup/github https://github.con/your_username/your_repo

6.3 定期获取数据更新

假设你需要定期从API获取数据并保存为本地文件:

#!/bin/bash
url="http://api.example.com/data"
timestamp=$(date +"%Y%m%d%H%M")
filename="data_$timestamp.sjon"
wget -O $filename $url

6.4 使用wget下载YouTube视频

虽然wget不能直接下载YouTube视频,但可以配合YouTube-dl或yt-dlp工具实现:

youtube-dl -o video.mp4 https://www.youtube.com/watch?v=example

6.5 下载电子书并生成目录

假设你有一个电子书下载网站的URL列表,你可以使用wget下载并生成目录:

mkdir ebooks
wget -i ebook_urls.txt -P ebooks
ls ebooks > index.txt

7. wget的配置文件

wget的配置文件为.wgetrc,通常位于用户主目录上。在该文件中,你可以设置默认选项,使得每次执行wget时自动应用这些配置。配置文件的语法非常简单,每行定义一个选项,格式如下:

option = value

7.1 设置代理服务器

如果你经常使用代理,可以将代理设置写入配置文件:

use_proxy=on
http_proxy=http://proxy.example.com:8080/
https_proxy=http://proxy.example.com:8080/
ftp_proxy=http://proxy.example.com:8080/

7.2 设置用户代理

如果你经常需要伪装为浏览器进行下载,可以在配置文件中设置默认的用户代理:

user_agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/58.0.3029.110 Safari/537.3

7.3 设置下载限制速度

可以在配置文件中设置默认的下载速度限制:

limit_rate=100k

7.4 禁用证书检查

如果你下载的文件来自使用签名证书的网站,可以通过以下设置禁用SSL证书检查:

check_certificate=off

7.5 自动重试

如果网络环境不稳定,可以设置wget在下载失败时自动重试:

tries=20

8. wget的安全性

8.1 HTTPS支持

wget支持通过HTTPS下载文件。通过--no-check-certificate选项,你可以禁用证书验证,但这些情况下可能会带来安全风险:

wget --no-check-certificate https://example.com/securefile.zip

8.2 基本认证和OAuth

对于需要认证的网站,wget支持HTTP基本认证,也可以通过使用OAuth令牌进行认证。

基本认证
wget --user=username --password=secret https://example.com/protectedfile.zip
使用OAuth令牌:
wget --header="Authorization: Bearer YOUR_ACCESS_TOKEN" https://api.example.com/data

8.3 防止泄露敏感信息

当使用wget下载敏感文件时,请小心不要xiel密码或令牌。可以将这些信息存储在安全的环境变量中,后使用配置文件的--password选项来避免在命令行中暴露。

9. Wget与其他工具的对比

9.1 wget vs curl

wget和curl是两个非常常用的命令行下载工具,各有优劣。

wget的优点:

  • 支持递归下载,适合下载整个网站。
  • 支持断点续传。
  • 内置了对代理、认证、自动重试等功能的支持。
  • 适合自动化脚本和批量下载。

curl的优点:

  • 更灵活,支持更多协议(如SCP、SFTP、LDAP等)。
  • 更适合API调用和复杂的HTTP请求(如PUT、DELETE、PATCH)。
  • 输出更容易控制,可以直接将响应体输出到终端或传递给其他命令。

9.2 wget vs aria2

aria2是另一个功能强大的下载工具,支持HTTP、FTP、BitTorrent、Metalink等协议。

aria2的优点:

  • 支持多源下载,速度更快。
  • 支持BitTorrent和Metalink协议,可以下载P2P文件。
  • 可以同时处理多个下载任务,具有更细致的下载控制。

wget的优点:

  • 配置和使用更简单,特别是在递归下载和网站镜像方面。
  • 内置了自动重试、认证和代理支持,适合批量自动化任务。

10. 实际应用案例

10.1 自动化网站监控

假设你需要定期监控某个网站的内容变化,可以使用wget下载网站的快照并与之前的快照进行对比:

#!/bin/bash
url="http://example.com"
timestamp=$(date +"%Y%m%d%H%M")
filename="snapshot_$timestamp.html"
wget -O $filename $url
diff -q $filename previouse_snapshot.html > /dev/null
if [ $? -ne 0 ];then
	echo "Website content changed."
fi
cp $filename previous_snapshot.html

10.2 批量下载科研数据

在科研领域,wget常用于批量下载公开数据集。假设你有一个包含大量数据集的URL的文件:

wget -i datasets.txt -P /path/to/data/

10.3 动态生成下载列表

有时你需要从动态生成的URL列表中下载文件。假设你要下载某个网站上的所有CSV文件:

#!/bin/bash
for i in {1..10}
do
	wget "http://example.com/data_$i.csv" -P /path/to/data
done

10.4 结合rsync进行数据同步

尽管wget主要用于下载,但你可以将其与rsync结合使用,实现更强大的同步功能。例如,从远程服务器上同步数据:

rsync -avz --process user@remote:/path/to/dir /local/backup/

10.5 下载大规模文件的分片

对于非常大的文件,可以通过分片下载来提高下载速度,分片可以通过wget的字节范围请求实现:

wget --header="Range: bytes=0-999999" -O part1 http://example.com/largefile.zip
wget --header="Range: bytes=1000000-1999999" -O part2 http://example.com/largefile.zip
wget --header="Range: bytes=2000000-" -O part3 http://example.com/largefile.zip

然后通过cat命令合并分片:

cat part1 part2 part3 > largefile.zip

10.6 数据抓取和解析

wget可以与其他工具(如grep、awk)结合使用,实现简单的数据抓取和解析。例如,下载并提取网页中的所有链接:

wget -qO- http://example.com | grep -oP '(?<=href=")[^"]*' > links.txt

10.7 批量下载网络图片并制作幻灯片

mkdir images
wget -r -l1 -nd -A jpg,jpeg,png -P images http://example.com/gallery/
ffmpeg -framerate 1/5 -i images/%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p slideshow.mp4

11. wget的调试与问题排查

11.1 启用详细输出

使用-d或--debug选项可以启用详细的调试信息输出,有助于分析下载过程中遇到的问题:

wget -d http://example.com/file.zip

11.2 跟踪HTTP请求与响应

使用--server-response选项,可以查看wget和服务器之间的HTTP请求和响应信息:

wget --server-response http://example.com/file.zip

11.3 忽略SSL证书问题

在某些情况下,wget可能会因为SSL证书问题而无法下载文件。可以使用--no-check-certificate选项忽略证书错误:

wget --no-check-certificate https://example.com/securefile.zip

11.4 网络问题排查

如果下载速度很慢或连接不稳定,wget提供了多个选项来帮助排查问题。例如,使用--timeout和--dns-timeout选项设置超时时间:

wget --timeout=30 --dns-timeout=10 http://example.com/largefile.zip

11.5 重试失败的下载

如果某个文件下载失败,你可以使用-c选项进行断点续传,或者使用--tries选项设置多次重试:

wget -c --tries=20 http://example.com/largefile.zip

11.6 使用strace调试

对于更高级的调试需求,可以使用strace来跟踪wget的系统调用,找出问题所在:

strace wget http://example.com/file.zip

11.7 使用tcpdump分析网络流量

如果怀疑网络问题,可以使用tcpdump来捕获和分析wget的网络流量:

sudo tcpdump -i eht0 -w wget_capture.pcap host example.com

通过tcpdump,可以捕获wget的流量并将其保存为pcap文件,之后可以使用Wireshark等工具进行详细分析。

12. 总结

wget是一个功能强大且灵活的命令行下载工具,适合各种场景的文件下载需求。从最简单的单个文件下载到复杂的递归下载、网站镜像、自动化脚本等,wget提供了丰富的选项和强大的功能。

更多技术分享,关注公众号:halugin