当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 79 篇帖子 ]  前往页数 1, 2, 3, 4, 5, 6  下一页
作者 内容
1 楼 
 文章标题 : 自动下载百度新歌的脚本
帖子发表于 : 2005-08-27 16:24 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
修改TEMP路径支持多人同时下载:

代码:
#!/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 "<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' |\

#删除&amp;
sed -e 's/\&amp\;/\//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
            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


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


最后由 oneleaf 编辑于 2005-09-18 1:12,总共编辑了 35 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2005-08-28 0:53 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
后缀名不一定是mp3阿,我还在考虑优先下载mp3,其次是wma ,最后轮询可以下载成功的地址。并且需要检查是否成功。


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


最后由 oneleaf 编辑于 2005-08-28 0:57,总共编辑了 1 次

页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2005-08-28 0:57 
头像

注册: 2005-07-01 18:56
帖子: 887
地址: 广州市
送出感谢: 0 次
接收感谢: 3
代码:
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' | [color=red]sed  -n '/mp3$/p' | sort -u[/color] > ${SAVE}/down.txt

我修改过你这一句的。 所以下载的都是mp3的链接!
所以后缀名肯定是.mp3的!


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2005-08-28 0:59 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
呵呵,不好意思没有看到。
这样只需要修改一下保存目录就好了。不要放到根目录,放到 $SAVE 目录 同时最后删除那些临时文件


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:06 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
获取 金鱼-张瑶 下载列表完成。
有 0 个下载地址。
下载 金鱼-张瑶 结束

呵呵,有时不一定存在mp3的。


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:11 
头像

注册: 2005-07-01 18:56
帖子: 887
地址: 广州市
送出感谢: 0 次
接收感谢: 3
:o 有时一首歌多达15个有效链接,如果都检测下载的话太花间了,我打算只截取前5个mp3地址!这样可以快点!

呵呵,我现在的目标是先完善mp3的下载!其它歌格式的脚本编程完善要跟着一叶学习!!
边学边用!


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:18 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
不要这样处理
直接使用
代码:
  wget --timeout=30 -c $mp3 -O "${name}.mp3"
  if [ "$?" = 0 ] ; break;
  ((j++))


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:29 
头像

注册: 2005-07-01 18:56
帖子: 887
地址: 广州市
送出感谢: 0 次
接收感谢: 3
:o 呵呵,正需要这个功能!

代码:
    echo "==================================================================="
    echo "正在下载${name}.mp3"
    echo "==================================================================="
    wget --timeout=30 -c $mp3 -O "${name}.mp3"
[color=red]    if [ "$?" = 0 ]; then
    break;
    fi[/color]
    ((j++))
    sed '1d' ${SAVE}/down.txt
   done
   echo "下载 $name 结束"


现在下载快多了!


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:39 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
我又写了一些,你看看?还没有测试。


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:45 
头像

注册: 2005-07-01 18:56
帖子: 887
地址: 广州市
送出感谢: 0 次
接收感谢: 3
代码:
#优先下载mp3
   cat  ${SAVE}/down.txt | grep -i mp3$ >${SAVE}/downmp3.txt
   downline=$(awk 'END{print NR}' ${SAVE}/downmp3.txt);
   echo "有 ${downline} 个 mp3 下载地址。"
   j=1;
   while((j<=downline));do
     mp3=`awk 'NR=='"$j"'' ${SAVE}/downmp3.txt`
     echo "======================"
     echo "正在下载${name}.mp3"
     echo "===============--======"
     wget --timeout=30 -c $mp3 -O "${SAVE}/${name}.mp3"     
     #尝试下载,不行就下载下一个。
     if [ "$?" = 0 ] ;
        break;
     fi
 [color=red]    ((i++))[/color]
   done

为什么不是 ((j++))呢?


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:46 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
手误,写错了,你发前我刚检查一遍完。if 后面也经常忘记加 then,java习惯了,有时习惯都是{}. :)


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2005-08-28 1:57 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
刚刚又改了,注意啊,
我忘记打开测试的 #wget -O ${SAVE}/down.html $url

现在基本对了。


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2005-08-28 2:00 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
还有一个没有考虑进去,优先下载最大尺寸的歌曲链接。


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2005-08-28 9:45 
头像

注册: 2005-07-01 18:56
帖子: 887
地址: 广州市
送出感谢: 0 次
接收感谢: 3
oneleaf, 发现还一个不足的地方就是当同一首歌的所有下载地址都无效时,wget依然生成一个大小为0k的${name}.mp3之类的文件名。 如何修改wget参数防止这种情况?


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2005-08-28 9:59 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10116
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 128
我用我写的那个脚本没有这个现象发生。


_________________
当净其意如虚空,远离妄想及诸取,令心所向皆无碍


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 79 篇帖子 ]  前往页数 1, 2, 3, 4, 5, 6  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译