在Python中尝试调用last.fm Rest api的track.getSimilar,无法理解响应

2 投票
1 回答
1198 浏览
提问于 2025-04-19 00:58

这是我的代码:

import requests
r = requests.get('http://www.last.fm/api/show/track.getSimilar', params = {
"track": "Believe",
"artist": "Cher",
"limit": "5",
"api_key":"#my_api_key"})

r.status_code 返回 200,这表示调用成功。不过,当我尝试使用 r.text 打印响应时,我无法理解这个响应。

1 个回答

4

你正在尝试访问文档网址;返回的页面是关于如何使用这个API的说明,而不是实际的API方法。你需要调用实际的API,地址是:

http://ws.audioscrobbler.com/2.0/

并且把方法作为一个参数传入:

params = {
    "method": "track.getSimilar",
    "track": "Believe",
    "artist": "Cher",
    "limit": "5",
    "api_key":"#my_api_key"
}
r = request.get('http://ws.audioscrobbler.com/2.0/', params=params)

可以查看API介绍

API的根网址在http://ws.audioscrobbler.com/2.0/

还有REST请求文档

一般来说,你需要把方法参数写成'package.method',并且和特定的方法参数一起发送到根网址。所有调用都需要以下参数:

api_key : 一个Last.fm的API密钥。
method : 一个API方法,以package.method的形式表示,对应于文档中列出的Last.fm API方法名称。

示例:

>>> import requests
>>> params = {
...     "method": "track.getSimilar",
...     "track": "Believe",
...     "artist": "Cher",
...     "limit": "5",
...     'api_key': '#a valid api key#',
... }
>>> r = requests.get('http://ws.audioscrobbler.com/2.0/', params=params)
>>> r
<Response [200]>
>>> r.headers['content-type']
'text/xml; charset=utf-8;'
>>> r.content.splitlines()[1:3]
['<lfm status="ok">', '<similartracks track="Believe" artist="Cher">']

如果你使用requests库,设置format参数为json可能会更简单:

>>> params['format']= 'json'
>>> r = requests.get('http://ws.audioscrobbler.com/2.0/', params=params)
>>> r.json()['similartracks']['@attr']
{u'track': u'Believe', u'artist': u'Cher'}

不过,与其重新发明轮子,不如直接使用pyLast模块

import pylast
from itertools import islice


last = pylast.LastFMNetwork(api_key="#your_api_key", api_secret="#your_api_secret")
track = last.get_track('Cher', 'Believe')
for similar in islice(track.get_similar(), 5):
    # limited to the first 5 similar tracks
    print similar.item

撰写回答