Python字典存储电影API数据失败问题排查及打印方法咨询
从TMDB API获取电影标题与ID并存储到字典的问题解决
代码无法运行的原因
- API地址拼写错误:请求URL里的
discover/moie写错了,正确是discover/movie,这会直接导致请求返回404错误,拿不到有效数据。 - 无效API密钥:代码里的
mykey是占位符,必须替换成你在TMDB官网申请的真实API密钥,不然会返回权限错误。 - 循环范围不合理:TMDB的discover API分页有严格上限(最多500页),你写的
range(1,36590)会发起大量无效请求,还可能触发API频率限制被封禁。 - 缺少异常处理:一旦请求失败(比如断网、API返回错误)或者数据里没有
results键,程序会直接崩溃。 - 冗余的
setdefault调用:每次循环都调用setdefault初始化列表完全没必要,提前把字典建好就行。
修正后的代码
import requests # 替换成你自己的TMDB API密钥 API_KEY = "your_real_api_key" BASE_URL = "https://api.themoviedb.org/3/discover/movie" # 提前初始化存储数据的字典 movie_data = { "original_title": [], "id": [] } # 先获取总页数,避免无效循环 request_params = { "api_key": API_KEY, "language": "en-US", "sort_by": "popularity.desc", "include_adult": "false", "include_video": "false", "with_watch_monetization_types": "flatrate", "page": 1 } try: # 请求第一页数据,获取总页数 response = requests.get(BASE_URL, params=request_params) response.raise_for_status() # 检查请求是否成功 first_page = response.json() total_pages = first_page.get("total_pages", 1) # TMDB API限制最多只能获取500页,取较小值 max_pages = min(total_pages, 500) # 处理第一页的电影数据 for item in first_page["results"]: movie_data["original_title"].append(item["original_title"]) movie_data["id"].append(item["id"]) # 遍历剩余页面 for page_num in range(2, max_pages + 1): request_params["page"] = page_num response = requests.get(BASE_URL, params=request_params) response.raise_for_status() current_page = response.json() for item in current_page["results"]: movie_data["original_title"].append(item["original_title"]) movie_data["id"].append(item["id"]) # 打印结果(数据量太大时,建议只打示例或存文件) print(f"总共获取到 {len(movie_data['original_title'])} 部电影") print("前5条数据示例:") for title, movie_id in zip(movie_data["original_title"][:5], movie_data["id"][:5]): print(f"ID: {movie_id} | 标题: {title}") except requests.exceptions.RequestException as err: print(f"请求出错:{err}") except KeyError as err: print(f"数据解析失败,缺少字段:{err}")
修正说明
- 修复了API地址的拼写错误,确保请求能正常到达TMDB服务器
- 使用
params参数传递请求参数,比字符串拼接更安全易维护 - 先获取总页数并遵守TMDB的500页限制,避免无效请求
- 添加了异常处理,能捕获网络错误、API错误、数据解析错误等情况
- 提前初始化字典的列表字段,去掉了冗余的
setdefault调用 - 避免直接打印超大字典,改为打印总数量和前几条示例,防止输出过载
内容的提问来源于stack exchange,提问作者Elly
相关产品推荐
相关产品推荐

