求助:使用tiagomendesdantas/Rspotify批量调用Spotify API失败
嗨,别担心,新手遇到批量处理的问题太正常啦!我来帮你一步步搞定用Rspotify包批量处理多个艺术家的需求~
第一步:整理需要查询的艺术家ID
首先你已经拿到了RapCaviar播放列表的歌曲数据rapcaviar,我们需要从里面提取所有艺术家的ID,而且要去重(避免重复查询同一个艺术家,浪费API请求额度):
library(dplyr) library(tidyr) # 从播放列表数据中提取并去重艺术家ID # 注:Rspotify返回的播放列表数据里,artists列是嵌套的列表结构,所以需要先展开 artist_ids <- rapcaviar %>% unnest(artists) %>% # 展开嵌套的艺术家列表 pull(id) %>% # 提取艺术家ID unique() # 去重,保留唯一的艺术家ID
如果你是手动指定要查询的艺术家,直接创建一个包含艺术家ID的向量就行,比如:
# 手动创建艺术家ID列表(示例:Drake、J. Cole、Kendrick Lamar的ID) my_artist_ids <- c("3TVXtAsR1Inumwj472S9r4", "2YZyLoL8N0Wb9xBt1NhZWg", "2EW2q3XkQ4b0cSvEt4OSM0")
第二步:批量查询艺术家信息
接下来用批量查询的方式获取每个艺术家的信息,这里要注意Spotify API有请求速率限制,所以每次请求之间加个短延迟,避免被限流;另外可以加错误处理,防止个别请求失败导致整个流程中断:
library(purrr) # 带延迟和错误处理的批量查询 artist_info_list <- map(artist_ids, function(artist_id) { Sys.sleep(1) # 每次请求间隔1秒,避免触发API限流 tryCatch({ # 调用getArtist函数获取单个艺术家信息 getArtist(id = artist_id, token = keys) }, error = function(e) { # 如果请求失败,打印错误信息并返回空值 message(paste("查询艺术家ID", artist_id, "失败:", e$message)) return(NULL) }) }) # 将查询结果的列表转换成数据框,方便后续分析 artist_info_df <- dplyr::bind_rows(Filter(Negate(is.null), artist_info_list))
一些注意事项
- API速率限制:Spotify免费版API有请求次数限制,短时间内大量请求会被暂时封禁,所以
Sys.sleep(1)的延迟很重要,必要时可以延长到2秒。 - 嵌套数据处理:Rspotify返回的很多数据是嵌套列表结构,记得用
unnest()展开后再提取需要的字段。 - 错误排查:如果某个艺术家查询失败,先检查ID是否正确,或者该艺术家是否存在于Spotify数据库中。
内容的提问来源于stack exchange,提问作者BJSP
相关产品推荐
相关产品推荐

