最近正好用到,记录一下。本文为一个流程,通过歌曲名,来下载歌曲以及歌词。
如果你用Python等进行数据采集,记得添加User-Agent,不然它会返回错误:Cheater。
搜索歌曲获取ID
URL:http://music.163.com/api/search/pc
提交方式:POST
参数
s:歌曲名
offset:偏移量
limit:获取歌曲数
type:类型(歌曲:1、专辑:10、歌手:100、歌单:1000、用户:1002、mv:1004)
例如,通过歌曲名抓取歌曲信息。
POST http://music.163.com/api/search/pc
BODY s:PAPISM offset:0 limit:1 type:1
返回JSON:
{
"result": {
"songs": [{
"name": "PAPISM",
"id": 34367845,
"artists": [{
"name": "小澤亜李",
"id": 999479,
"picId": 0,
"img1v1Id": 0,
"briefDesc": "",
"picUrl": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
"img1v1Url": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
"albumSize": 0,
"alias": [],
"trans": "",
"musicSize": 0
}],
"album": {
"name": "モンスター娘のいる日常 キャラクターソング Vol.2",
"id": 3279418,
"type": "EP/Single",
"size": 5,
"picId": 7987951978099954,
"blurPicUrl": "http://p1.music.126.net/SAsjIzWilXO4S2HWBGrfVw==/7987951978099954.jpg",
"companyId": 0,
"pic": 7987951978099954,
"picUrl": "http://p1.music.126.net/SAsjIzWilXO4S2HWBGrfVw==/7987951978099954.jpg"
},
"mvid": 0,
"rtype": 0,
"rurl": null,
"mp3Url": "http://m2.music.126.net/cl94aFtBzASxULxpDyv00Q==/7962663210671608.mp3"
}],
"songCount": 3
},
"code": 200
}
其中name是歌曲名,id是歌曲名对应的网易云音乐ID,http://music.163.com/#/song?id=34367845,可以直接访问听歌。
artists是歌手们的信息,id对应歌手id,picUrl是歌手头像图。
album是唱片信息,name是唱片名,blurPicUrl是唱片封面图,url后面添加?param=130y130参数可以获取130x130尺寸的图片,修改数字也可获取其他尺寸。
songs内最后一个字段存放了歌曲url,但是现在已经失效,不过现在还有其他很方便就能获取的办法。
通过这个API能获得歌曲ID,唱片图,唱片名,歌手和歌曲信息。
通过歌曲ID下载歌曲
通过这个的链接可以直接下载歌曲:
http://music.163.com/song/media/outer/url?id=34367845.mp3
此URL的HTTP头里添加了location跳转,会直接跳转到下载链接,链接不是固定的,获取方法也很简单,以Python为例:
import requests
url = 'http://music.163.com/song/media/outer/urlid=34367845.mp3'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36'}
location = requests.head(url, headers, allow_redirects=False).headers['location']
print location
执行后会输出下载链接,不过要注意的是,如果你使用国外的服务器,或身处国外,location会返回http://music.163.com/404,建议使用国内服务器,或者修改服务器hosts,或者使用国内服务器转发。
这个hosts目前还可正常使用。
158.69.209.100 music.163.com
14.215.100.225 m1.music.126.net
14.215.100.225 m2.music.126.net
14.215.100.225 m3.music.126.net
14.215.100.225 m4.music.126.net
14.215.100.225 m5.music.126.net
14.215.100.225 m6.music.126.net
14.215.100.225 m7.music.126.net
14.215.100.225 m8.music.126.net
14.215.100.225 m9.music.126.net
14.215.100.225 m10.music.126.net
linux的hosts文件在etc/hosts里,修改后重启networking服务即可生效。
通过歌曲ID下载歌词
URL:http://music.163.com/api/song/media
提交方式:GET
参数:id
例如,通过歌曲ID获取歌词json:
http://music.163.com/api/song/media?id=34367845
返回结果:
{
"songStatus": 0,
"lyricVersion": 2,
"lyric": "[by:上划解锁]\n[ti:PAPISM]\r\n[ar:パピ(CV:小澤亜李)]……省略",
"code": 200
}
lyricVersion是歌词版本号,lyric就是歌词了。如果歌曲没有歌词的话,也就没有lyric字段。
获取lyric字段内容,存储为.lrc文件即可,以python为例:
import urllib2
import requests
import json
import codecs
lrc_url = 'http://music.163.com/api/song/media?id=34367845'
lrc_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
lrc_req = urllib2.Request(url=lrc_url, headers=lrc_headers)
# 获取页面内容
html = urllib2.urlopen(lrc_req).read()
# 转为json
lrc_json_dict = json.loads(html)
# 如果有lyric字段,保存为.lrc文件
if 'lyric' in lrc_json_dict:
file = codecs.open('/lrc_save_file/34367845.lrc', 'w', 'utf-8')
file.write(lrc_json_dict['lyric'])
file.close()
这样,通过一个歌曲名,获得歌曲ID,我们就可以得到歌曲的详细信息、下载歌曲、下载歌词、下载封面。
注意:本文仅供学习交流使用。
佬!之前爬了很多歌曲,也有歌曲id。但是现在急需这个歌曲的歌手(或者歌手id),这在lyric里面也没有,请教一下怎么办【急急急】
嗯...歌曲的图片是...总是指向默认图片的url...请问该怎么办呢?
這怎麼辦啊
{"code":-462,"data":{"actionCode":"1055401","verifyType":50,"verifyId":1008601,"verifyUrl":"","blockText":"绑定手机后,可进行下一步操作哦~","verifyToken":null,"btnText":"","orpheusUrl":"","frontRuleIds":[1055401],"params":{"event_id":"00270371329597075532","sign":""},"url":null},"message":"请绑定手机后再试哦~"} - Server - Script:8
想在Roblox實現動態歌詞
把浏览器访问成功的cookie放到请求头里。。。
返回值是这个怎么办{"code":-460,"message":"网络太拥挤,请稍候再试!"}
部分下载链接还是报这个啊:https://music.163.com/#/404,不在国外啊
已经两年啦,如果部分接口不好用 估计就是失效了。可以看看这个API的源码,找找最新的接口:https://github.com/metowolf/Meting
加你好友啦
按照post参数写得,但是好像显示请求参数错误,能教一下吗?
(╯°A°)╯︵○○○
请求了一下直接被标记作弊了Σ(っ °Д °;)っ
{u'msg': u'Cheating', u'code': -460}
请求的时候在header里添加个chrome的User-Agent:
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36
点赞!!!
哈哈哈哈这是我看过最简单的网易云api 点个赞