免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2213 | 回复: 9
打印 上一主题 下一主题

可以自动从Yahoo下载*.mp3和*.wma的shell script,另有问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-28 11:07 |只看该作者 |倒序浏览
shell script能自动从Yahoo音乐的600首热搜歌曲列表里下载Music。
本来是打算从baidu音乐搜索下载Music,但在后来分析其mp3下载页源码,才发现人家已经把页面下载地址给屏蔽了。下载页码里herf=“ ”空的,我想可能baidu是用了Javascript回传了一个链接地址,半天没想出如何得到直接下载地址的好方法,脚本就只好链接到Yahoo去了。
目前这个脚本可以正常从Yahoo下载Music(*.wma和*.mp3),自动添加歌曲名和后缀。
缺点:该脚本只是从每首歌第一个链接地址下载Music,没加入选择下载。还有下载个别歌曲地址时,有的音乐网站防盗链可能会产生一个0byte的歌曲文件。如果你有兴趣可以完善这个脚本。

HELP~!哪位朋友可以指点我下,我想知道有什么办法从baidu(比如这个地址http://220.181.38.82/m?ct=134217728&tn=baidusg,残缺的歌%20%20&word=wma,http://rs1.bn.163.com/ent/2009/05/Y2KSl5akqK2WlpibmjY$.wma,,[%B2%D0%C8%B1%B5%C4%B8%E8+%CD%F5%D0%A5%C0%A4]&si=%B2%D0%C8%B1%B5%C4%B8%E8;;%CD%F5%D0%A5%C0%A4;;0;;0&lm=16777216&sgid=1)每首歌的最后下载页面里得到音乐地址?现在的页面源码里地址是空的。

#------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#License: GPLv2

#Welcome~!
echo
cat << EOF
##########################################
#                                                                                                    #
#                    Auto-download mp3 music script v0.1                     #
#                     Music from YAHOO MP3_新歌TOP600                      #
#                             http://music.cn.yahoo.com                             #
#                             Save files:/mp3download/                              #
#                        Temporary files:/tmp/tmp_dlmp3/                       #
#                              Owner:Linux Leio - 2009                               #
#                                                                                                    #
##########################################
EOF

#需要安装编码转换器
#sudo apt-get install recode
i=1

#mp3的地址
MP3SOURCE="http://music.cn.yahoo.com/mp3list_top.php?pid=ysearch&sub1=%B8%E8%C7%FA&sub2=%C8%C8%CB%D1%B8%E8%C7%FA&origin=onesearch&source=ysmt_lbuzz_r"

#保存mp3的目录
SAVE="/mp3download"

#下载重试次数
TRYCOUNT=2
#重复链接时间
TIMEOUT=8

#临时目录
TMP="/tmp/tmp_dlmp3"

#创建下载目录
if [ ! -d "$SAVE" ];then
mkdir "$SAVE"
fi

#创临时下载目录
if [ ! -d "$TMP" ];then
mkdir "$TMP"
fi

echo "---------------------开始下载YAHOO最热600首歌曲列表------------------------"
wget -q -O ${TMP}/yahoo.html $MP3SOURCE | 1>/dev/null
echo
echo "---------------------下载YAHOO最热600首歌曲列表完成------------------------"
#转换网页编码
iconv -f gbk -t utf8 ${TMP}/yahoo.html | grep -i '<td class="z_h2".*href' >${TMP}/mp3page.html

#过滤空行和行首空格
#sed -e '/^$/d' ${TMP}/mp3page.html |\
#sed -e 's/ +//g' |\
#获取音乐URLlist
sed -e 's/"//g' ${TMP}/mp3page.html |\
sed -e 's/<\/span><\/a>//g' |\
sed -e 's/target=.*class=p20>//g' |\
sed -e 's/<td class.*href=//g' >${TMP}/mp3list.txt

echo "-----------------------------本地下载列表转换完成----------------------------"
#获得要下载歌曲的总数
line=`awk 'END {print NR}' ${TMP}/mp3list.txt`
while [ "$i" -le "$line" ] ;do
mp3access=`awk 'FNR=='"$i"'{print $0}' ${TMP}/mp3list.txt`
url=`echo "$mp3access" | cut -d" " -f1`
name=`echo "$mp3access" | cut -d" " -f2`
#echo $url
#echo $name
#break

#检查是否已经下载过这首歌,如果下载过,放弃
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
echo "链接到下载页面url"
echo
wget -q -O ${TMP}/mp3down.html $url
echo
echo "-------------------------------获得 $name 下载页面----------------------------"
#获得下载链接
sed 's/"//g' ${TMP}/mp3down.html |\
sed 's/ +//g' |\
egrep -i '<td class=m_song.*</td>' |\
sed 's/^.*href=//g' |\
sed 's/ onclick.*<\/td>$//g' >${TMP}/mp3down.txt

#获得下载文件大小和格式
iconv -t utf8 -c ${TMP}/mp3down.html |\
sed -e 's/"//g' |\
sed -e 's/   *//g' |\
grep -i '<td>.*<\/td>' |\
sed -e 's/^.*<td>//g' |\
sed -e 's/<\/td>$//g' |\
egrep '^([wm][mp][a3])|(.*M)$' >${TMP}/mp3size.txt
format=`cat ${TMP}/mp3size.txt | awk 'FNR==1 {print $1}' ${TMP}/mp3size.txt`
size=`cat ${TMP}/mp3size.txt | awk 'FNR==2 {print $1}' ${TMP}/mp3size.txt`
echo "获得音乐格式:$format"
echo "获得文件大小: $size"

#检查是否有合适的下载链接
if [ -z "$size" ]; then
echo
echo -e "\e[1;6m\e[1;31m ${name} 无合适链接,忽略,继续下一首。\e[1;6m\e[00m"
echo
((i++))
continue;
fi

#开始下载音乐
echo
echo "---------------------------获得下载链接,开始音乐下载----------------------------"
echo
link=`cat ${TMP}/mp3down.txt`
wget -q -O ${TMP}/downpage.html ${link}
iconv -f gbk -t utf8 ${TMP}/downpage.html |\
egrep -i '</b><a href=.*blank>' |\
sed 's/"//g' |\
sed 's/target=.*>//g' |\
sed 's/<b>.*href=//g' >${TMP}/downpage.txt
downpath=`awk 'FNR==1 {print $1}' ${TMP}/downpage.txt`
wget -c -t "$TRYCOUNT" -T "$TIMEOUT" -O "${SAVE}/${name}.${format}" $downpath

((i++))
echo
echo "-----------------------------下载成功,开始新下载----------------------------------"
done

#删除网页临时文件
sudo rm -f ${TMP}/*.txt ${TMP}/*.html
echo
echo "---------------------------------下载链接结束--------------------------------------"
exit 0

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2009-05-28 11:21 |只看该作者
学习!

论坛徽章:
0
3 [报告]
发表于 2009-05-28 11:44 |只看该作者
不错不错

论坛徽章:
0
4 [报告]
发表于 2009-05-28 12:57 |只看该作者
好东东

论坛徽章:
0
5 [报告]
发表于 2009-05-28 20:47 |只看该作者
难道没有高人指点下吗?

论坛徽章:
1
巨蟹座
日期:2014-06-04 13:33:30
6 [报告]
发表于 2009-05-29 01:30 |只看该作者
有人用 python写过,放狗一下

论坛徽章:
0
7 [报告]
发表于 2009-05-29 01:57 |只看该作者
无语,

虽然也可以实现,但个人觉得shell脚本的优势不在于此,

这些用java/c#去完成不是更简单方便吗?

对于某些网页中的javascripts代码,分析html源文件是处理不了的,需模拟javascripts行为。

论坛徽章:
0
8 [报告]
发表于 2009-05-29 04:08 |只看该作者
每个语言都有其局限性。
我也知道要用javascript。但在shell板块里讨论,我想知道是否shell script有合适方法可以达到同样效果?
好的讨论,我们大家都是玩这个语言技巧和解决问题方法,而不是玩语言数量,毕竟精力有限。

论坛徽章:
0
9 [报告]
发表于 2009-05-29 08:56 |只看该作者
路过,学习一下

论坛徽章:
0
10 [报告]
发表于 2009-05-29 09:53 |只看该作者
原帖由 linuxleio 于 2009-5-29 04:08 发表
每个语言都有其局限性。
我也知道要用javascript。但在shell板块里讨论,我想知道是否shell script有合适方法可以达到同样效果?
好的讨论,我们大家都是玩这个语言技巧和解决问题方法,而不是玩语言数量,毕 ...



哈哈,首先肯定下lz的钻研和学习的精神。

其实shell的功能也很强大的,
研究透awk、sed等各类命令也不是容易的事情。

本人的意思是,
如果完成相同的功能,
其实高级语言更简单,学习成本更低。

程序都是相通的,玩语言数量的人可太多了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP