cURL
是一个开源项目,主要的产品有
curl
和
libcurl
:
curl
是一个跨平台的
URL
命令行工具,
libcurl
是一个
C语言
的网络协议扩展库。两者都是
基于多种互联网通用协议
对指定
URL
的资源进行
数据传输
。更多的信息可以阅读电子书:
《Everything curl》
GUN Wget
也是一个免费的开源项目,用于从
web
上下载文件。
wget
使用
通过软件管理包安装非常简单,可参考:
《How to Install Wget in Linux》
# Ubuntu/Debian
apt-get install wget
# RHEL/CentOS/Fedora
yum install wget
# OpenSUSE
zypper install wget
# ArchLinux
pacman -Sy wget
安装完毕之后,可以使用 wget --version
或 wget -V
验证工具是否安装成功!
可以做什么?
通过HTTP
、HTTPS
、FTP
、FTPS
协议递归下载文件
支持自动断点续传文件【-c
参数,旧版本可能存在问题,详情见:Linux 环境下使用 wget 命令下载 Blob 文件断点续传问题】
支持通配符批量下载文件
支持将下载的文档中的绝对链接转换为相对链接,以便下载的文档可以在本地彼此链接(–convert-links)
支持:HTTP 代理、COOKIE设置、HTTP 持久化连接
更多参数,查看GNU Wget Manual
,详细使用用法自行谷歌!
-t, –-tries=NUMBER
设定最大尝试链接次数(0
表示无限制).【当由于网络的原因下载失败,wget
会不断的尝试,直到整个文件下载完毕,可以设置最大尝试连接次数】
-T, –-timeout=SECONDS
设定响应超时的秒数
-w, –-wait=SECONDS
指定两次重试之间间隔秒数
–waitretry=SECONDS
在重新链接之间等待的秒数
–random-wait
在下载之间等待 0-2 秒
-Y, –-proxy=on/off
打开或关闭代理【更推荐:https://www.cnblogs.com/frankyou/p/6693256.html 文中方法3】
-Q, –-quota=NUMBER
设置下载的容量限制【注意:这个参数对单个文件下载不起作用,只能递归下载时才有效。如:-Q=5m
】
-–limit-rate=RATE
限定下载输率【即:限制下载带宽,如:--limit-rate=50k
】
–-bind-address=ADDRESS
指定本地使用地址(主机名或IP
,当本地有多个IP
或名字时使用)
–-spider
不下载任何东西【当需要调试打印 HTTP
响应信息时会使用该参数跳过下载步骤】
-x, –-force-directories
强制创建目录【如:下载 www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4
会层层创建目录】
-nH, –-no-host-directories
不创建主机目录【当 -x
参数存在时才可用】
-P, –-directory-prefix=PREFIX
将文件保存到目录 PREFIX/…
FTP 选项参数
wget -v --ftp-user=demo --ftp-password=password "ftp://test.rebex.net/readme.txt"
对于命名有规则的图片,下载非常简单:使用通配符(*-任意长度的任意字符、?-任意一个字符、[]-括号中的任意一个字符、{..}-表示一个序列)下载即可
wget -b http://aliimg.changba.com/cache/photo/{260929610-260939610}_640_640.jpg
图片命名无规则
一共 22 页,图片全部在 CDN:img1.446677.xyz
上,图片命名是非规则的!
遍历当前页面的 img.446677.xyz
域名,下载资源
遍历 22 分页:https://www.kanxiaojiejie.com/page/{1..22}
wget -b -c -r -H -D "img1.446677.xyz" -R "www.kanxiaojiejie.com" -nc https://www.kanxiaojiejie.com/page/{1..22}
curl
使用
cURL
你想要了解的curl
的知识基本都在:《Everything curl》里面。关于安装,请查看GET cURL。
可以做什么?
curl
的定位是在网络中“传输数据”,相比于wget
的只能下载资源就显得curl
的功能要强大太多了,而且其支持协议也比wget
要多的多。curl
可以用来发送邮件、批量请求、下载文件、模拟表单提交、分析网站请求耗时…wget
能做的,curl
都能做!
常用选项参数
标准错误输出
%{stderr} - 使用-w
参数格式化结果时,将该变量后的结果作为 标准错误-stderr
输出
%{stdout} - 使用-w
参数格式化结果时,将该变量后的结果作为 标准输出-stdout
输出
获取请求信息
%{local_ip} 本地客户端IP地址(支持IPv4
或IPv6
)
%{local_port} 本地客户端请求端口
获取响应信息
%{content_type} 获取 HTTP
响应头中的 Content-Type
%{method} 最终一次 HTTP
请求方法
%{http_version} 最终一次 HTTP
请求的协议版本
%{scheme} 获取最终URL
的通信协议方式(若使用了-L
参数,发生了重定向跳转最终获得的值可能和你预想的URL
协议不一致)
%{response_code} 最后一次传输返回的数字响应码(如:HTTP CODE
-旧版本获取响应码%{http_code}
)
%{url_effective} 获取最终重定向后的URL
地址(-L
参数设置 URL
自动重定向跳转,而不是直接返回 301/302 信息)
%{num_redirects} 重定向次数(只有使用了 -L
选项且确实发生了重定向该值才为非0)
%{redirect_url} 重定向之后的URL
(当没有设置 -L
参数时才有值)
%{remote_ip} 远程IP地址(支持IPv4
或IPv6
)
%{remote_port} 远程响应端口
%{ssl_verify_result} SSL 证书验证结果:0-成功
%{filename_effective} curl
写入的最终文件名。只有当使用了 --remote-name
或 --output
选项时这个选项才有意义。它与 --remote-header-name
选项结合使用时最有用
%{ftp_entry_path} 登录到远程FTP服务器时,curl
的初始路径
%{num_connects} 最近一次请求传输建立的TCP连接数
%{size_download} 下载内容的总字节数(即:Body
总字节数-Content-Length
)
%{size_header} HTTP
响应头 headers
的总字节数(不包含 Body
体)
%{size_request} HTTP
请求中发送的总字节数
%{size_upload} 上传的总字节数
%{speed_download} curl
的平均下载速度,单位:字节/秒【B/s】
%{speed_upload} curl
的平均上传速度,单位:字节/秒【B/s】
%{time_appconnect} 从“发起请求–>完成SSL/SSH 等上层协议”所耗费的时间,单位-秒
%{time_connect} 从“发起请求–>完成TCP三次握手”所耗费的时间,单位-秒
%{time_namelookup} 域名解析完成所耗费的时间,单位-秒(测试 DNS
服务器的寻址能力)
%{time_pretransfer} 从开始到文件传输即将开始所花费的时间(所有传输前的命令和特定协议的协商),单位-秒
%{time_redirect} 所有重定向所耗费的时间(重定向域名寻址–>准备传输前),单位-秒
%{time_starttransfer} 过程“发起请求连接–>接收到服务器的第一个字节响应”所耗费的时间(包括:请求/响应过程链路连接的耗时+服务器处理逻辑耗时),单位:秒
%{time_total} 整个请求操作的总耗时(发起请求连接–>传输完毕),单位:秒
案例:使用curl
分析网站单次请求响应情况
先准备一份格式化文件curl-format.txt
,内容如下:
# cat curl-format.txt
url: %{redirect_url}\n
remote_ip: %{remote_ip}\n
response_code: %{response_code}\n
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_redirect: %{time_redirect}\n
time_pretransfer: %{time_pretransfer}\n
time_starttransfer: %{time_starttransfer}\n
----------\n
time_total: %{time_total}\n
# curl -w "@/tmp/curl-format.txt" -o /dev/null --connect-timeout 15 -s -L "qeeq.com"
url: https://www.qeeq.com/
remote_ip: 210.65.162.22
response_code: 200
time_namelookup: 0.640369
time_connect: 1.190672
time_appconnect: 1.126743
time_redirect: 1.080580
time_pretransfer: 2.007771
time_starttransfer: 3.333640
----------
time_total: 5.689121
两者都是不可以交互的命令行工具,这意味着 wget
和 curl
都可以直接在 Shell
脚本、crontab
等工具中被使用
wget
是一个无需依赖其他扩展的独立、简单的程序,专注于下载且支持递归下载,如果遇到访问链接301
、302
等情况会自动进行跳转然后进行下载
curl
是一个功能完备的网络请求工具-更多的用途是:从stdin
读取数据将网络请求结果输出到stdout
。更多的协议、提供了更大的自定义操作功能,如:并发测试、下载数据、上传数据、获取响应报头进行分析…!【curl -L
参数可以实现重定向自动跳转】
下载文件:优先使用wget
,其余情况使用curl
最后可以看一下:《10个例子教你学会wget命令》、《curl使用实例》、21 个 curl 练习 实战练习一下!或者可以写一个脚本并发请求百度页面分析每个请求的报头信息。