LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3430|回复: 6

Ubuntu下自动下载百度新歌100的脚本。

[复制链接]
发表于 2005-8-28 09:38:32 | 显示全部楼层 |阅读模式
http://forum.ubuntu.org.cn/viewtopic.php?p=13552#13552


  1. #!/bin/bash
  2. #Copyright (c) 2005 ubuntu.org.cn
  3. #License: GPLv2

  4. #需要安装编码转换器
  5. #sudo apt-get install recode

  6. #mp3的地址
  7. SOURCE="http://list.mp3.baidu.com/list/newhits.html"

  8. #保存mp3的目录
  9. SAVE="${HOME}/mp3100"

  10. #下载重试次数
  11. TRYCOUNT=2

  12. #临时目录
  13. TMP="/tmp"

  14. #创建下载目录
  15. if [ ! -d "${SAVE}" ];then
  16.     mkdir -p "${SAVE}"
  17. fi

  18. echo "开始下载百度最新100首歌曲列表"
  19. wget -O ${TMP}/mp3.html ${SOURCE}
  20. echo "下载百度最新100首歌曲列表完成。"

  21. #转换网页编码
  22. iconv -f gbk -t utf8 ${TMP}/mp3.html |\

  23. grep "<a href="http://mp3.baidu.com/m" |\

  24. #将mp3list.txt所有开头的空格去掉
  25. sed -e 's/ *//' |\

  26. #将mp3list.txt所有全角空格去掉
  27. sed -e 's/ //g' |\

  28. #将所有的回车符去掉
  29. sed ':a;N;$!ba;s/\n/,/g' |\

  30. #在td>,后面加上回车符,一行表示一个mp3文件。
  31. sed -e 's/,<td/\n<td/g' |\
  32. sed -e 's/td>,/td>\n/g' |\

  33. #删除<td width="30%"> <td> </td> <td...FFFFFF"> <p> </p>
  34. sed -e 's/<td width="30%">//g' |\
  35. sed -e 's/<td>//g' |\
  36. sed -e 's/<\/td>//g' |\
  37. sed -e 's/<p>//g' |\
  38. sed -e 's/<\/p>//g' |\
  39. sed -e 's/<td.*FFFFFF">//g' |\

  40. #删除</a>..."_blank">
  41. sed -e 's/<\/a>.*_blank">/-/g' |\
  42. sed -e 's/<\/a>.*_blank>/-/g' |\

  43. #删除&amp;
  44. sed -e 's/\&amp\;/\//g' >${TMP}/mp3list.txt

  45. #得到:<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>

  46. #取得行号,循环
  47. line=$(awk 'END{print NR}' ${TMP}/mp3list.txt)
  48. i=1;
  49. while((i<=line));do
  50.    downed=0;
  51.    mpline=`awk 'NR=='"$i"'' ${TMP}/mp3list.txt`
  52.    url=`echo $mpline | sed -e 's/<a href="//g' | sed 's/\ target.*//g' | sed 's/"//g' | cat`
  53.    name=`echo $mpline | sed -e 's/.*_blank">//g' | sed -e 's/.*_blank>//g' |\
  54.         sed -e 's/<\/a>//g' | sed -e 's/\//-/g' | sed -e 's/:/-/g'  | sed -e 's/"/\'/g'  | cat`

  55.    #检查是否已经下载过这首歌,如果下载过,放弃
  56.    if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ]; then
  57.       echo -e "\e[1;6m\e[1;31m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m"
  58.       ((i++))
  59.       continue;
  60.    fi

  61.    echo "开始通过 $url 下载 $name";
  62.    wget -O ${TMP}/down.html $url
  63.    echo "获取 $name 下载列表完成。";

  64.    ##### 找出有效的歌曲下载地址并根据下载文件的大小从大至少排序 ###############
  65.    #down.txt为有效的下载地址
  66.    iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "<td height="28" class="d">" |\
  67.    sed -e 's/.*<a href="//g' | sed -e 's/" target=_blank>.*//g' |\
  68.    sed '/mid/d' > ${TMP}/down.txt

  69.    #size.txt为有效的下载文件大小
  70.    iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M<\/td>" |\
  71.    sed -e 's/<td class="t">//g' | sed -e 's/ M<\/td>//g' > ${TMP}/size.txt

  72.    #down.txt与size.txt合并而在的down_size.txt文件中字段之间以" "作为分隔符
  73.    paste -d ' ' ${TMP}/down.txt ${TMP}/size.txt > ${TMP}/down_size.txt

  74.    #得到以下形式 (下载地址 文件大小)
  75.    #http://wma2.7t7t.com/pycs/pycs/311/370247.Wma 1.2
  76.    #http://snakelmq.hfxyd.com/milk/babybabytellme.mp3 3.2
  77.    #http://bbsatt2.ccmove.com.cn/download/1280590/baby%20baby%20tell%20me%28PXC%D6%C6%D7%F7%29.mp3 0.3
  78.    #http://vod.music165.com/music/song/new02/wxl_05.07.29/3.Wma 1.6
  79.    #http://202.107.247.54/16/0406/94/3.wma 1.6

  80.    #排序
  81.    sort "+1nr" ${TMP}/down_size.txt > ${TMP}/down_size_sort.txt

  82.    #去掉后面的尺寸
  83.    sed 's/ .*$//' ${TMP}/down_size_sort.txt > ${TMP}/temp.txt
  84.    
  85.    ##### 析取出mp3 的下载地址或 wma的下载地址 ##############
  86.    grep -i "mp3$" ${TMP}/temp.txt > ${TMP}/down_mp3.txt
  87.    grep -i "wma$" ${TMP}/temp.txt > ${TMP}/down_wma.txt

  88.    downline_mp3=$(awk 'END{print NR}' ${TMP}/down_mp3.txt);
  89.    downline_wma=$(awk 'END{print NR}' ${TMP}/down_wma.txt);
  90.    echo -e "\e[1;6m\e[1;31m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。\e[1;6m\e[00m"
  91.    echo -e "\e[1;6m\e[1;31m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。\e[1;6m\e[00m"
  92.    # 初始化计数器
  93.    j=1;
  94.    # 优先下载mp3格式的歌曲
  95.    while((j<=downline_mp3)); do
  96.       mp3=`awk 'NR=='"$j"'' ${TMP}/down_mp3.txt`
  97.       echo -e "\e[1;6m\e[1;31m正在下载${name}.mp3\e[1;6m\e[00m"
  98.       wget -c --tries=$TRYCOUNT $mp3 -O "${TMP}/${name}.mp3"
  99.       if [ "$?" = 0 ]; then
  100.          if [ `file -ib "${TMP}/${name}.mp3" | sed -e 's/\/.*//g'` = "audio" ]; then
  101.             mv "${TMP}/${name}.mp3" "${SAVE}/${name}.mp3"
  102.             downed=1;
  103.             break;
  104.          else
  105.             rm "${TMP}/${name}.mp3";
  106.        ((j++))   
  107.          fi
  108.       else
  109.          ((j++))
  110.       fi
  111.    done

  112.    #如果下载成功继续下其余的歌
  113.    #continue用于跳过循环体中的后续命令
  114.    if [ "$downed" = 1 ] ; then
  115.       ((i++))
  116.       echo "下载 $name 成功"
  117.       continue;
  118.    fi

  119.    # 如果没有mp3格式的则下载wma格式的歌
  120.    j=1;
  121.    while((j<=downline_wma)); do
  122.       wma=`awk 'NR=='"$j"'' ${TMP}/down_wma.txt`
  123.       echo -e "\e[1;6m\e[1;31m正在下载${name}.wma\e[1;6m\e[00m"
  124.       wget -c --tries=$TRYCOUNT $wma -O "${TMP}/${name}.wma"
  125.       if [ "$?" = 0 ]; then
  126.          if [ `file -ib "${TMP}/${name}.wma" | sed -e 's/\/.*//g'` = "application" ]; then
  127.             mv "${TMP}/${name}.wma" "${SAVE}/${name}.wma"
  128.             downed=1;
  129.             break;
  130.          else
  131.             rm "${TMP}/${name}.wma";
  132.        ((j++))   
  133.          fi
  134.       else
  135.          ((j++))
  136.       fi
  137.    done

  138.    ((i++))
  139.    if [ "$downed" = 1 ] ; then
  140.       echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
  141.    else
  142.       echo -e "\e[1;7m\e[1;41m下载 $name 失败\e[1;7m\e[00m"
  143.    fi
  144. done
  145. rm ${TMP}/mp3.html
  146. rm ${TMP}/mp3list.txt
  147. rm ${TMP}/down.html
  148. rm ${TMP}/down.txt
  149. rm ${TMP}/size.txt
  150. rm ${TMP}/down_size.txt
  151. rm ${TMP}/down_size_sort.txt
  152. rm ${TMP}/temp.txt
  153. rm ${TMP}/down_mp3.txt
  154. rm ${TMP}/down_wma.txt
  155. exit 0
复制代码
发表于 2005-9-3 13:15:56 | 显示全部楼层
这是改进过的代码,上面的代码还有些问题
比如用到的 Escape sequences
代码有点不对

  1. #!/bin/bash
  2. #Copyright (c) 2005 ubuntu.org.cn
  3. #License: GPLv2

  4. #需要安装编码转换器
  5. #sudo apt-get install recode

  6. #mp3的地址
  7. SOURCE="http://list.mp3.baidu.com/list/newhits.html";
  8. #保存mp3的目录
  9. SAVE="${HOME}/mp3100";
  10. #下载重试次数
  11. TRYCOUNT=2;
  12. #创建下载目录
  13. if [ ! -d "${SAVE}" ];then
  14.     mkdir -p "${SAVE}";
  15. fi
  16. #******************************************************************************
  17. #FIXME: 增加自动删由于意外中断而未下载完的歌曲功能
  18. #TODO : 每次下载歌曲前将要下载的歌名保存到willdown.txt中,
  19. #       如果正常运行的话willdown.txt只会在循环中被不断更新而不会返回到这执行。
  20. #       但如果发生了中断,则willdown.txt记录的是最后一个正在下载的歌名,
  21. #       重新运行时就会根据这个记录的名删除未下载完的歌。
  22. #******************************************************************************
  23. badsong=$(tail -1 ${SAVE}/willdown.txt);
  24. if [ -e "${SAVE}/${badsong}.mp3" ] || [ -e "${SAVE}/${badsong}.wma" ];
  25. then
  26.    echo -e "\e[1;6m\e[1;31m发现由于上次意外中断而导致未下载完成的 ${badsong} 歌曲,正在删除...\e[1;6m\e[00m";
  27.    rm -Rfv "${SAVE}/${badsong}.mp3";
  28.    rm -Rfv "${SAVE}/${badsong}.wma";
  29. fi
  30. echo "开始下载百度最新100首歌曲列表";
  31. wget -O ${SAVE}/mp3.html ${SOURCE};
  32. echo "下载百度最新100首歌曲列表完成。";
  33. #转换网页编码
  34. iconv -f gbk -t utf8 ${SAVE}/mp3.html | grep "<a href="http://mp3.baidu.com/m" |\
  35. #将mp3list.txt所有开头的空格去掉
  36. sed -e 's/ *//' |\
  37. #将mp3list.txt所有全角空格去掉
  38. sed -e 's/ //g' |\
  39. #将所有的回车符去掉
  40. sed ':a;N;$!ba;s/\n/,/g' |\
  41. #在td>,后面加上回车符,一行表示一个mp3文件。
  42. sed -e 's/,<td/\n<td/g' | sed -e 's/td>,/td>\n/g' |\
  43. #删除<td width="30%"> <td> </td> <td...FFFFFF"> <p> </p>
  44. sed -e 's/<td width="30%">//g' | sed -e 's/<td>//g' | sed -e 's/<\/td>//g' |\
  45. sed -e 's/<p>//g' | sed -e 's/<\/p>//g' | sed -e 's/<td.*FFFFFF">//g' |\
  46. #删除</a>..."_blank">
  47. sed -e 's/<\/a>.*_blank">/-/g' | sed -e 's/<\/a>.*_blank>/-/g' |\
  48. #删除&amp;
  49. sed -e 's/\&amp\;/\//g' > ${SAVE}/mp3list.txt;
  50. #得到:<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>
  51. #取得行号,循环
  52. line=$(awk 'END{print NR}' ${SAVE}/mp3list.txt);
  53. i=1;
  54. while((i<=line));
  55. do
  56.    downed=0;
  57.    mpline=$(awk 'NR=='"$i"'' ${SAVE}/mp3list.txt);
  58.    url=$(echo $mpline | sed -e 's/<a href="//g' | sed 's/\ target.*//g' | sed 's/"//g' | cat);
  59.    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);
  60.    echo "${name}" > ${SAVE}/willdown.txt;
  61. #检查是否已经下载过这首歌,如果下载过,放弃
  62.    if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ];
  63.    then
  64.       echo -e "\e[1;6m\e[1;35m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m";
  65.       ((i++));
  66.       continue;
  67.    fi
  68.    echo "开始通过 $url 下载 $name";
  69.    wget -O ${SAVE}/down.html "$url";
  70.    echo "获取 $name 下载列表完成。";
  71. #找出有效的歌曲下载地址并根据下载文件的大小从大至少排序
  72.    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;
  73. #size.txt为有效的下载文件大小
  74.    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;
  75. #down.txt与size.txt合并而在的down_size.txt文件中字段之间以" "作为分隔符
  76.    paste -d ' ' ${SAVE}/down.txt ${SAVE}/size.txt > ${SAVE}/down_size.txt;
  77. #排序
  78.    sort "+1nr" ${SAVE}/down_size.txt > ${SAVE}/down_size_sort.txt;
  79. #去掉后面的尺寸
  80.    sed 's/ .*$//' ${SAVE}/down_size_sort.txt > ${SAVE}/temp.txt;
  81. #析取出mp3 的下载地址或 wma的下载地址
  82.    grep -i "mp3$" ${SAVE}/temp.txt > ${SAVE}/down_mp3.txt;
  83.    grep -i "wma$" ${SAVE}/temp.txt > ${SAVE}/down_wma.txt;
  84.    downline_mp3=$(awk 'END{print NR}' ${SAVE}/down_mp3.txt);
  85.    downline_wma=$(awk 'END{print NR}' ${SAVE}/down_wma.txt);
  86.    echo -e "\e[1;6m\e[1;32m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。\e[1;6m\e[00m";
  87.    echo -e "\e[1;6m\e[1;32m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。\e[1;6m\e[00m";
  88. #初始化计数器
  89.    j=1;
  90. #优先下载mp3格式的歌曲
  91.    while((j<=downline_mp3));
  92.    do
  93.       mp3=$(awk 'NR=='"$j"'' ${SAVE}/down_mp3.txt);
  94.       echo -e "\e[1;6m\e[1;33m正在下载${name}.mp3\e[1;6m\e[00m";
  95.       wget -c --tries=${TRYCOUNT} $mp3 -O "${SAVE}/${name}.mp3";
  96.       if [ "$?" = 0 ];
  97.       then
  98.          if [ $(file -ib "${SAVE}/${name}.mp3" | sed -e 's/\/.*//g') = "audio" ];
  99.          then
  100.             downed=1;
  101.             break;
  102.          else
  103.             rm -Rfv "${SAVE}/${name}.mp3";
  104.             ((j++));
  105.          fi
  106.          else
  107.          ((j++));
  108.          fi
  109.    done
  110. #如果下载成功继续下其余的歌,continue用于跳过循环体中的后续命令
  111.    if [ "$downed" = 1 ];
  112.    then
  113.       ((i++));
  114.       echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m";
  115.       continue;
  116.    fi
  117. #如果没有mp3格式的则下载wma格式的歌
  118.    j=1;
  119.    while((j<=downline_wma));
  120.    do
  121.       wma=$(awk 'NR=='"$j"'' ${SAVE}/down_wma.txt);
  122.       echo -e "\e[1;6m\e[1;31m正在下载${name}.wma\e[1;6m\e[00m";
  123.       wget -c --tries=${TRYCOUNT} $wma -O "${SAVE}/${name}.wma";
  124.       if [ "$?" = 0 ];
  125.       then
  126.          if [ $(file -ib "${SAVE}/${name}.wma" | sed -e 's/\/.*//g') = "application" ];
  127.          then
  128.          downed=1;
  129.          break;
  130.       else
  131.          rm -Rfv "${SAVE}/${name}.wma";
  132.          ((j++));
  133.       fi
  134.       else
  135.          ((j++));
  136.       fi
  137.    done
  138.    ((i++));
  139.    if [ "$downed" = 1 ] ;
  140.    then
  141.       echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
  142.    else
  143.       echo -e "\e[1;7m\e[1;41m下载 $name 失败\e[1;7m\e[00m"
  144.    fi
  145. done
  146. rm -Rfv "${SAVE}/*.html";
  147. rm -Rfv "${SAVE}/*.txt";
  148. exit 0
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-9-3 14:51:51 | 显示全部楼层
有什么比较好的提议??

或者应用...

最近Java用的多..想用Java实现...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-3 15:48:15 | 显示全部楼层
将歌词下载下来。同时作个播放的程序,并自动看歌词。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-3 15:49:41 | 显示全部楼层
另外,二楼的关于中途断线的问题,顶楼通过临时文件夹的方式解决,呵呵效果都一样。
回复 支持 反对

使用道具 举报

发表于 2005-9-20 00:36:53 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2008-11-28 00:40:50 | 显示全部楼层
谢谢,这个很有用。
如果有歌曲重复的话,是否会取消下载重复的歌曲呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表