2014-08-31 58 views
2

这里是我的代码:试图调用last.fm REST API的track.getSimilar,在python无法理解的响应

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打印回复时,我无法理解回复。

+0

有一个python lastfm客户端:['pylast'](https://github.com/pylast/pylast)。您可以使用它而不是重新发明轮子。 – alecxe 2014-08-31 00:42:51

+0

当然,谢谢我阅读有关它。我是Python新手,想了解如何使用这些基础知识以及为什么对上述调用的响应不符合预期的格式。任何在这个方向的指针将非常感谢! – Abc 2014-08-31 00:53:05

回答

4

您正在尝试拨打文档URL;返回的页面解释了如何使用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 introduction

的API根URL位于http://ws.audioscrobbler.com/2.0/

REST requests documentation

一般而言,您将发送一个表示为'package.method'的方法参数以及特定于方法的参数给根URL。下面的参数是必需的所有呼叫:

API_KEY:一个Last.fm API密钥。
方法:以package.method表示的API方法,对应于记录的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 module代替:

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