Python3通过Ajax请求URL生成JSON文件爬取Shazam榜单方法咨询
Python3爬取Shazam多国热门歌曲榜单JSON数据实现方案
Shazam榜单数据不需要通过BeautifulSoup解析渲染后的HTML,直接调用其公开的结构化JSON接口即可获取数据,实现逻辑如下:
接口构造规则
你已找到的全球榜接口为https://www.shazam.com/shazam/v3/en-US/US/web/-/tracks/world-chart-world,所有国家/地区的Top200榜单接口遵循统一命名规则:
- 全球榜:路径末尾固定为
world-chart-world - 国家/地区榜:路径末尾替换为
country-chart-<对应国家/地区两位ISO标准编码> - 示例:你提到的南非Top200榜单,对应接口为
https://www.shazam.com/shazam/v3/en-US/US/web/-/tracks/country-chart-za,直接发起GET请求即可返回标准JSON格式数据,无需额外签名、鉴权参数。
提示:要获取其他国家榜单,只需替换路径中的两位ISO编码即可,例如中国对应
cn、美国对应us、英国对应gb、日本对应jp,可批量生成目标接口地址。
具体实现代码
首先安装依赖库:pip install requests
完整可运行代码:
import requests import json from time import sleep # 配置待爬取的国家/地区列表,key为自定义保存名称,value为对应两位ISO编码 target_regions = { "全球": "", "南非": "za", "美国": "us", "英国": "gb", "日本": "jp" } # 模拟浏览器请求头,避免被基础反爬拦截 request_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Accept": "application/json" } api_base = "https://www.shazam.com/shazam/v3/en-US/US/web/-/tracks/" for region_name, iso_code in target_regions.items(): try: # 拼接对应接口地址 if not iso_code: req_url = f"{api_base}world-chart-world" else: req_url = f"{api_base}country-chart-{iso_code}" resp = requests.get(req_url, headers=request_headers, timeout=15) resp.raise_for_status() chart_data = resp.json() # 保存为本地JSON文件 save_path = f"shazam_top200_{region_name}.json" with open(save_path, "w", encoding="utf-8") as f: json.dump(chart_data, f, ensure_ascii=False, indent=2) print(f"{region_name}榜单数据已保存至 {save_path}") sleep(1) # 控制请求频率,避免触发反爬 except Exception as e: print(f"爬取{region_name}榜单失败:{str(e)}")
返回数据常用字段说明
接口返回的JSON中,歌曲列表存放在tracks数组内,单条歌曲数据的核心字段:
rank:歌曲在榜单中的排名title:歌曲名称subtitle:歌手名称shazamCount:该歌曲的Shazam总识别次数images.coverart:歌曲封面图片地址url:歌曲对应的Shazam详情页地址
注意事项
- 请求间隔建议不低于0.5秒,短时间高频请求容易触发IP拦截
- 若遇403错误,可尝试更换User-Agent或使用代理IP,该接口无复杂加密校验
- 直接调用接口获取JSON的方式比解析HTML稳定性高,不会受前端页面改版影响
内容的提问来源于stack exchange,提问作者Tayla Corney
相关产品推荐
相关产品推荐

