设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 发行版讨论区 —— LinuxSir.cn
›
Ubuntu Linux 专题讨论
›
Ubuntu下自动下载百度新歌100的脚本。
返回列表
查看:
3430
|
回复:
6
Ubuntu下自动下载百度新歌100的脚本。
[复制链接]
qazwer
qazwer
当前离线
积分
561
IP卡
狗仔卡
发表于 2005-8-28 09:38:32
|
显示全部楼层
|
阅读模式
http://forum.ubuntu.org.cn/viewtopic.php?p=13552#13552
#!/bin/bash
#Copyright (c) 2005 ubuntu.org.cn
#License: GPLv2
#需要安装编码转换器
#sudo apt-get install recode
#mp3的地址
SOURCE="http://list.mp3.baidu.com/list/newhits.html"
#保存mp3的目录
SAVE="${HOME}/mp3100"
#下载重试次数
TRYCOUNT=2
#临时目录
TMP="/tmp"
#创建下载目录
if [ ! -d "${SAVE}" ];then
mkdir -p "${SAVE}"
fi
echo "开始下载百度最新100首歌曲列表"
wget -O ${TMP}/mp3.html ${SOURCE}
echo "下载百度最新100首歌曲列表完成。"
#转换网页编码
iconv -f gbk -t utf8 ${TMP}/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' >${TMP}/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}' ${TMP}/mp3list.txt)
i=1;
while((i<=line));do
downed=0;
mpline=`awk 'NR=='"$i"'' ${TMP}/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' | sed -e 's/\//-/g' | sed -e 's/:/-/g' | sed -e 's/"/\'/g' | cat`
#检查是否已经下载过这首歌,如果下载过,放弃
if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ]; then
echo -e "\e[1;6m\e[1;31m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m"
((i++))
continue;
fi
echo "开始通过 $url 下载 $name";
wget -O ${TMP}/down.html $url
echo "获取 $name 下载列表完成。";
##### 找出有效的歌曲下载地址并根据下载文件的大小从大至少排序 ###############
#down.txt为有效的下载地址
iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "<td height="28" class="d">" |\
sed -e 's/.*<a href="//g' | sed -e 's/" target=_blank>.*//g' |\
sed '/mid/d' > ${TMP}/down.txt
#size.txt为有效的下载文件大小
iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M<\/td>" |\
sed -e 's/<td class="t">//g' | sed -e 's/ M<\/td>//g' > ${TMP}/size.txt
#down.txt与size.txt合并而在的down_size.txt文件中字段之间以" "作为分隔符
paste -d ' ' ${TMP}/down.txt ${TMP}/size.txt > ${TMP}/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" ${TMP}/down_size.txt > ${TMP}/down_size_sort.txt
#去掉后面的尺寸
sed 's/ .*$//' ${TMP}/down_size_sort.txt > ${TMP}/temp.txt
##### 析取出mp3 的下载地址或 wma的下载地址 ##############
grep -i "mp3$" ${TMP}/temp.txt > ${TMP}/down_mp3.txt
grep -i "wma$" ${TMP}/temp.txt > ${TMP}/down_wma.txt
downline_mp3=$(awk 'END{print NR}' ${TMP}/down_mp3.txt);
downline_wma=$(awk 'END{print NR}' ${TMP}/down_wma.txt);
echo -e "\e[1;6m\e[1;31m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。\e[1;6m\e[00m"
echo -e "\e[1;6m\e[1;31m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。\e[1;6m\e[00m"
# 初始化计数器
j=1;
# 优先下载mp3格式的歌曲
while((j<=downline_mp3)); do
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=$TRYCOUNT $mp3 -O "${TMP}/${name}.mp3"
if [ "$?" = 0 ]; then
if [ `file -ib "${TMP}/${name}.mp3" | sed -e 's/\/.*//g'` = "audio" ]; then
mv "${TMP}/${name}.mp3" "${SAVE}/${name}.mp3"
downed=1;
break;
else
rm "${TMP}/${name}.mp3";
((j++))
fi
else
((j++))
fi
done
#如果下载成功继续下其余的歌
#continue用于跳过循环体中的后续命令
if [ "$downed" = 1 ] ; then
((i++))
echo "[1;7m[1;41m下载 $name 成功[1;7m[00m"
continue;
fi
# 如果没有mp3格式的则下载wma格式的歌
j=1;
while((j<=downline_wma)); do
wma=`awk 'NR=='"$j"'' ${TMP}/down_wma.txt`
echo -e "\e[1;6m\e[1;31m正在下载${name}.wma\e[1;6m\e[00m"
wget -c --tries=$TRYCOUNT $wma -O "${TMP}/${name}.wma"
if [ "$?" = 0 ]; then
if [ `file -ib "${TMP}/${name}.wma" | sed -e 's/\/.*//g'` = "application" ]; then
mv "${TMP}/${name}.wma" "${SAVE}/${name}.wma"
downed=1;
break;
else
rm "${TMP}/${name}.wma";
((j++))
fi
else
((j++))
fi
done
((i++))
if [ "$downed" = 1 ] ; then
echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
else
echo -e "\e[1;7m\e[1;41m下载 $name 失败\e[1;7m\e[00m"
fi
done
rm ${TMP}/mp3.html
rm ${TMP}/mp3list.txt
rm ${TMP}/down.html
rm ${TMP}/down.txt
rm ${TMP}/size.txt
rm ${TMP}/down_size.txt
rm ${TMP}/down_size_sort.txt
rm ${TMP}/temp.txt
rm ${TMP}/down_mp3.txt
rm ${TMP}/down_wma.txt
exit 0
复制代码
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
jnow
jnow
当前离线
积分
259
IP卡
狗仔卡
发表于 2005-9-3 13:15:56
|
显示全部楼层
这是改进过的代码,上面的代码还有些问题
比如用到的 Escape sequences
代码有点不对
#!/bin/bash
#Copyright (c) 2005 ubuntu.org.cn
#License: GPLv2
#需要安装编码转换器
#sudo apt-get install recode
#mp3的地址
SOURCE="http://list.mp3.baidu.com/list/newhits.html";
#保存mp3的目录
SAVE="${HOME}/mp3100";
#下载重试次数
TRYCOUNT=2;
#创建下载目录
if [ ! -d "${SAVE}" ];then
mkdir -p "${SAVE}";
fi
#******************************************************************************
#FIXME: 增加自动删由于意外中断而未下载完的歌曲功能
#TODO : 每次下载歌曲前将要下载的歌名保存到willdown.txt中,
# 如果正常运行的话willdown.txt只会在循环中被不断更新而不会返回到这执行。
# 但如果发生了中断,则willdown.txt记录的是最后一个正在下载的歌名,
# 重新运行时就会根据这个记录的名删除未下载完的歌。
#******************************************************************************
badsong=$(tail -1 ${SAVE}/willdown.txt);
if [ -e "${SAVE}/${badsong}.mp3" ] || [ -e "${SAVE}/${badsong}.wma" ];
then
echo -e "\e[1;6m\e[1;31m发现由于上次意外中断而导致未下载完成的 ${badsong} 歌曲,正在删除...\e[1;6m\e[00m";
rm -Rfv "${SAVE}/${badsong}.mp3";
rm -Rfv "${SAVE}/${badsong}.wma";
fi
echo "开始下载百度最新100首歌曲列表";
wget -O ${SAVE}/mp3.html ${SOURCE};
echo "下载百度最新100首歌曲列表完成。";
#转换网页编码
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
downed=0;
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' | sed -e 's/\//-/g' | sed -e 's/:/-/g' | cat);
echo "${name}" > ${SAVE}/willdown.txt;
#检查是否已经下载过这首歌,如果下载过,放弃
if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ];
then
echo -e "\e[1;6m\e[1;35m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m";
((i++));
continue;
fi
echo "开始通过 $url 下载 $name";
wget -O ${SAVE}/down.html "$url";
echo "获取 $name 下载列表完成。";
#找出有效的歌曲下载地址并根据下载文件的大小从大至少排序
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;
#排序
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 -e "\e[1;6m\e[1;32m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。\e[1;6m\e[00m";
echo -e "\e[1;6m\e[1;32m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。\e[1;6m\e[00m";
#初始化计数器
j=1;
#优先下载mp3格式的歌曲
while((j<=downline_mp3));
do
mp3=$(awk 'NR=='"$j"'' ${SAVE}/down_mp3.txt);
echo -e "\e[1;6m\e[1;33m正在下载${name}.mp3\e[1;6m\e[00m";
wget -c --tries=${TRYCOUNT} $mp3 -O "${SAVE}/${name}.mp3";
if [ "$?" = 0 ];
then
if [ $(file -ib "${SAVE}/${name}.mp3" | sed -e 's/\/.*//g') = "audio" ];
then
downed=1;
break;
else
rm -Rfv "${SAVE}/${name}.mp3";
((j++));
fi
else
((j++));
fi
done
#如果下载成功继续下其余的歌,continue用于跳过循环体中的后续命令
if [ "$downed" = 1 ];
then
((i++));
echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m";
continue;
fi
#如果没有mp3格式的则下载wma格式的歌
j=1;
while((j<=downline_wma));
do
wma=$(awk 'NR=='"$j"'' ${SAVE}/down_wma.txt);
echo -e "\e[1;6m\e[1;31m正在下载${name}.wma\e[1;6m\e[00m";
wget -c --tries=${TRYCOUNT} $wma -O "${SAVE}/${name}.wma";
if [ "$?" = 0 ];
then
if [ $(file -ib "${SAVE}/${name}.wma" | sed -e 's/\/.*//g') = "application" ];
then
downed=1;
break;
else
rm -Rfv "${SAVE}/${name}.wma";
((j++));
fi
else
((j++));
fi
done
((i++));
if [ "$downed" = 1 ] ;
then
echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
else
echo -e "\e[1;7m\e[1;41m下载 $name 失败\e[1;7m\e[00m"
fi
done
rm -Rfv "${SAVE}/*.html";
rm -Rfv "${SAVE}/*.txt";
exit 0
复制代码
回复
支持
反对
使用道具
举报
显身卡
hgkrt
hgkrt
当前离线
积分
1615
IP卡
狗仔卡
发表于 2005-9-3 14:51:51
|
显示全部楼层
有什么比较好的提议??
或者应用...
最近Java用的多..想用Java实现...
回复
支持
反对
使用道具
举报
显身卡
qazwer
qazwer
当前离线
积分
561
IP卡
狗仔卡
楼主
|
发表于 2005-9-3 15:48:15
|
显示全部楼层
将歌词下载下来。同时作个播放的程序,并自动看歌词。
回复
支持
反对
使用道具
举报
显身卡
qazwer
qazwer
当前离线
积分
561
IP卡
狗仔卡
楼主
|
发表于 2005-9-3 15:49:41
|
显示全部楼层
另外,二楼的关于中途断线的问题,顶楼通过临时文件夹的方式解决,呵呵效果都一样。
回复
支持
反对
使用道具
举报
显身卡
jcmkk
jcmkk
当前离线
积分
9
IP卡
狗仔卡
发表于 2005-9-20 00:36:53
|
显示全部楼层
试一下:
http://www.superbloger.com/user1/87/archives/2005/371.html#416
回复
支持
反对
使用道具
举报
显身卡
spadgelee
spadgelee
当前离线
积分
3
IP卡
狗仔卡
发表于 2008-11-28 00:40:50
|
显示全部楼层
谢谢,这个很有用。
如果有歌曲重复的话,是否会取消下载重复的歌曲呢?
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表