如何获取5万条Spotify用户创建的嘻哈风格播放列表ID?
问题:获取5万个用户创建的嘻哈风格Spotify播放列表ID
我需要分析用户创建的Spotify嘻哈风格播放列表及其曲目,目标是收集5万个用户创建的播放列表ID。目前遇到以下障碍:
- 使用Spotify Search API时,存在1000条数据的查询上限,无法获取足够数量的结果
- 使用Get Category’s Playlist API仅能返回Spotify官方创建的播放列表,完全无法获取用户创建的内容
- 曾尝试按字母(如'a'、'b')拆分搜索词来规避Search API限制,但不确定哪些关键词能全面覆盖嘻哈类用户播放列表,随机性太强
以下是我用Spotipy调用Get Category’s Playlist API的代码(运行后仅能获取80-100+条官方播放列表):
import pandas as pd import numpy as np import spotipy import spotipy.util as util from spotipy.oauth2 import SpotifyClientCredentials import spotipy.oauth2 as oauth2 # Replace Auth details with your Client ID, Secret spotify_details = { 'client_id' : 'Client ID', 'client_secret':'Client Secret', 'redirect_uri':'Redirect_uri'} scope = "user-library-read user-follow-read user-top-read playlist-read-private playlist-read-collaborative playlist-modify-public playlist-modify-private" sp = spotipy.Spotify( auth_manager=spotipy.SpotifyOAuth( client_id=spotify_details['client_id'], client_secret=spotify_details['client_secret'], redirect_uri=spotify_details['redirect_uri'], scope=scope,open_browser=False)) results = sp.category_playlists(category_id="hiphop", limit = 5, country="US", offset=0) total = results["playlists"]["total"] df=pd.DataFrame([],columns = ['id', 'name', 'external_urls.spotify']) for offset in range(0,total,50): results = sp.category_playlists(category_id="hiphop", limit = 50, country="US", offset=offset) playlists = pd.json_normalize(results['playlists']['items']) #print(playlists.keys) df=pd.concat([df,playlists]) df
解决思路
1. 优化Search API关键词策略,系统性覆盖嘻哈类播放列表
放弃随机字母拆分,改用嘻哈领域专属关键词组合分批次查询,每个关键词可获取上限1000条结果,最后去重合并:
- 核心风格词:
hip hop,rap,trap,gangsta rap,boom bap,mumble rap,west coast rap,east coast rap - 场景/情绪词:
workout hip hop,chill rap,party hip hop,underground rap - 地区/文化词:
US hip hop,UK drill,afrobeat rap,latino hip hop
2. 利用用户关系链扩散获取播放列表
通过用户关注接口从活跃嘻哈类用户出发,递归抓取播放列表:
- 先通过Search API搜索
hip hop curator、rap playlist maker等关键词,获取一批嘻哈内容活跃用户ID - 调用
sp.user_playlists(user_id)获取该用户创建/收藏的公开播放列表 - 调用
sp.user_followers(user_id)获取该用户的关注者,继续抓取关注者的播放列表(注意控制API请求频率)
3. 规避API限制的细节处理
- 严格遵守Spotify API速率限制(常规请求180次/分钟,分页请求40次/分钟),代码中加入
time.sleep()控制请求间隔 - 用集合存储播放列表ID,自动去重
- 仅抓取公开播放列表,私有播放列表需用户单独授权,无法批量获取
调整后的Search API调用示例代码
import pandas as pd import spotipy from spotipy.oauth2 import SpotifyOAuth import time # 替换为你的认证信息 spotify_details = { 'client_id' : '你的Client ID', 'client_secret':'你的Client Secret', 'redirect_uri':'你的Redirect URI'} scope = "playlist-read-public" sp = spotipy.Spotify( auth_manager=SpotifyOAuth( client_id=spotify_details['client_id'], client_secret=spotify_details['client_secret'], redirect_uri=spotify_details['redirect_uri'], scope=scope, open_browser=False)) # 嘻哈类关键词清单 keywords = ['hip hop', 'rap', 'trap', 'gangsta rap', 'boom bap', 'mumble rap', 'west coast rap', 'east coast rap', 'workout hip hop', 'chill rap', 'party hip hop', 'underground rap', 'UK drill', 'afrobeat rap'] playlist_ids = set() # 用集合自动去重 for keyword in keywords: offset = 0 while True: try: results = sp.search(q=f"playlist:{keyword}", type="playlist", limit=50, offset=offset) items = results['playlists']['items'] if not items: break # 无更多结果时退出循环 # 筛选用户创建的播放列表(排除Spotify官方账号) for item in items: if item['owner']['id'] != 'spotify': playlist_ids.add(item['id']) offset += 50 if offset >= 1000: # 达到Search API单关键词上限 break time.sleep(0.5) # 控制请求速率,避免触发限制 except Exception as e: print(f"查询关键词 {keyword} 时出错: {e}") time.sleep(5) # 出错后等待重试 # 转换为DataFrame保存 df = pd.DataFrame(list(playlist_ids), columns=['playlist_id']) print(f"共收集到 {len(df)} 个用户创建的播放列表ID") df.to_csv('hiphop_playlists.csv', index=False)
内容的提问来源于stack exchange,提问作者Tanachai A
相关产品推荐
相关产品推荐

