[分享]从百度下载音乐脚本

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
percy
帖子: 508
注册时间: 2006-09-10 8:19
系统: Gentoo/Mac OS X
来自: Shanghai,China
送出感谢: 0
接收感谢: 0
联系:

[分享]从百度下载音乐脚本

#1

帖子 percy » 2008-04-06 0:26

参考了benqlk:viewtopic.php?t=95073

本着学习shell的原则,参考benqlk那个脚本,分析了下载歌曲的原理,重新写了一个,但和他的基本功能是一样的,只是有些提取命令照自己的想法写了,增加了歌手一列,不当之处还请指正

代码: 全选

#!/bin/sh
#downmusic.sh
###Copyright (c) 2008  percy (pengjianqing@sina.com)
# Distributed under the terms of the GNU General Public License v3
#Ctreated date:2008年 04月 06日 星期日 00:15:05 CST
#参考了benqlk:http://forum.ubuntu.org.cn/viewtopic.php?t=95073

read -p "请输入要下载歌曲的名字:" musicname

if [ -d ~/Music ];then
echo "下载的音乐将会保存到 ~/Music 文件夹下"
else
echo "~/Music 文件夹不存在 脚本将会自动创建"
mkdir ~/Music
fi 

#把中文转换成16进制数字和字母不变 
a=`echo "$musicname" | iconv -c -f utf-8 -t gb2312 | LANG=C sed 's/./&\n/g' | sed -n '$!l' |
while read str;do
str=${str%$}
if [ ${#str} -eq 3 ];then
printf "%%%X" "0${str}"
elif [ "X${str}" == "X" ];then
echo -n '%20'
else
echo -n $str
fi
done
echo`

wget "http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word="$a"&lm=-1" -O source_baidu              #获得搜索页面
iconv -c -f gb2312 -t utf8 source_baidu > source_utf8  

let m=20                     #提取出有效下载链接个数
grep -m $m "M</td>" source_utf8|cut -d "<" -f2|cut -d ">" -f2 > music_size                  #得到文件大小
#grep -m $m "M</td>" source_utf8 |cut -b5-10|sed 's/<//g' > music_size                    #得到文件大小
grep -m $m  "<td class=d><a href=" source_utf8|awk -F"&word" '{print $1}'|cut -d "," -f2> music_info                 #得到歌曲名信息
grep -m $m  "[wm][mp][a3]</td>" source_utf8|cut -d "<" -f2|cut -d ">" -f2  > music_type               #得到歌曲格式
grep -m $m  "http://mp3.baidu.com/singerlist/" source_utf8 |cut -d ">" -f3|cut -d "<" -f1 > singername                   #得到歌手名字
cat music_size>all
cat music_info>>all
cat music_type>>all
cat singername>>all
awk '{a[NR]=$0}END{for(i=1;i<=NR/4;i++)printf "(%d)\t%s\t%s\t%s\t%s\n",i,a[i],a[i+40],a[i+60],a[i+20]}' all >sum      #将信息打印成整齐列表
cat sum
read -p "请选择你要下载第几首:" c         #输入下载歌曲序号
                
let line=`grep  -n "class=tdn>$c</td>" source_utf8|cut -d ":"  -f1`       #获得源文件中歌曲代号所在的行数
let line=$line+1         #获得歌曲链接所在的行数,从源文件中可以看到歌曲代号所在的下一行就是歌曲的链接
head -n $line source_utf8 |tail -n 1 >url1                 #取得真实链接存在的网页地址
cat url1 |awk -F"href=\"" '{print $2}'>url2                 #取得真实链接存在的网页地址
u=`cat url2`
wget -O true_source "$u"                                        #取得真实链接存在的网页
iconv -c  -f gb2312 -t utf8 true_source >true_source_utf8         #转换编码
url=`grep ":<a href=" true_source_utf8 |awk -F"\">" '{print $1}'|awk -F"=\"" '{print $2}'`       #获取真实链接
echo $url
t=`echo $url|awk -F"." '{print $NF}'`
name=`grep "($c)" sum|awk -F'\t' '{print $5}'`          
singer=`grep "($c)" sum|awk -F'\t' '{print $4}'`
echo "$t"
wget  -t 5 -cS  "$url"   -O  ~/Music/"${singer}-${name}.$t"            #下载音乐 

rm source*  url*  true*  music_*  all sum
运行效果

代码: 全选

 ./downmusic.sh 
下载的音乐将会保存到 ~/Music 文件夹下
请输入要下载歌曲的名字:同一首歌
--01:30:54--  http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word=%CD%AC%D2%BB%CA%D7%B8%E8&lm=-1
           => `source_baidu'
正在解析主机 mp3.baidu.com... 211.94.144.102
Connecting to mp3.baidu.com|211.94.144.102|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:未指定 [text/html]

    [ <=>                                                  ] 71,591        --.--K/s             

01:30:54 (493.38 KB/s) - `source_baidu' saved [71591]

(1)	3.4 M	mp3	蔡国庆	北京的桥
(2)	0.4 M	mp3	蔡国庆	同一首歌难忘旋律四
(3)	5.5 M	mp3	毛阿敏	同一首歌
(4)	3.4 M	mp3	蔡国庆	北京的桥
(5)	3.4 M	wma	蔡国庆	北京的桥
(6)	1.0 M	mp3	毛阿敏	同一首歌
(7)	3.4 M	mp3	蔡国庆	北京的桥
(8)	4.0 M	wma	毛阿敏	同一首歌
(9)	1.4 M	wma	群星	同一首歌
(10)	0.7 M	wma	毛阿敏	同一首歌
(11)	2.1 M	mp3	毛阿敏	同一首歌
(12)	5.5 M	mp3	毛阿敏	同一首歌
(13)	5.5 M	wma	毛阿敏	同一首歌
(14)	1.4 M	mp3	毛阿敏	同一首歌
(15)	5.5 M	mp3	蔡国庆	同一首歌
(16)	3.4 M	mp3	蔡国庆	北京的桥
(17)	4.1 M	mp3	刘畅	同一首歌
(18)	4.2 M	mp3	毛阿敏	同一首歌
(19)	5.5 M	wma	毛阿敏	同一首歌
(20)	0.9 M	mp3	毛阿敏	同一首歌
请选择你要下载第几首:2
--01:31:03--  http://220.181.38.82/m?ct=134217728&tn=baidusg,%E5%90%8C%E4%B8%80%E9%A6%96%E6%AD%8C%20%20%E9%9A%BE%E5%BF%98%E6%97%8B%E5%BE%8B%20%E5%9B%9B&word=rm,http://www.bondsun.com/mp3/~t4F7~8N7yAx.rm,,[%CD%AC%D2%BB%CA%D7%B8%E8]&si=%CD%AC%D2%BB%CA%D7%B8%E8;;%B2%CC%B9%FA%C7%EC;;238460;;238460&lm=16777216%22%20title=%22%E8%AF%B7%E7%82%B9%E5%87%BB%E5%B7%A6%E9%94%AE%EF%BC%81%E6%9D%A5%E6%BA%90%E7%BD%91%E5%9D%80%EF%BC%9A%20%20http://www.bondsun.com%20%20%20%E8%AF%B7%E5%8F%82%E7%85%A7%E7%99%BE%E5%BA%A6%E6%9D%83%E5%88%A9%E5%A3%B0%E6%98%8E%E4%BD%BF%E7%94%A8%22%20onclick=%22return%20ow(event,this)%22%20%20target=%22_blank%22%3E%3Cfont%20style=color:
           => `true_source'
Connecting to 220.181.38.82:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
Cookie coming from 220.181.38.82 attempted to set domain to baidu.com
长度:未指定 [text/html]

    [ <=>                                                  ] 2,229         --.--K/s             

01:31:03 (2.80 MB/s) - `true_source' saved [2229]

http://www.bondsun.com/mp3/同一首歌.rm
rm
--01:31:03--  http://www.bondsun.com/mp3/%E5%90%8C%E4%B8%80%E9%A6%96%E6%AD%8C.rm
           => `/home/pjq/Music/蔡国庆-同一首歌难忘旋律四.rm'
正在解析主机 www.bondsun.com... 61.155.8.155
Connecting to www.bondsun.com|61.155.8.155|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 
  HTTP/1.1 200 OK
  Connection: keep-alive
  Date: Sat, 05 Apr 2008 17:33:22 GMT
  Content-Length: 448283
  Content-Type: application/vnd.rn-realmedia
  Last-Modified: Sat, 06 Jan 2007 15:44:43 GMT
  Accept-Ranges: bytes
  ETag: "c13c295a931c71:592b"
  Server: Microsoft-IIS/6.0
  X-Powered-By: ASP.NET
长度:448,283 (438K) [application/vnd.rn-realmedia]

100%[=====================================================>] 448,283       96.86K/s    ETA 00:00

01:31:07 (96.82 KB/s) - `/home/pjq/Music/蔡国庆-同一首歌难忘旋律四.rm' saved [448283/448283]


 
头像
fengjie
帖子: 130
注册时间: 2008-03-19 14:20
来自: 广西柳州
送出感谢: 1 次
接收感谢: 0

#2

帖子 fengjie » 2008-05-04 17:12

感谢分享
主板:ASUS P8Z77-V
CPU:Intel 酷睿i3 3200
内存:ADTA DDRⅢ 1600 8G
显卡:Intel® HD Graphic
声卡:Realtek ALC 892
有线网卡:Intel® 82579V
无线网卡:Qualcomm Atheros AR9485
硬盘:WDC WD6401AALS
电源:长城ATX-350SD静音大师
显示器:Samsung S24A350H
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#3

帖子 xiooli » 2008-05-04 18:02

#把中文转换成16进制数字和字母不变
a=`echo "$musicname" | iconv -c -f utf-8 -t gb2312 | LANG=C sed 's/./&\n/g' | sed -n '$!l' |
while read str;do
str=${str%$}
if [ ${#str} -eq 3 ];then
printf "%%%X" "0${str}"
elif [ "X${str}" == "X" ];then
echo -n '%20'
else
echo -n $str
fi
done
echo`
其实这一大堆可以只用以下一句命令解决:

代码: 全选

a=`echo "$musicname" | od -t x1 -A n |tr " " %`
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#4

帖子 xiooli » 2008-05-04 18:07

另:lz不介意打个广告吧 :D
ruby写的,功能要多些
viewtopic.php?t=114149&highlight=
头像
ssfjhh
帖子: 1289
注册时间: 2007-11-08 21:23
来自: 中国
送出感谢: 0
接收感谢: 0

#5

帖子 ssfjhh » 2008-05-08 16:30

够牛B,这么长的代码,什么时候我才能写这么长的代码呀?羡慕。
这个功能如何实现?
http://yufanyufan.spaces.live.com/blog/ ... !149.entry
要实现的功能为,若当前标签页为空白页,则在当前页打开,否则新建一个标签页。
头像
percy
帖子: 508
注册时间: 2006-09-10 8:19
系统: Gentoo/Mac OS X
来自: Shanghai,China
送出感谢: 0
接收感谢: 0
联系:

#6

帖子 percy » 2008-05-09 19:19

xiooli 写了:
#把中文转换成16进制数字和字母不变
a=`echo "$musicname" | iconv -c -f utf-8 -t gb2312 | LANG=C sed 's/./&\n/g' | sed -n '$!l' |
while read str;do
str=${str%$}
if [ ${#str} -eq 3 ];then
printf "%%%X" "0${str}"
elif [ "X${str}" == "X" ];then
echo -n '%20'
else
echo -n $str
fi
done
echo`
其实这一大堆可以只用以下一句命令解决:

代码: 全选

a=`echo "$musicname" | od -t x1 -A n |tr " " %`

这个NB,其实上面那个也不是我写的,到现在还没看懂它的原理。
benqlk
帖子: 21
注册时间: 2007-09-18 7:55
送出感谢: 0
接收感谢: 0

#7

帖子 benqlk » 2008-05-26 22:58

不可以那么写的 楼上那些写就没考虑到空格情况 我一开始就是这样写的 发现会出现很多错误
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#8

帖子 xiooli » 2008-05-26 23:08

benqlk 写了:不可以那么写的 楼上那些写就没考虑到空格情况 我一开始就是这样写的 发现会出现很多错误

代码: 全选

xiooli@XIOOLI:~/桌面$ echo "汉字 语句" | od -t x1 -A n |tr " " %
%e6%b1%89%e5%ad%97%20%e8%af%ad%e5%8f%a5%0a
没问题啊,不过由于od每行只能显示16组,所以太长以后就会换行,这个以前倒是没考虑到,现在我用的是

代码: 全选

echo "汉字语句" | od -t x1 -A n |tr "\n" " " |tr " " % |sed 's/%%/%/g'
迄今为止没有出现任何问题。
回复

回到 “Shell脚本”