SoundCloud API v2爬取用户歌单时limit参数返回结果异常问题求助
SoundCloud API v2 歌单拉取异常问题解答
异常原因
- limit参数存在未公开的隐性校验规则:SoundCloud v2 API没有对外公布完整参数规范,实际测试中limit的有效取值区间为1~50,超出该范围的取值会触发接口校验逻辑,要么被自动重置为默认值,要么直接返回空集合,这就是你设置limit=12返回0条、limit=100仅返回2条的核心原因。
- 未处理分页逻辑:该接口默认采用分页返回机制,单次请求只会返回当前分页的资源,响应JSON中的
next_href字段为下一页数据的请求地址,只有next_href为null时才代表拉取完全部资源,你只提取了第一页的collection字段,自然只能拿到部分歌单。 - 缺少特殊参数:部分公开歌单会因为地域限制、版权过滤、账号设置等原因,默认不在响应中返回,需要额外补充
show_hidden=1参数才能拉取到全量公开资源。 - 反爬拦截:如果请求没有带正常的User-Agent头,接口会触发反爬策略,返回异常数据。
修复方案
调整请求参数,增加分页处理逻辑,修正后的代码如下:
library(httr) library(jsonlite) CLIENT_ID <- "替换为你自己的有效CLIENT_ID" target_user_id <- 12 all_playlists <- list() current_request_url <- paste0( "https://api-v2.soundcloud.com/users/", target_user_id, "/playlists?client_id=", CLIENT_ID, "&limit=20&show_hidden=1" ) while (!is.null(current_request_url)) { # 携带正常浏览器UA头,避免被反爬拦截 resp <- GET( current_request_url, add_headers(`User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") ) # 请求失败最多重试3次,避免死循环 retry_times <- 0 while (resp$status_code != 200 && retry_times < 3) { Sys.sleep(1) resp <- GET( current_request_url, add_headers(`User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") ) retry_times <- retry_times + 1 } if (resp$status_code != 200) break resp_data <- fromJSON(content(resp, "text", encoding = "UTF-8")) all_playlists <- c(all_playlists, resp_data$collection) # 更新下一页请求地址 current_request_url <- resp_data$next_href } # 输出全量歌单数量 cat("共拉取到歌单数量:", length(all_playlists), "\n")
注意事项
- 每次请求之间建议增加1秒左右的延迟,避免请求过于频繁被IP限流
- 如果拉取到的歌单数量仍然不符,优先检查CLIENT_ID是否有效,过期的CLIENT_ID会导致接口仅返回部分公开资源
- SoundCloud v2 API属于未公开接口,接口规则可能随时调整,如出现异常可以尝试更新CLIENT_ID和User-Agent取值
内容的提问来源于stack exchange,提问作者La Minh Hieu
相关产品推荐
相关产品推荐

