Spotify中Explicit Tracks识别返回None问题排查及优化咨询
问题分析与解决方案
咱们先拆解你遇到的两个核心问题,再给出修复后的代码,最后聊聊怎么更高效地实现这个需求。
一、为什么返回结果始终是None?
你的代码里有两个关键错误:
dict.update()的返回值误区:Python字典的update()方法是直接修改原字典,它不会返回新字典,而是返回None。你写new_albums = albums.update(...)的时候,相当于把new_albums直接赋值成了None,这就是最终返回None的根本原因。- 字典语法错误:你传递给
update的内容格式不对,正确的字典结构应该是{键: 值},你漏了外层的大括号。
二、修复后的代码
我们调整逻辑,直接往new_albums字典里添加条目,避开错误的update用法:
import time import spotipy import spotipy.util as util from config import spotify_token def albumDrop(): sp = spotipy.Spotify(auth=spotify_token) new_albums = {} # 不需要额外的albums字典,直接用new_albums存结果 artistList = sp.current_user_top_artists(limit=50, offset=0, time_range='long_term')['items'] for artist in artistList: print(f"{artist['name']} (ID: {artist['id']})") # 可按需添加country参数,避免地区版权导致的专辑缺失 artistAlbumsList = sp.artist_albums( artist["id"], album_type='album', limit=3)['items'] for album in artistAlbumsList: album_key = f"{artist['name']} - {album['name']}" print(f"{album['release_date']} | {artist['name']} | {album['name']} | {album['external_urls']['spotify']} | {album['id']}") albumTracks = sp.album_tracks(album['id'], limit=50)['items'] has_explicit = False # 找到一首Explicit曲目就停止遍历,节省时间 for track in albumTracks: if track['explicit']: has_explicit = True break if has_explicit: # 直接向new_albums添加条目,无需使用update new_albums[album_key] = { 'Release Date': album['release_date'], 'Artist Name': artist['name'], 'Album Name': album['name'], 'Album URI': album['external_urls']['spotify'], 'Album ID': album['id'], 'Explicit': has_explicit } return new_albums if __name__ == "__main__": start = time.time() latestAlbums = albumDrop() print(latestAlbums) print(f"执行耗时: {time.time() - start:.2f}秒")
三、更高效的实现方式
Spotify API有调用速率限制,我们可以通过减少请求次数来优化:
1. 缓存已检查的专辑
如果同一个专辑被多个艺术家关联(比如合辑),用集合缓存已检查的专辑ID,避免重复查询:
checked_album_ids = set() # 放在函数开头 # 遍历专辑时先判断 if album['id'] in checked_album_ids: continue checked_album_ids.add(album['id'])
2. 批量获取曲目信息
sp.album_tracks()一次只能查一个专辑的曲目,我们可以用sp.tracks()批量查询(最多一次50个ID),减少API请求次数:
# 收集当前专辑所有曲目ID track_ids = [track['id'] for track in albumTracks] # 分批次处理 for i in range(0, len(track_ids), 50): batch_ids = track_ids[i:i+50] tracks = sp.tracks(batch_ids)['tracks'] # 用any()快速判断是否有Explicit曲目 if any(t['explicit'] for t in tracks): # 添加到new_albums break
3. 处理API限流
如果遇到请求被限流,可以添加短暂延迟(比如time.sleep(0.1)),或者用tenacity库实现自动重试逻辑。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

