隨筆-109  評論-187  文章-25  trackbacks-0
          #!/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 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="http://g' | sed 's/\ target.*//g' | sed 's/"http://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="http://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

          原理是用wget下載下頁面來,然后用SED來提取頁面,提取到連接后下載

          posted on 2006-10-27 15:41 小小程序程序員混口飯吃 閱讀(1162) 評論(1)  編輯  收藏 所屬分類: java

          評論:
          # re: 一段用SHELL編寫自動下載baidu MP3的教本(轉) 2008-04-17 23:57 | zhenhui
          gfhgjyhjkkgkuoli;o.jk,  回復  更多評論
            
          主站蜘蛛池模板: 磴口县| 石嘴山市| 厦门市| 平度市| 磴口县| 乃东县| 平阴县| 樟树市| 临猗县| 锡林郭勒盟| 哈巴河县| 萨嘎县| 白水县| 贵阳市| 乳山市| 白山市| 阿拉尔市| 金沙县| 鸡泽县| 汝城县| 西乌珠穆沁旗| 耒阳市| 大城县| 余干县| 米脂县| 尚志市| 双桥区| 旬阳县| 平陆县| 禹城市| 夹江县| 温泉县| 长春市| 江阴市| 成都市| 芜湖市| 南昌市| 唐海县| 监利县| 宣恩县| 临桂县|