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 相关文章推荐
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
python文本数据处理学习笔记详解
Jun 17 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
Python龙贝格法求积分实例
Feb 29 Python
浅谈python3 构造函数和析构函数
Mar 12 Python
python判断正负数方式
Jun 03 Python
python实现批处理文件
Jul 28 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
分享7个 Python 实战项目练习
Mar 03 Python
详解pytorch创建tensor函数
Mar 22 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 XPath对XML文件查找及修改实现代码
2011/07/27 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
JS作用域链详解
2017/06/26 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Python eval函数原理及用法解析
2020/11/14 Python
python 写一个文件分发小程序
2020/12/05 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
期末总结的个人自我评价
2013/11/02 职场文书
企业文化宣传标语
2014/06/09 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
初中生物教学随笔
2015/08/15 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python