抛开体力劳动Linux下bash双重循环下载文件

需求:有一个网站,提供视频在线播放,视频格式为flv,视频路径直接写在网页源代码中,而视频路径每一次的请求都不一样,比如某个视频在网页源代码中的地址为:http://url/dl/88bd09b075a2033d8b515fae13398253/4f0fa279/1.flv,每一次刷新页面查看源代码,代码中dl后和1.flv之间的代码就会改变,系统这样生成的随机地址就是防盗链,而经测试,如果所生成的视频flv地址在经过三五分钟未经引用(播放),那么该地址就会失效,需要重新刷新页面获得地址,正因为如此,所以用不了迅雷,只能自己写个程序多线程一个个视频下载,每次下载前都是获得新请求到的视频地址。

基于此,在Linux下写一个bash程序,构造双重循环下载视频文件,考虑到系统自带的wget下载工具单线程太不给力,正冰简单写的这个就直接用了《Linux下多线程下载工具推荐:myget》。

程序功能如下(程序命名为zb,以下同):

  1. 先判断程序是否将下载列表跟到程序后面
  2. 将下载列表里的下载网址取出
  3. 使用curl获取页面源代码并将flv一行的数据单独导出到tmp文件,这里填出该行数据:so.addVariable('file','http://url/dl/88bd09b075a2033d8b515fae13398253/4f0fa279/1.flv');
  4. 然后将视频完整地址通过sed命令提取出来并输出到tmp2文件
  5. 调用mytget工具将tmp2中的视频地址进行多线程下载

程序使用方法:

  1. 先使用vi编辑器将待下载的网页地址写入到一个文本中(建立待下载的下载列表),一行一个目标网址(这些网址可以使用类似火车采集器这类软件先批量抓取下来),保存为list文件名
  2. 使用$./zb list 命令下载(多线程下载工具采用10线程进行下载,速度不错)
  3. 等待程序完成下载

程序代码: 

  • if [ "$1" == "" ]; then
  •     printf "need url list"
  •     exit 1
  • fi
  •  
  • for x in $(cat $1)
  • do
  •     curl $x | grep flv>tmp
  •     cat tmp  | sed "s/\(.*\),'\(.*\)'\(.*\)/\2/g">tmp2
  •         for y in $(cat tmp2)
  •         do
  •         mytget -n 10 $y
  •         done
  • done
  •  
  • rm -rf tmp*
  • rm -rf $1

Tags: wget

上一篇: Linux下使用wget工具下载整站
下一篇: 显示网站目录下所有文件的PHP程序

相关文章

发表评论