免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1400 | 回复: 0
打印 上一主题 下一主题

一段用SHELL编写自动下载baidu MP3的教本(转) [复制链接]

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-30 17:18 |只看该作者 |倒序浏览

               
一段用SHELL编写自动下载baidu MP3的教本(转)
       
        #!/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/${USER}"
#创建下载目录
if [ ! -d "${SAVE}" ];then
    mkdir -p "${SAVE}"
fi
#创建临时下载目录
if [ ! -d "${TMP}" ];then
    mkdir -p "${TMP}"
fi
echo "开始下载百度最新100首歌曲列表"
wget -O ${TMP}/mp3.html ${SOURCE}
echo "下载百度最新100首歌曲列表完成。"
#转换网页编码
iconv -f gbk -t utf8 ${TMP}/mp3.html |\
grep ",后面加上回车符,一行表示一个mp3文件。
sed -e 's/,,/td>\n/g' |\
#删除      
sed -e 's///g' |\
sed -e 's///g' |\
sed -e 's///g' |\
sed -e 's///g' |\
sed -e 's///g' |\
sed -e 's///g' |\
#删除..."_blank">
sed -e 's/.*_blank">/-/g' |\
sed -e 's/.*_blank>/-/g' |\
#删除&
sed -e 's/\&amp\;/\//g' >${TMP}/mp3list.txt
#
得到:Baby ,Baby tell me-王心凌
#取得行号,循环
line=$(awk 'END{print NR}' ${TMP}/mp3list.txt)
i=1;
while((i//g' | sed -e 's/.*_blank>//g' |\
        sed -e 's///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 "" |\
   sed -e 's/.*.*//g' |\
   sed '/mid/d' > ${TMP}/down.txt
   #size.txt为有效的下载文件大小
   iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M" |\
   sed -e 's///g' | sed -e 's/ M//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
            echo -e "\e[1;6m\e[1;31m下载 ${name}.mp3 文件无效,正在删除重新下载\e[1;6m\e[00m"
            rm "${TMP}/${name}.mp3";
            ((j++))   
         fi
      else
         echo -e "\e[1;6m\e[1;31m下载 ${name}.mp3 文件无效,正在删除重新下载\e[1;6m\e[00m"
         rm "${TMP}/${name}.mp3";
         ((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"'' ${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
            echo -e "\e[1;6m\e[1;31m下载 ${name}.wma 文件无效,正在删除重新下载\e[1;6m\e[00m"
            rm "${TMP}/${name}.wma";
            ((j++))   
         fi
      else
          echo -e "\e[1;6m\e[1;31m下载 ${name}.wma 文件无效,正在删除重新下载\e[1;6m\e[00m"
          rm "${TMP}/${name}.wma";
          ((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 -fr ${TMP}
exit 0
原理是用wget下载下页面来,然后用SED来提取页面,提取到连接后下载
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12859/showart_192558.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP