
本文详解为何直接爬取 spotify charts 网站不可行,并提供官方 api 替代方案、授权流程与代码示例,帮助开发者在遵守 terms of use 前提下安全、稳定地获取城市级周榜歌曲数据。
本文详解为何直接爬取 spotify charts 网站不可行,并提供官方 api 替代方案、授权流程与代码示例,帮助开发者在遵守 terms of use 前提下安全、稳定地获取城市级周榜歌曲数据。
Spotify Charts 网站(https://www.php.cn/link/03cf01ab1a9e0f461e4af33fce8d71f6)并非静态内容页面,而是一个高度动态的 Next.js 应用,其核心数据完全通过客户端 JavaScript 异步加载,且严格依赖用户登录态与身份鉴权。你使用 requests.get() 获取到的 HTML 仅是空壳骨架(
),所有真实榜单数据(如 Barcelona 周榜 Top 50 歌曲)均需在登录后,由前端调用受保护的 GraphQL 或 REST 接口(如 https://www.php.cn/link/03cf01ab1a9e0f461e4af33fce8d71f6/api/charts/...)动态拉取——这些接口强制校验有效的 Authorization: Bearer更重要的是:Spotify 明确禁止爬虫行为。在其 Charts 页面底部显著位置(及首次登录时弹窗)明确声明:
❗ No crawling or scraping
You can’t use any automated means of viewing, accessing, or collecting the information you see on the site.
违反该条款不仅可能导致 IP 封禁、账号限流,更构成对《Spotify Terms of Use》第 4.2 条(Prohibited Activities)的实质性违约,存在法律与服务终止风险。
✅ 合法替代路径:使用 Spotify for Developers 官方 API
虽然 Spotify Charts 网站本身不开放公开 API,但其底层数据源与 Spotify Web API 高度一致。你可通过以下合规方式获取等效的城市级榜单信息:
-
利用 charts 端点(需申请权限)
Spotify 已为认证合作伙伴开放 GET https://api.spotify.com/v1/charts(Beta 功能),支持按区域(region)、类型(type=city)、时间范围(date)查询。需满足:- 注册为 Spotify for Developers 合作伙伴;
- 在 Dashboard 中提交 Charts API Access Request 并获批;
- 使用 OAuth 2.0 client_credentials 流程获取 access_token。
-
组合标准 API 模拟榜单逻辑(推荐入门方案)
若暂未获 Charts API 权限,可基于公开端点构建近似榜单:- ✅ 获取热门城市 ID:调用 GET https://api.spotify.com/v1/markets 获取支持的国家/地区代码(如 ES 代表西班牙,覆盖巴塞罗那);
- ✅ 获取某地区 Top Tracks:使用 GET https://api.spotify.com/v1/artists/{id}/top-tracks?market=ES(需先通过搜索获取头部艺人 ID);
- ✅ 聚合多维度热度:结合 GET https://api.spotify.com/v1/playlists/{id}/tracks(如官方“Top 50 – Spain”歌单)+ GET https://api.spotify.com/v1/audio-features 分析播放量、互动率等指标。
以下是使用 client_credentials 认证获取西班牙市场 Top Tracks 歌单的 Python 示例(需提前创建应用并启用 playlist-read-private scope):
import requests
import json
# Step 1: 获取访问令牌(替换 YOUR_CLIENT_ID 和 YOUR_CLIENT_SECRET)
auth_url = "https://accounts.spotify.com/api/token"
auth_response = requests.post(
auth_url,
data={
"grant_type": "client_credentials",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
)
auth_data = auth_response.json()
access_token = auth_data["access_token"]
# Step 2: 查询西班牙官方 Top 50 歌单(ID 可通过搜索 'Top 50 Spain' 获取)
headers = {"Authorization": f"Bearer {access_token}"}
playlist_id = "37i9dQZEVXbMMy2roB9myp" # Spotify 官方西班牙周榜歌单 ID
tracks_url = f"https://api.spotify.com/v1/playlists/{playlist_id}/tracks?market=ES&limit=50"
tracks_response = requests.get(tracks_url, headers=headers)
if tracks_response.status_code == 200:
tracks_data = tracks_response.json()
print("✅ 成功获取西班牙周榜前 50 歌曲:")
for i, item in enumerate(tracks_data["items"], 1):
track = item["track"]
print(f"{i:2d}. {track['name']} — {', '.join([a['name'] for a in track['artists']])}")
else:
print(f"❌ 请求失败,状态码:{tracks_response.status_code}")⚠️ 关键注意事项
- 绝不硬编码登录 Cookie 或模拟浏览器请求:此类操作违反 ToS,且极易被 Cloudflare/WAF 拦截;
- 尊重速率限制:Spotify API 默认 10k 请求/天,高频调用需实现指数退避(Retry-After 头);
- 数据归属与展示规范:根据 Spotify Brand Guidelines,展示数据时必须包含 Spotify Logo 及“Data provided by Spotify”声明;
- 城市粒度限制:当前公开 API 仅支持国家/地区(market)级别,无法精确到巴塞罗那等单一城市——若业务强依赖城市数据,务必申请 Charts API 特别权限。
总结而言,放弃爬虫、拥抱官方 API 是唯一可持续、零法律风险的技术路径。从注册开发者账号、配置 OAuth 到调用首个端点,全程可在 15 分钟内完成。真正的效率提升,永远来自合规架构,而非对抗式抓取。


















