新的百度mp3下载脚本
老版本在这里,由于百度改了代码,不能下载了,所以修改了下脚本.
由于这里不能传附件,只能帖上代码了…
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
#!/bin/bash #Copyright (c) 2006 bones7456 (bones7456@gmail.com) #License: GPLv2 #非常感谢ubuntu社区和oneleaf老兄 #强烈建议安装axel(多线程下载工具)和mid3v2(包含在python-mutagen里,用于修改歌曲的id3信息)#mp3的地址 SOURCE="http://list.mp3.baidu.com/list/newhits.html" #SOURCE="http://list.mp3.baidu.com/topso/mp3topsong.html" 改成这个地址可以下载歌曲top500 #保存mp3的目录 SAVE="${HOME}/baidump3" #下载重试次数 TRYCOUNT=2 #用axel下载时的线程数 AXELNUM=7 #临时目录 TMP="/tmp/baidump3-${USER}" #是否需要暂停 PAUSE=0 if [ x`which axel` = x"" ];then PAUSE=1 cat << EOF 您的系统中没有安装axel多线程下载工具,这将导致只能使用wget进行单线程下载,将会影响下载速度。 如果是ubuntu用户,可以直接使用 sudo apt-get install axel 进行安装,其他系统请访问axel主页:http://wilmer.gaast.net/main.php/axel.html 进行下载、安装。 EOF fi if [ x`which mid3v2` = x"" ];then PAUSE=1 cat << EOF 您的系统中没有安装mid3v2工具,使用该工具可以修改mp3歌曲的标签信息(如歌手、歌名等),并去掉可能包含于其中的广告信息。 如果是ubuntu用户,可以直接使用 sudo apt-get install python-mutagen 进行安装,其他系统请访问其主页:http://www.sacredchao.net/quodlibet/wiki/Development/Mutagen 进行下载、安装。 EOF fi if [ "$PAUSE" = 1 ];then echo "是否继续(y|n)?" read KEYVAR case "$KEYVAR" in "Y" | "y" ) echo 略过。 ;; * ) exit 0 ;; esac fi #创建下载目录 if [ ! -d "${SAVE}" ];then mkdir -p "${SAVE}" fi #创建临时下载目录 if [ -d "${TMP}" ];then rm -rf "${TMP}" fi mkdir -p "${TMP}" echo "开始下载百度最新100首歌曲列表" wget -O ${TMP}/mp3.html ${SOURCE} echo "下载百度最新100首歌曲列表完成。" #转换网页编码 iconv -f gbk -t utf8 ${TMP}/mp3.html |\ grep " href=\"http://mp3.baidu.com/m" |\ #将mp3list.txt所有开头的空格去掉 sed -e 's/ *//' |\ #将mp3list.txt所有开头的tab去掉 sed -e 's/\t*//' |\ #将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.*"border">//g' |\ #删除</a>..."_blank"> sed -e 's/<\/A>\/<A.*_blank>/、/g' |\ sed -e 's/<\/A>/<\/a>/g' |\ sed -e 's/<\/a>.*_blank>/-/g' |\ #sed -e 's/<\/a>.*_blank">/-/g' |\ #删除) sed -e 's/<\/a>)/<\/a>/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/<\/b>//g' |sed -e 's/<b>//g' |\ sed -e 's/<\/a>//g' | sed -e 's/\//-/g' | sed -e 's/:/-/g' | sed -e 's/"/'\''/g' | cat` title=`echo $name | sed -e 's/-.*//g'` #检查是否已经下载过这首歌,如果下载过,放弃 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 "onclick=\"return ow(event,this)\"" |\ sed -e 's/.*<a href="//g' | sed -e 's/" target="_blank".*//g' > ${TMP}/down.txt #size.txt为有效的下载文件大小 iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M<\/td>" |\ sed -e 's/<td>//g' | sed -e 's/ M<\/td>//g' > ${TMP}/size.txt #down.txt与size.txt合并而在的down_size.txt文件中字段之间以"`"作为分隔符 paste -d '`' ${TMP}/size.txt ${TMP}/down.txt > ${TMP}/down_size.txt #排序 sort -n -r ${TMP}/down_size.txt > ${TMP}/down_size_sort.txt #去掉后面的尺寸 sed 's/.*`//' ${TMP}/down_size_sort.txt > ${TMP}/temp.txt ##### 析取出mp3 的下载地址或 wma的下载地址 ############## grep -i "word=mp3" ${TMP}/temp.txt | grep "$title" > ${TMP}/down_mp3.txt grep -i "word=wma" ${TMP}/temp.txt | grep "$title" > ${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 | sed -e 's/ /\\ /g'` echo -e "\e[1;6m\e[1;31m正在下载${name}.mp3\e[1;6m\e[00m" #echo -e "\e[1;6m\e[1;31m中转页面地址为${mp3}\e[1;6m\e[00m" wget -O "${TMP}/transit.html" "$mp3" realURL=`iconv -f gbk -t utf8 -c ${TMP}/transit.html | grep "<li class=\"li\" style=\"margin-right:10px;\">" | sed 's/.*href="//' | sed 's/" target="_blank">.*//'` #echo -e "\e[1;6m\e[1;31m真实下载地址为${realURL}\e[1;6m\e[00m" if [ x`which axel` != x"" ];then axel -n $AXELNUM -a -o "${TMP}/${name}.mp3" "${realURL}" else #wget太慢了。但是如果没有安装axel,可以把上面一行注释掉,用下面一行代替 wget -c --tries=$TRYCOUNT $realURL -O "${TMP}/${name}.mp3" fi if [ "$?" = 0 ]; then if [ `file -ib "${TMP}/${name}.mp3" | sed -e 's/\/.*//g'` = "audio" ]; then if [ x`which mid3v2` != x"" ];then title=`echo $name | sed -e 's/-.*//g'` artist=`echo $name | sed -e 's/.*-//g' | sed -e 's/.mp3//g' | sed -e 's/.wma//g'` mid3v2 -D "${TMP}/${name}.mp3" mid3v2 -t "${title}" -a "${artist}" "${TMP}/${name}.mp3" fi 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" #echo -e "\e[1;6m\e[1;31m中转页面地址为${mp3}\e[1;6m\e[00m" wget -O "${TMP}/transit.html" "$wma" realURL=`iconv -f gbk -t utf8 -c ${TMP}/transit.html | grep "<li class=\"li\" style=\"margin-right:10px;\">" | sed 's/.*href="//' | sed 's/" target="_blank">.*//'` #echo -e "\e[1;6m\e[1;31m真实下载地址为${realURL}\e[1;6m\e[00m" if [ x`which axel` != x"" ];then axel -n $AXELNUM -a -o "${TMP}/${name}.wma" "${realURL}" else #wget太慢了。但是如果没有安装axel,可以把上面一行注释掉,用下面一行代替 wget -c --tries=$TRYCOUNT $realURL -O "${TMP}/${name}.wma" fi if [ "$?" = 0 ]; then if [ `file -ib "${TMP}/${name}.wma" | sed -e 's/\/.*//g'` = "application" ]; then #title=`echo $name | sed -e 's/-.*//g'` #artist=`echo $name | sed -e 's/.*-//g' | sed -e 's/.mp3//g' | sed -e 's/.wma//g'` #mid3v2 -D "${TMP}/${name}.wma" #mid3v2 -t "${title}" -a "${artist}" "${TMP}/${name}.wma" 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 |
tenfar 在 2008年05月09日 22:07 说:【 】
直接复制粘贴不行~全角和半角的问题~呵呵,学习了。谢谢
bones7456 在 2008年05月10日 23:02 说:【 】
呵呵,是的,这个blog会自动把半角的转换成全角呢….没办法了.