Spotify API返回304状态码后如何获取响应?
Spotify API返回304状态码后如何获取响应?
别慌,先搞清楚304状态码到底是什么意思——它不是“请求失败”,而是HTTP缓存机制的正常响应:Spotify API告诉你,这首歌的音频特征数据没有变化,建议你使用之前缓存的版本。但重点是:服务器其实还是会返回缓存的音频特征数据的,你可能只是误解了304的含义,以为拿不到数据而已。
给你一步步解决问题:
1. 先确认304响应里有没有数据
你可以先修改get_audio_features函数,打印状态码和返回的内容片段,验证数据是否存在:
import requests # 确保导入requests库,你之前的代码里的get应该是requests.get import json import pandas as pd def get_audio_features(token, track_id): url = f"https://api.spotify.com/v1/audio-features/{track_id}" headers = {"Authorization": f"Bearer {token}"} result = requests.get(url, headers=headers) # 打印状态码和部分特征信息,验证数据存在 print(f"Track ID: {track_id} | Status Code: {result.status_code}") if result.content: json_result = result.json() # 用requests内置的json解析更便捷 print(f"已获取特征:{list(json_result.keys())[:5]}...") else: json_result = {} print("⚠️ 无内容返回!") return json_result
运行后你会发现,即使状态码是304,后面依然会打印出acousticness、danceability这类特征名称——这说明数据已经正常拿到了,只是服务器提示你数据没更新而已。
2. 正常生成并保存DataFrame
既然数据能正常获取,你完全可以沿用原来的逻辑生成DataFrame,然后直接保存为CSV,不用纠结304状态码:
# 前面的授权代码保持不变 df = pd.read_csv('liked_songs.csv') track_features_list = [] for i, track_id in enumerate(df['track_id']): features = get_audio_features(access_token, track_id) track_features_list.append(features) feature_df = pd.DataFrame(track_features_list) feature_df.to_csv('saved_track_features.csv', index=False) # 保存结果到CSV print("✅ 数据已保存到saved_track_features.csv!") print(feature_df.head())
3. 为什么清除浏览器缓存没用?
你的请求是从Python代码发起的,和浏览器完全无关——这里的缓存要么是requests库在本地维护的缓存,要么是Spotify API服务器端的缓存(毕竟歌曲的音频特征是静态数据,几乎不会变化),所以清浏览器缓存自然起不到作用。
4. (可选)如果想强制绕开缓存(其实没必要)
如果你实在想让服务器返回200状态码而非304,可以给请求加唯一查询参数或更严格的缓存控制头,但这步完全多余,因为304响应已经包含你需要的所有数据:
import time def get_audio_features(token, track_id): # 加时间戳参数让每个请求URL唯一 url = f"https://api.spotify.com/v1/audio-features/{track_id}?t={int(time.time())}" headers = { "Authorization": f"Bearer {token}", "Cache-Control": "no-cache, no-store, must-revalidate", "Pragma": "no-cache", "Expires": "0" } result = requests.get(url, headers=headers) return result.json()
备注:内容来源于stack exchange,提问作者Yashaswat
相关产品推荐
相关产品推荐

