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 --versionwget -V 验证工具是否安装成功!

可以做什么?

  • 通过HTTPHTTPSFTPFTPS协议递归下载文件
  • 支持自动断点续传文件【-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地址(支持IPv4IPv6
  • %{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地址(支持IPv4IPv6
  • %{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
      
  • 两者都是不可以交互的命令行工具,这意味着 wgetcurl 都可以直接在 Shell 脚本、crontab等工具中被使用
  • wget 是一个无需依赖其他扩展的独立、简单的程序,专注于下载且支持递归下载,如果遇到访问链接301302等情况会自动进行跳转然后进行下载
  • curl 是一个功能完备的网络请求工具-更多的用途是:从stdin读取数据将网络请求结果输出到stdout。更多的协议、提供了更大的自定义操作功能,如:并发测试、下载数据、上传数据、获取响应报头进行分析…!【curl -L 参数可以实现重定向自动跳转】
  • 下载文件:优先使用wget,其余情况使用curl

    最后可以看一下:《10个例子教你学会wget命令》《curl使用实例》21 个 curl 练习 实战练习一下!或者可以写一个脚本并发请求百度页面分析每个请求的报头信息。