在Pandas数据框迭代和执行Spotify API时遇到麻烦



正在做一个项目,在几周内刮掉公告牌前100名,使用Spotify的API查找歌曲音频功能,并将信息保存在新的pandas文件中。

我得到了这个工作最多100搜索一次(spotify api只允许100个id),但我有麻烦编写代码通过歌曲id迭代100一次,运行api,并保存到一个新的df。

下面是一次搜索100个id的工作代码:

df_import = pd.read_csv(r'xxx/Billboard_Top_100.csv')
track_id_list = []
artist_name_list = []
track_name_list = []
for item, row in df_import.head(100).iterrows():

artist  = row['Artist']
track = row['Song']
try:
spotify_response = sp.search(q='artist:' + artist + ' track:' + track, type='track')

#artist name
artist_name = spotify_response['tracks']['items'][0]['artists'][0]['name']

#song name
track_name = spotify_response['tracks']['items'][0]['name']

#unique sportify track id used for audio feautre search
track_id = spotify_response['tracks']['items'][0]['uri']

#splits string to search for features
track_id_split = str.split(track_id, 'spotify:track:')

track_id_list.append(track_id_split[1])

artist_name_list.append(row['Artist'])

track_name_list.append(row['Song'])

except:

DNF_song_search = sp.search(q=track)
artist_name = DNF_song_search['tracks']['items'][0]['artists'][0]['name']

if search(artist_name, artist):

#song name
track_name = DNF_song_search['tracks']['items'][0]['name']

#unique sportify track id used for audio feautre search
track_id = DNF_song_search['tracks']['items'][0]['uri']

#splits string to search for features
track_id_split = str.split(track_id, 'spotify:track:')

track_id_list.append(track_id_split[1])

artist_name_list.append(row['Artist'])

track_name_list.append(row['Song'])

else:
print('Inconsistent artist match on: ' + artist + ' ' + artist_name + ' for song ' + track)

#spotify api to save song features based on track ids
features = sp.audio_features(track_id_list)            
#save features list into pandas df            
features_df = pd.DataFrame(data = features)      
#add artist and song columns from imported billboard df
features_df['Artist'] = artist_name_list
features_df['Song'] = track_name_list
#combine the two dataframes
df_merged = pd.merge(df_import, features_df, on = 'Song', how = 'left')
df_merged.to_csv('merged.csv')

我试过将所有的歌曲id保存到一个列表中,然后一次执行api 100个id,但是当我试图保存到一个新的数据帧时,我得到了各种错误。

我自己解决了

track_id_list = []
artist_name_list = []
track_name_list = []
for n in range(len(df_import) // 100):
for r in range(99):
artist = df_import.iloc[r+(n*100),3]
track = df_import.iloc[r+(n*100),4]

try:
spotify_response = sp.search(q='artist:' + artist + ' track:' + track, type='track')           
artist_name = spotify_response['tracks']['items'][0]['artists'][0]['name']
track_name = spotify_response['tracks']['items'][0]['name']
#unique spotify track id used for audio feature search
track_id = spotify_response['tracks']['items'][0]['uri']           
#splits string to search for features
track_id_split = str.split(track_id, 'spotify:track:')
track_id_list.append(track_id_split[1])          
artist_name_list.append(artist)          
track_name_list.append(track)

except:
DNF_song_search = sp.search(q=track)
artist_name = DNF_song_search['tracks']['items'][0]['artists'][0]['name']

if search(artist_name, artist):     
track_name = DNF_song_search['tracks']['items'][0]['name']
track_id = DNF_song_search['tracks']['items'][0]['uri']
track_id_split = str.split(track_id, 'spotify:track:')
track_id_list.append(track_id_split[1])
artist_name_list.append(artist)
track_name_list.append(track)

else:
print('Inconsistent artist match on: ' + artist + ' ' + artist_name + ' for song ' + track)
features_df = pd.DataFrame()
for num in range(len(track_id_list) // 100 + 1):
features = sp.audio_features(track_id_list[(num*100):(num+1)*100])
features_df = features_df.append(pd.DataFrame(features))
#add artist and song columns from imported billboard df
features_df['Artist'] = artist_name_list
features_df['Song'] = track_name_list
#combine the two dataframes
df_merged = pd.merge(df_import, features_df.drop_duplicates(), on = 'Song', how = 'left')
df_merged.to_csv('mergedv2.csv')

最新更新