2017-11-19 2 views
0

lastfm apiから特定の国のトップアーティストを募集しています。イムで成功を収めてartists{}に各アーティストの名前や店舗を取得:last.fmのトップアルバムを取得する

import requests 

api_key = "0929f1144e531702a5563c887cbbade0" 

ID = 0 
artists = {} 

for i in range(1, 3): 

    artists_response = requests.get('http://ws.audioscrobbler.com/2.0/?method=geo.gettopartists&country=spain&format=json&page=' + str(i) + '&api_key=' + api_key) 
    artists_data = artists_response.json() 

    for artist in artists_data["topartists"]["artist"]: 

     name = artist["name"] 

     artists[ID] = {} 
     artists[ID]['ID'] = ID 
     artists[ID]['name'] = name 
     ID += 1 

しかし、今各アーティストのために私はalbums{},アーティスト名、アーティストID、名前でTOP5アルバムや店舗を取得したいですアルバム、アルバムのURLが表示されます。

"Artist": "U2", "ID": 175, "ArtistID": 10, "Title": Achtung Baby", 
"Image": "https://lastfm-img2.akamaized.net/i/u/174s/a482040d21924ddacd5fe75dedbb1ef2.png"}, 
"URL": "https://www.last.fm/music/U2/Achtung+Baby"}, "487": {"Date": "2004-01-01" 

"Artist": "U2", "ID": 176, "ArtistID": 10, "Description": "None", "Title": "Boy", 


... and then the same for the other 3 albums of the top5 

Imは、以下のコードでこれを行うが、そのが正しく動作しません:

は、各アーティストの例えば、私はこのようなTOP5アルバムの各アルバムのために一つのレコードを取得したいです。 artistIdは常に「0」と表示され、最初のアーティストの5つのアルバムのみが表示されます。問題はどこにあるのか知っていますか?

albums = {} 

for i,v in artists.items(): 
    chosen = artists[i]['name'].replace(" ", "+") 
    topalbums_response = requests.get('http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&format=json&artist=' + chosen + '&api_key=' + api_key + '&limit=5') 
    albums_data = topalbums_response.json() 

    for album in albums_data['topalbums']['album']: 

     name = album["name"] 
     url = album["url"] 

     albums[ID] = {} 
     albums[ID]['ID'] = ID 
     albums[ID]['artist'] = artists[i]['name'] 
     albums[ID]['artistID'] = artists[i]['ID'] 
     albums[ID]['name'] = name 
     albums[ID]['url'] = url 

     for image in album['image']: 
      if (image["size"] == "large"): 
       if (image["size"] is not None): 
        image = image["#text"] 
        albums[ID]['image'] = image 

     ID += 1 

     print(albums) 

答えて

0

次のように開始するには、アルバムのループを変更してみてください:

for _, v in artists.items(): 
    chosen = v['name'].replace(" ", "+") 

はまた、私はあなたが芸術家の開始時にID = 0を割り当てるが、アルバムの中でそれを参照している気づき、あなたが望むかもしれませんそれを見る。

==== 編集:私はあなたがそれが不完全で取得したいどのような形式の本当にわからないが、

次のコードは、私のために動作します。

import requests 

api_key = "0929f1144e531702a5563c887cbbade0" 

artists_url = (
    'http://ws.audioscrobbler.com/2.0/?method=geo.gettopartists' 
    '&country=spain&format=json&page={}&api_key={}' 
) 

artists = [] 

for page in range(1, 3): 
    artists_data = requests.get(artists_url.format(str(page), api_key)).json() 
    for ID, artist in enumerate(artists_data["topartists"]["artist"]): 
     artists.append((ID, artist["name"])) 


albums = {} 
albums_url = (
    'http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums' 
    '&format=json&artist={}&api_key={}&limit=5' 
) 


for ID, artist in artists[:3]: ### LIMITED to first three artists for testing. 
    print('\n------\n{} {}'.format(ID, artist)) 
    chosen = artist.replace(" ", "+") 
    albums_data = requests.get(albums_url.format(chosen, api_key)).json() 

    for album in albums_data['topalbums']['album']: 

     name = album["name"] 
     url = album["url"] 
     print('{}\n{}'.format(name, url)) 
     print(album) 
     print() 
#  albums[ID] = {} 
#  albums[ID]['ID'] = ID 
#  albums[ID]['artist'] = artists[i]['name'] 
#  albums[ID]['artistID'] = artists[i]['ID'] 
#  albums[ID]['name'] = name 
#  albums[ID]['url'] = url 
# 
#  for image in album['image']: 
#   if (image["size"] == "large"): 
#    if (image["size"] is not None): 
#     image = image["#text"] 
#     albums[ID]['image'] = image 
# 
#  ID += 1 
# 
#  print(albums) 
#  print() 
+0

ありがとうございますが、動作しません。アーティストIDが表示されますが、アーティストに関連付けられているように見えるアルバムは、他のアーティストのものでも、すべての結果を返さないアルバム、ただ1つです。 – OzzyW

+0

は、アーティストがループする前にIDを開始しているが、アルバムのループの前ではないという事実に関する回答を編集に追加しました。 –

+0

"albuns = {}"の前に "ID = 0"を追加しましたが、同じ問題が発生します。 – OzzyW

関連する問題