当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [分享]从百度下载音乐脚本
帖子发表于 : 2008-04-06 0:26 
头像

注册: 2006-09-10 8:19
帖子: 508
地址: Shanghai,China
系统: Gentoo/Mac OS X
送出感谢: 0 次
接收感谢: 0 次
参考了benqlk:http://forum.ubuntu.org.cn/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]


 


_________________
http://pjq.me


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-05-04 17:12 
头像

注册: 2008-03-19 14:20
帖子: 130
地址: 广西柳州
送出感谢: 1
接收感谢: 0 次
感谢分享


_________________
主板: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


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-05-04 18:02 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
引用:
#把中文转换成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 " " %`


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-05-04 18:07 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
另:lz不介意打个广告吧 :D
ruby写的,功能要多些
http://forum.ubuntu.org.cn/viewtopic.php?t=114149&highlight=


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-05-08 16:30 
头像

注册: 2007-11-08 21:23
帖子: 1289
地址: 中国
送出感谢: 0 次
接收感谢: 0 次
够牛B,这么长的代码,什么时候我才能写这么长的代码呀?羡慕。


_________________
这个功能如何实现?
http://yufanyufan.spaces.live.com/blog/ ... !149.entry
要实现的功能为,若当前标签页为空白页,则在当前页打开,否则新建一个标签页。


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-05-09 19:19 
头像

注册: 2006-09-10 8:19
帖子: 508
地址: Shanghai,China
系统: Gentoo/Mac OS X
送出感谢: 0 次
接收感谢: 0 次
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,其实上面那个也不是我写的,到现在还没看懂它的原理。


_________________
http://pjq.me


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-05-26 22:58 

注册: 2007-09-18 7:55
帖子: 21
送出感谢: 0 次
接收感谢: 0 次
不可以那么写的 楼上那些写就没考虑到空格情况 我一开始就是这样写的 发现会出现很多错误


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-05-26 23:08 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
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'

迄今为止没有出现任何问题。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

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


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

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

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