|
转自Ubuntu中文论坛.
自动下载百度新歌的脚本
OS:Ubuntu
必须先安装编码转换器
- sudo apt-get install recode
复制代码 /
[php]
#!/bin/bash
SOURCE="http://list.mp3.baidu.com/list/newhits.html"
SAVE="${HOME}/mp3100"
MP3LIST="${HOME}/mp3100/mp3list";
#创建下载目录
if [ ! -d "${SAVE}" ];then
mkdir -p "${SAVE}"
fi
wget -O ${SAVE}/mp3.html ${SOURCE}
#安装编码转换器
#sudo apt-get install recode
#转换网页编码
iconv -f gbk -t utf8 ${SAVE}/mp3.html |\
grep "<a href=\"http://mp3.baidu.com/m" |\
#将mp3list.txt所有开头的空格去掉
sed -e 's/ *//' |\
#将mp3list.txt所有全角空格去掉
sed -e 's/ //g' |\
#将所有的回车符去掉
sed ':a;N;$!ba;s/\n/,/g' |\
#在td>,后面加上回车符,一行表示一个mp3文件。
sed -e 's/,<td/\n<td/g' |\
sed -e 's/td>,/td>\n/g' |\
#删除<td width="30%"> <td> </td> <td...FFFFFF"> <p> </p>
sed -e 's/<td width="30%">//g' |\
sed -e 's/<td>//g' |\
sed -e 's/<\/td>//g' |\
sed -e 's/<p>//g' |\
sed -e 's/<\/p>//g' |\
sed -e 's/<td.*FFFFFF">//g' |\
#删除</a>..."_blank">
sed -e 's/<\/a>.*_blank">/-/g' |\
sed -e 's/<\/a>.*_blank>/-/g' |\
#删除&
sed -e 's/\&\;/\//g' >${SAVE}/mp3list.txt
#得到:<a href="http://mp3.baidu.com/m?tn=baidump3&ct=134217728&lm=-1&li=2&word=Baby%20Baby%20tell%20me%20%CD%F5%D0%C4%C1%E8" target="_blank">Baby ,Baby tell me-王心凌</a>
#取得行号,循环
line=$(awk 'END{print NR}' ${SAVE}/mp3list.txt)
i=1;
while((i<=line));do
mpline=`awk 'NR=='"$i"'' ${SAVE}/mp3list.txt`
url=`echo $mpline | sed -e 's/<a href="//g' | sed 's/\ target.*//g' | sed 's/"//g' | cat`
name=`echo $mpline | sed -e 's/.*_blank">//g' | sed -e 's/.*_blank>//g' | sed -e 's/<\/a>//g' |cat`
echo "开始通过 $url 下载 $name";
wget -O ${SAVE}/down.html $url
echo "获取 $name 下载列表完成。";
##### 找出有效的歌曲下载地址并根据下载文件的大小从大至少排序 ###############
#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 -i "mp3" ${SAVE}/temp.txt > ${SAVE}/down_mp3.txt
grep -i "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);
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++))
downed=0;
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++))
downed=0;
echo "[1;7m[1;41m下载 $name 成功[1;7m[00m"
done
rm ${SAVE}/mp3.html
rm ${SAVE}/mp3list.txt
rm ${SAVE}/down.html
rm ${SAVE}/down.txt
rm ${SAVE}/size.txt
rm ${SAVE}/down_size.txt
rm ${SAVE}/down_size_sort.txt
rm ${SAVE}/temp.txt
rm ${SAVE}/down_mp3.txt
rm ${SAVE}/down_wma.txt
exit 0
[/php] |
|