python中使用百度音乐搜索的api下载指定歌曲的lrc歌词


Posted in Python onJuly 18, 2014

这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀。。。。
先简单的说下吧,百度提供了一个音乐搜索的api,你想百度请求类似于

http://box.zhangmen.baidu.com/x?op=12&count=1&title=最佳损友$$陈奕迅$$$$

的地址,百度会给你返回一段xml,如下所示

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<result>
<count>1</count>
<url>
<encode>
<![CDATA[
 
http://zhangmenshiting.baidu.com/data2/music/12762845/YmRqamdua21fn6NndK6ap5WXcJlrmG1xlJhobWibmGpjk5ZtmWiZcWRjZ5lqbGyelGKWlZtubGljZ5lka2uanWSXY1qin5t1YWBmZW5ocGlhaWdnbGtqbzE$
 
]]>
</encode>
<decode>
<![CDATA[
12762845.mp3?xcode=e6b69cf593ea22ac9d2b9314e565fc0caf85125f065ce3e0&mid=0.31929107437537
]]>
</decode>
<type>8</type>
<lrcid>2829</lrcid>
<flag>1</flag>
</url>
<durl>
<encode>
<![CDATA[
 
http://zhangmenshiting2.baidu.com/data2/music/7345405/aGVnaWlmbGaeomZzrZmmnJZvmGqXbHCbl2dsZ5qXaWqSlWpsmmdrb2mXamxpbXCclGNsmW2ba25mYmxtapmZcWqTWaGemnRoX2VkbWdvaGhoZmZramluOA$$
 
]]>
</encode>
<decode>
<![CDATA[
7345405.mp3?xcode=e6b69cf593ea22ac78e1478e78479dc19e8e4650995cb99a&mid=0.31929107437537
]]>
</decode>
<type>8</type>
<lrcid>2829</lrcid>
<flag>1</flag>
</durl>
<p2p>
<hash>f98b6772aa97966550ec80617879becee0233bf4</hash>
<url>
<![CDATA[ ]]>
</url>
<type>mp3</type>
<size>3778335</size>
<bitrate>128</bitrate>
</p2p>
</result>

简单的说明下,由于我们要做的只是获取到歌曲的lrc歌词地址,所以有用的只有2829这个标签。
而encode和decode里面的拼接起来就是mp3的下载地址,如本例的

http://zhangmenshiting.baidu.com/data2/music/12762845/YmRqamdua21fn6NndK6ap5WXcJlrmG1xlJhobWibmGpjk5ZtmWiZcWRjZ5lqbGyelGKWlZtubGljZ5lka2uanWSXY1qin5t1YWBmZW5ocGlhaWdnbGtqbzE$12762845.mp3?xcode=e6b69cf593ea22ac9d2b9314e565fc0caf85125f065ce3e0&mid=0.31929107437537

就是下载地址,不过音质太差,有时间在研究下这个。
继续说歌词,注意lrcid标签里面的2829
http://box.zhangmen.baidu.com/bdlrc/ 这个是百度lrc歌词存放地址,
然后本例的歌词地址是http://box.zhangmen.baidu.com/bdlrc/28/2829.lrc
看到了吧,歌词地址后面的两个数字的计算方法是在lrcid除以100所获得的整数,就是第一个数字,然后第二个数字就是lrcid,然后后面加上后缀.lrc就搞定了
获得lrc地址之后就简单了,只要请求该地址,然后将获取到的内容写入文件就ok了。
好了,大概就是这样,下面是代码:

import os
import os.path
import re
import eyed3
import urllib2
import urllib
from urllib import urlencode
import sys
 
import os
reload(sys)
sys.setdefaultencoding('utf8')
 
music_path = r"E:\music"
lrc_path = r"e:\lrc"
 
os.remove('nolrc.txt')
os.remove('lrcxml.txt')
 
the_file = open('lrcxml.txt','a')
nolrc_file = open('nolrc.txt','a')
 
for root,dirs,files in os.walk(music_path):
 for filepath in files:
 the_path = os.path.join(root,filepath)
 if (the_path.find("mp3") != -1):
  print the_path
  the_music = eyed3.load(the_path)
  the_teg = the_music.tag._getAlbum()
  the_artist = the_music.tag._getArtist()
  the_title = the_music.tag._getTitle()
  # print the_teg
  # print the_title
  # print the_artist
  b = the_title.replace(' ','+')
  # print b
  a = the_artist.replace(' ','+')
  #print urlencode(str(b))
  if isinstance(a,unicode):
  a = a.encode('utf8')
  song_url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title="+b+"$$"+a+"$$$$ "
  
  the_file.write(song_url+'\n')
  page = urllib2.urlopen(song_url).read()
  print page
  theid = 0
  
  lrcid = re.compile('<lrcid>(.*?)</lrcid>',re.S).findall(page)
  have_lrc = True
  if lrcid != []:
  theid = lrcid[0]
   
  else:
  nolrc_file.write(the_title+'\n')
  have_lrc = False
  print theid
  
  
  if have_lrc:
  firstid = int(theid)/100
  lrcurl = "http://box.zhangmen.baidu.com/bdlrc/"+str(firstid)+"/"+theid+".lrc"
  print lrcurl
  lrc = urllib2.urlopen(lrcurl).read()
  if(lrc.find('html')== -1):
   lrcfile = open(lrc_path+"\\"+the_title+".lrc",'w')
   lrcfile.writelines(lrc)
   lrcfile.close()
  else:
   nolrc_file.write(the_title+'\n')
   
the_file.close()
nolrc_file.close()
print "end!"

有用第一步请求所获取到底是xml格式的,所以本来想着解析xml来获取lrcid,但是在实现过程中遇到了各种问题,别的还容易,就在这一块儿浪费的时间最长,纠结未果之后,只能改用正则表达式来获取了。。。只能说明还是学艺不精呢

原文:逝去日子的博客 » 使用python扫描本地音乐并下载歌词

Python 相关文章推荐
浅析python 中__name__ = '__main__' 的作用
Jul 05 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python语言的变量认识及操作方法
Feb 11 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
Python处理中文标点符号大集合
May 14 Python
对python 匹配字符串开头和结尾的方法详解
Oct 27 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
pip安装python库的方法总结
Aug 02 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
python代数式括号有效性检验示例代码
Oct 04 Python
python采集博客中上传的QQ截图文件
Jul 18 #Python
Python下singleton模式的实现方法
Jul 16 #Python
python的迭代器与生成器实例详解
Jul 16 #Python
Python的内存泄漏及gc模块的使用分析
Jul 16 #Python
Python的垃圾回收机制深入分析
Jul 16 #Python
python中将字典转换成其json字符串
Jul 16 #Python
记录Django开发心得
Jul 16 #Python
You might like
关于PHP语言构造器介绍
2013/07/08 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
php文件上传类的分享
2017/07/06 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
在视频前插入广告
2006/11/20 Javascript
拖动一个HTML元素
2006/12/22 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
Python实现对象转换为xml的方法示例
2017/06/08 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
python实现简单的学生管理系统
2021/02/22 Python
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
体育专业个人的求职信范文
2013/09/21 职场文书
暑期实习鉴定
2013/12/16 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang