自动下载百度新歌的脚本

sh/bash/dash/ksh/zsh等Shell脚本
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#16

帖子 yonsan » 2005-08-28 16:18

:o 终于发现我贴的脚本原来有个bug就是重新开始下载另一首歌时没有将loaded变量置为0. 汗 :shock:

代码: 全选

	downline_mp3=$(awk 'END{print NR}' ${SAVE}/down_mp3.txt);
	downline_wma=$(awk 'END{print NR}' ${SAVE}/down_wma.txt);
	echo "[1;6m[1;31m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。[1;6m[00m"
	echo "[1;6m[1;32m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。[1;6m[00m"
# 初始化计数器
	j=1;
# 优先下载mp3格式的歌曲
	while((j<=downline_mp3));
	do
		mp3=$(sed -n '1p' < ${SAVE}/down_mp3.txt)
		echo "[1;6m[1;31m正在下载${name}.mp3[1;6m[00m"
		wget --timeout=30 --tries=5 $mp3 -O "${SAVE}/${name}.mp3"
		if [ "$?" = 0 ]; then
			downed=1;
			break;
		else
			((j++))
			sed '1d' ${SAVE}/down_mp3.txt
		fi
	done
#如果下载成功继续下其余的歌
#continue用于跳过循环体中的后续命令
	if [ "$downed" = 1 ] ; then
		((i++))
[color=red]		downed=0;[/color]
		echo "[1;7m[1;41m下载 $name 成功[1;7m[00m"
		continue;
	fi
# 如果没有mp3格式的则下载wma格式的歌
	j=1;
	while((j<=downline_wma));
	do
		wma=$(sed -n '1p' < ${SAVE}/down_wma.txt)
		echo "[1;6m[1;32m正在下载${name}.mp3[1;6m[00m"
		wget --timeout=30 --tries=5 $wma -O "${SAVE}/${name}.wma"
		if [ "$?" = 0 ]; then
			downed=1;
			break;
		else
			((j++))
			sed '1d' ${SAVE}/down_wma.txt
		fi
	done
	((i++))
	[color=red]downed=0;[/color]
	echo "[1;7m[1;41m下载 $name 成功[1;7m[00m"
done
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#17

帖子 yonsan » 2005-08-28 21:39

oneleaf 写了:还有一个没有考虑进去,优先下载最大尺寸的歌曲链接。
呵呵,oneleaf ! 新贴上去的脚本基本上实现了这个功能。你看看!!

代码: 全选

##### 找出有效的歌曲下载地址并根据下载文件的大小从大至少排序 ###############
	#down.txt为有效的下载地址
	iconv -f gbk -t utf8 -c ${SAVE}/down.html | grep "<td height="28" class="d">" | sed -e 's/.*<a href="//g' | sed -e 's/" target=_blank>.*//g' | sed '/mid/d' > ${SAVE}/down.txt
	#size.txt为有效的下载文件大小
	iconv -f gbk -t utf8 -c ${SAVE}/down.html | grep "M<\/td>" | sed -e 's/<td class="t">//g' | sed -e 's/ M<\/td>//g' > ${SAVE}/size.txt
	#down.txt与size.txt合并而在的down_size.txt文件中字段之间以" "作为分隔符
	paste -d ' ' ${SAVE}/down.txt ${SAVE}/size.txt > ${SAVE}/down_size.txt
	#得到以下形式 (下载地址 文件大小)
	#http://wma2.7t7t.com/pycs/pycs/311/370247.Wma 1.2
	#http://snakelmq.hfxyd.com/milk/babybabytellme.mp3 3.2
	#http://bbsatt2.ccmove.com.cn/download/1280590/baby%20baby%20tell%20me%28PXC%D6%C6%D7%F7%29.mp3 0.3
	#http://vod.music165.com/music/song/new02/wxl_05.07.29/3.Wma 1.6
	#http://202.107.247.54/16/0406/94/3.wma 1.6
	sort "+1nr" ${SAVE}/down_size.txt > ${SAVE}/down_size_sort.txt
	sed 's/ .*$//' ${SAVE}/down_size_sort.txt > ${SAVE}/temp.txt
##### 析取出mp3 的下载地址或 wma的下载地址 ##############
	grep "mp3" ${SAVE}/temp.txt > ${SAVE}/down_mp3.txt
	grep "wma" ${SAVE}/temp.txt > ${SAVE}/down_wma.txt
	downline_mp3=$(awk 'END{print NR}' ${SAVE}/down_mp3.txt);
	downline_wma=$(awk 'END{print NR}' ${SAVE}/down_wma.txt);
头像
oneleaf
论坛管理员
帖子: 10455
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

#18

帖子 oneleaf » 2005-08-28 21:57

downed=0; 你可以看我修改的地方。

grep "mp3" 最好为 grep -i mp3$ 表示不分大小写匹配结尾为mp3的行。

因此最好将尺寸放到行的前面。
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#19

帖子 yonsan » 2005-08-28 22:05

oneleaf 写了:downed=0; 你可以看我修改的地方。

grep "mp3" 最好为 grep -i mp3$ 表示不分大小写匹配结尾为mp3的行。

因此最好将尺寸放到行的前面。
呵呵,我试过将尺寸放在前面的,但我在gvim的彩色显示帮助下看到出现了些额外的其它字符,所以就将改寸放到后面再进行排序方便析取出下载地址!

:o 贴一下你将尺寸放在前面的析取方法!!

谢谢你 grep "mp3" 最好为 grep -i mp3$ 表示不分大小写匹配结尾为mp3的行。的建议,已修正.
头像
oneleaf
论坛管理员
帖子: 10455
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

#20

帖子 oneleaf » 2005-08-28 22:19

看错了,不用放前面,因为你匹配前已经截掉了尺寸。呵呵。不好意思。
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
头像
oneleaf
论坛管理员
帖子: 10455
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

#21

帖子 oneleaf » 2005-08-29 13:34

测试发现:
六个月后…那年夏天-张善为.mp3 为 0 字节,
六个月后…那年夏天-张善为.wma 为 html 格式。
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
头像
oneleaf
论坛管理员
帖子: 10455
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

#22

帖子 oneleaf » 2005-08-29 13:36

What ,Can I Do-南拳妈妈 也是如此
童话生死恋-花儿乐队 也是如此
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#23

帖子 firehare » 2005-08-29 15:05

看了自动下载百度TOP100歌曲的脚本,不知有无考虑重复下载的情况?
我是这样考虑的,由于Top100是每周二更新一次,如果说我将其设成任务每周运行一次的话,是否要重复下载很多歌,脚本中是否应保存在一个现存歌曲列表文件,只保存百度Top100网页上的标题,而不是文件名,这样的话不会存在下载同一首歌的不同文件,然后就可以只下载不在该文件中的歌曲,这样下载的歌曲就不会太多,也可以称之为所谓的增量下载吧,呵呵!
另:相同的道理,在下载过程中不能中断,中断之后,就又得从头再来,毕竟这个是下100首MP3,中间被打断的几率是很高的。
我心无畏,源自于我心无知。
图片
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#24

帖子 firehare » 2005-08-29 22:46

一叶兄好快的动作呀!就已经做好了相应的改动了!佩服!!

再提一个建议:
是否可以将wget的尝试次数缩短,因为基本上一次连接不上的话,一则太慢,二则就是死链,是否可以将这些慢或死链的归在一个文件中,等全部下完之后,再做处理!
我心无畏,源自于我心无知。
图片
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#25

帖子 yonsan » 2005-08-29 23:41

(22:23:03) Blazint: 关于颜色的那个,你用echo -e , 然后 \e 代替 ^[ , 贴到论坛就不会有问题了

试验过这个方法同样有效! :o

例如:
echo "^[[1;7m^[[1;41m下载 $name 成功^[[1;7m^[[00m"
echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#26

帖子 firehare » 2005-08-30 9:49

再提一建议:
由于加入了检测功能,只要磁盘中已有的歌曲都会被PASS,以免重复下载,但如果是中途有事,用Ctrl+C中断的没下完的歌曲,在第二次脚本运行时也会被PASS掉,这样的话要每次中断之后,删除掉该歌曲,比较麻烦。能否做如下处理:在准备下载一曲歌之前先生成一个.tmp的临时文件,内存歌曲名及相应链接或者就文件名用歌曲名,内容为相应链接,如果该文件下载完成的话,就删除该文件。这样在下次脚本运行时先找一下这个有无该临时文件,打开它并将其文件名截取下来和链接都截取出来,将该歌曲先下好,然后删除掉该临时文件,再开始正常脚本。
我心无畏,源自于我心无知。
图片
Jeff W
帖子: 18
注册时间: 2005-04-22 23:27

#27

帖子 Jeff W » 2005-08-30 10:00

wget -c --tries=2 $mp3 -O "${TMP}/${name}.mp3" 那一段

改成

代码: 全选

      mp3=`awk 'NR=='"$j"'' ${TMP}/down_mp3.txt`
      echo -e "\e[1;6m\e[1;31m正在下载${name}.mp3\e[1;6m\e[00m"
      wget -c --tries=2 $mp3 -O "${TMP}/${name}.tmp"
      if [ "$?" = 0 ]; then
         if [ `file -ib "${TMP}/${name}.tmp" | sed -e 's/\/.*//g'` = "audio" ]; then
            mv "${TMP}/${name}.tmp" "${SAVE}/${name}.mp3"
            downed=1;
            break;
         else
            rm "${TMP}/${name}.tmp";
       ((j++))   
         fi
      else
         ((j++))
      fi 
wma也照做

初始化的时候删掉所有.tmp
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#28

帖子 yonsan » 2005-08-30 10:03

firehare 写了:再提一建议:
由于加入了检测功能,只要磁盘中已有的歌曲都会被PASS,以免重复下载,但如果是中途有事,用Ctrl+C中断的没下完的歌曲,在第二次脚本运行时也会被PASS掉,这样的话要每次中断之后,删除掉该歌曲,比较麻烦。能否做如下处理:在准备下载一曲歌之前先生成一个.tmp的临时文件,内存歌曲名及相应链接或者就文件名用歌曲名,内容为相应链接,如果该文件下载完成的话,就删除该文件。这样在下次脚本运行时先找一下这个有无该临时文件,打开它并将其文件名截取下来和链接都截取出来,将该歌曲先下好,然后删除掉该临时文件,再开始正常脚本。
新增功以及修改说明:

20050830
5)增加了运行脚本下载完成的歌曲列表,请查看downedlist.txt
6)下载过程可中断,下一次重新运行时会自动跳过已下载完成的歌,如果是正在下载歌曲的过程中发生中断,则自动删除上一次下载未完成的歌曲并重新从那一首歌曲开始下载。
7)修正不同类型的提示信息以不同的彩色显示

请帮忙测试........
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#29

帖子 firehare » 2005-08-30 10:21

yonsan 写了: 新增功以及修改说明:

20050830
5)增加了运行脚本下载完成的歌曲列表,请查看downedlist.txt
6)下载过程可中断,下一次重新运行时会自动跳过已下载完成的歌,如果是正在下载歌曲的过程中发生中断,则自动删除上一次下载未完成的歌曲并重新从那一首歌曲开始下载。
7)修正不同类型的提示信息以不同的彩色显示

请帮忙测试........
一叶兄的做法是先在临时文件目录下载,如果成功就移至保存目录中,否则的话,保存目录中也不会出现该文件!
而yonsan兄的做法则是增加一个downedlist.txt文件,这样的话,为什么不干脆做成可以直接用wget -c进行断点续传呢,否则的话,岂不是浪费了引入downedlist.txt的功能!呵呵!
我心无畏,源自于我心无知。
图片
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#30

帖子 yonsan » 2005-08-30 10:38

firehare 写了:
yonsan 写了: 新增功以及修改说明:

20050830
5)增加了运行脚本下载完成的歌曲列表,请查看downedlist.txt
6)下载过程可中断,下一次重新运行时会自动跳过已下载完成的歌,如果是正在下载歌曲的过程中发生中断,则自动删除上一次下载未完成的歌曲并重新从那一首歌曲开始下载。
7)修正不同类型的提示信息以不同的彩色显示

请帮忙测试........
一叶兄的做法是先在临时文件目录下载,如果成功就移至保存目录中,否则的话,保存目录中也不会出现该文件!
而yonsan兄的做法则是增加一个downedlist.txt文件,这样的话,为什么不干脆做成可以直接用wget -c进行断点续传呢,否则的话,岂不是浪费了引入downedlist.txt的功能!呵呵!
呵呵,你看看downedlist.txt记录了由于中断后又重新下载的时间及各次下载成功的mp3!
willdown.txt才是真正记录当前未下载完成的mp3的,如果中途发生中断就用它记录的歌名就可以知道哪一首歌是由于中断未完成的,先自动删了那首歌然后再运行下载程序!
回复