`
pf_miles
  • 浏览: 134166 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

分享一个利用wget的限时、限速下载脚本

阅读更多
有这么一个需求:有一系列图片url(只是url而已)存在文件里(或别的存储里),我需要写一个后台任务程序,把这些url一个个down成图片,因此,需要注意以下几点:
1.如果图片很大(比如超过2M),那么需要在发现后停止下载;
2.如果图片所在网站速度很慢,不能一直等它下完,超时就kill;
3.更高层的程序可能会多进程地调用此脚本来完成并行下载,因此这个脚本最好限个速,保证服务器带宽稳定。

linux下有一个非常好的下载工具wget,直接使用这个工具来帮助完成上述任务能节约开发成本,并且稳定可靠;不过,在看完了man wget后,发现没有办法配置wget使得脚本满足第1条要求(即限制下载大小),貌似沾点边的--quota却对单个下载url是无效的,因此,稍微做了一点shell编程,变通地解决了该问题。
先是下载脚本:

#!/bin/bash

##usage: ./singleDown dirName fileName url
if [ $# -lt 3 ]
then
	echo 'usage: ./singleDown.sh dirName fileName url'
	exit 1
fi
##重试次数
retryTime=3
##等待超时(s)
idleTimeOut=7
##下载限时
downTimeOut=16
##下载限速
limitRate=128k
##每次重试的间隔时间(s)
waitRetry=1

url=`echo "$3" | sed "s/ /%20/g"`
postFix=`echo $url | awk -F. '{print $NF}'`

wget -q -nc --no-cookies --ignore-length -t $retryTime -T $idleTimeOut --limit-rate=$limitRate --waitretry=$waitRetry -O $1/$2.$postFix $url &

downPid=$!
./sleepAndKill.sh $downTimeOut $downPid &
clockPid=$!

wait $downPid
downResult=$?

ps $clockPid
if [ $? -eq 0 ]
then
	kill -9 $clockPid
fi
exit $downResult

这个脚本分析目标url的后缀,根据传入的保存路径和保存文件名,将文件下载下来。
其中,仍然没有下载大小限制的配置,但我们注意到有一个'downTimeOut'和'limitRate',这两个相乘刚好2M,间接地解决了大小限制的问题;
然后这个'downTimeOut'是怎么实现的呢?是通过另一个脚本'sleepAndKill.sh'来实现的(wget中的配置项的所有timeout均指'idle Time',即等待时间,并非'下载时间',所以这个timeout必须另写脚本实现):
#!/bin/bash

##usage: timeOut(s) pidToKill

if [ $# -lt 2 ]
then
	echo 'usage: timeOut(s) pidToKill'
	exit 1
fi

sleep $1
ps $2
if [ $? -eq 0 ]
then
	kill -9 $2
fi


这个脚本很简单,传入timeout和监控的pid,然后sleep,醒来后如果发现pid所代表的进程还在的话就Kill.
在第一个脚本中我们也看到这么一行:

kill -9 $clockPid

这个$clockPid是sleepAndKill.sh的id,也就是说,在运行的时候,下载脚本和sleepAndKill.sh在赛跑,谁先做完事情,就会主动去kill另一方,以保证脚本在尽可能短的时间内跑完:

如果下载脚本在16秒内跑完了(这时sleepAndKill.sh还在睡),就杀掉sleepAndKill.sh,任务结束(不然sleepAndKill.sh还在那傻睡);
如果下载脚本16秒后还没跑完,sleepAndKill.sh醒来,kill掉下载脚本,任务结束,保证不会down下超过2M的图片。

本来还考虑通过content-length来判断是否目标大于2M,不过content-length是不可靠的,且并不比上述方法来得简单。

用法:
./singleDown.sh ./ google http://www.google.cn/intl/zh-CN/images/logo_cn.gif

以上命令将google的logo保存在当前文件夹下,名叫'google.gif'

脚本在附件中。
脚本所调用的wget版本为:'GNU Wget 1.10.2',更古老的版本在加上'&'符号运行时的行为比较奇怪,可能会影响限时功能,不建议使用过于古老版本的wget。
6
0
分享到:
评论

相关推荐

    windows wget.exe免费下载

    wget.exe 是一个命令行工具,主要用于在Windows操作系统中下载网页、文件和其他互联网资源。它源自于开源的GNU项目,功能强大且高度可配置,适用于自动化批量下载任务。wget支持HTTP、HTTPS和FTP协议,同时也能够...

    使用wget命令从清华源下载anaconda的安装脚本,结果返回403错误,无法下载。_-wget-403.zip

    使用wget命令从清华源下载anaconda的安装脚本,结果返回403错误,无法下载。_-wget-403

    wget网站下载工具

    总之,wget是一个功能强大的下载工具,它提供了丰富的选项以满足各种下载需求,无论是单个文件还是整个网站,无论是正常下载还是在网络受限的环境中,wget都能胜任。熟练掌握wget的使用,可以极大地提高你在处理网络...

    wget wget wget wget

    `wget`是一个强大的命令行下载工具,主要用于在Unix-like操作系统(包括Linux和macOS)上从互联网上下载文件。它的名字是“World Wide Web”和“get”的组合,表明其主要功能是从Web获取文件。`wget`的特点在于其非...

    wget命令行下载工具

    `wget`命令行下载工具是Linux...总结起来,`wget`是一个功能强大的下载工具,尤其适用于需要自动化、批处理或离线浏览的场景。通过灵活的选项和配置,用户可以根据具体需求定制其行为,以适应各种复杂的网络下载任务。

    wget 工具.zip

    `wget`工具是Linux系统中一个非常著名的网络数据下载命令行工具,它的Windows版本使得在Windows平台上也能享受到同样的便利。这个`wget`工具.zip压缩包包含了一系列以`.bat`脚本形式封装的命令,便于用户在Windows...

    wget1.21.4.zip安装包

    wget1.21.4.zip安装包是一款包含wget 1.21.4版本的可执行文件的压缩包。...在日常工作中,wget可以用于自动下载网页资源、定期更新备份、搭建本地镜像站点等多种用途,对于IT专业人士来说,是一个非常实用的工具。

    linux 离线安装wget

    在Linux系统中,`wget`是一个非常实用的命令行工具,用于从互联网上下载文件,尤其在没有图形化界面或者网络连接不稳定的情况下,其离线安装就显得尤为重要。本篇文章将详细阐述如何在Linux环境下离线安装`wget`,...

    使用wget下载整个网页

    标题“使用wget下载整个网页”涉及的是一个网络爬虫工具——wget,它是一个在命令行环境中使用的开源工具,主要用于从互联网上下载文件或整个网站。本文将深入介绍wget的使用方法及其相关知识点。 wget,全称World ...

    wget网络多协议下载

    wget是一款强大的网络下载工具,它被广泛应用于Linux系统中,同时也可跨平台运行在其他Unix-like系统上。wget以其可靠性和自动化特性著称,支持HTTP、HTTPS和FTP三种主要的互联网协议,使得用户能够方便地从Web...

    使用wget脚本模拟http并发请求

    以下是一个基本的`wget`脚本示例,用于模拟并发请求: ```bash #!/bin/bash # 定义要请求的URL列表 urls=(...

    centos下wget安装包

    在Linux操作系统中,`wget`是一个非常实用的命令行工具,用于从互联网上下载文件。它支持HTTP、HTTPS和FTP协议,甚至可以通过代理服务器进行下载。`wget`的一个显著特点是其非交互式操作,能够在后台运行,非常适合...

    wget for windows命令行下载工具, 支持https, 支持win10

    wget是一款强大的命令行下载工具,最初为Linux系统设计,但现在已经有了Windows版本,使得Windows用户也能享受到其便捷的下载服务。wget支持多种协议,包括HTTP、HTTPS和FTP,这使得它能够从互联网上下载各种类型的...

    安卓下利用ndk编译wget项目

    在Android平台上,利用NDK(Native Development Kit)编译wget项目是一个将开源的wget工具移植到Android设备上的过程。NDK允许开发者用C或C++编写原生代码,并将其集成到Android应用中,以实现高性能的计算或者利用...

    wget-1.20.3离线安装包.zip

    wget是Linux系统中一个强大的命令行工具,用于从互联网上下载文件。它的全名是“World Wide Web Get”,顾名思义,它可以从万维网上抓取文件,无论是单个文件还是整个网站。wget以其非交互式、后台运行以及断点续传...

    wget-1.11.4-1源代码

    `wget-1.11.4-1源代码` 是一个包含了wget工具1.11.4版本源码的压缩包。wget是一款广泛使用的开源网络数据下载工具,它支持多种协议,包括HTTP、HTTPS和FTP,同时具备断点续传和镜像功能,非常适合在Linux环境中进行...

    window10的wget包

    Window10中的wget工具是一个非常实用的命令行工具,它允许用户从互联网上下载文件,类似于Linux环境下的wget命令。这个wget包适用于那些在Windows环境下需要进行自动化或非交互式下载任务的用户。通过解压提供的...

    wget.exe for windows(windows版本wget)

    wget是一个很好的网络下载工具,linux环境下功能强大,可以探测url状态,此款工具是windows环境下的wget.exe 下载以后可以存放到system32目录下方便调用。

    wget源码安装包1.20版lz gz

    这个“wget源码安装包1.20版lz gz”指的是wget的1.20版本源代码,压缩格式为lz和gz,通常这样的文件扩展名组合表示文件已经被lz(LZMA,一种高效的压缩算法)和gzip(一种通用的数据压缩程序)双重压缩。 源码安装...

    离线安装wget依赖包

    wget是一款强大的网络下载工具,它支持通过HTTP、HTTPS和FTP协议下载,并且可以在用户退出后继续之前的下载任务,非常适合于在命令行环境中进行文件下载。然而,wget本身可能依赖于一些库和工具,因此在安装过程中...

Global site tag (gtag.js) - Google Analytics