Python新手求助:IMDbPy调用报错且速度慢,求优化及替代方案
解决IMDbPy报错并优化速度,附替代方案
一、IMDbPy报错原因与修复
你遇到的错误是因为ia.get_movie()的info参数接受的是预定义的信息集名称,而非具体字段名。title、year这类属于字段,不是信息集,所以会触发"unknown information set"错误。
修正后的代码
# 全局复用IMDb实例,避免重复初始化开销 ia = IMDb(cache=True) # 启用缓存,大幅提升重复请求速度 def get_imdb_info(movie_name): # 限制搜索结果数量,减少返回数据 results = ia.search_movie(movie_name, results=1) if not results: return None # 处理无搜索结果的边界情况 movie_id = results[0].getID() # 指定需要的信息集: # 'info' → 包含title、year、genres、rating等基础元数据 # 'plot' → 剧情简介 # 'episodes' → 剧集的季/集信息(仅对剧集有效) movie = ia.get_movie(movie_id, info=['info', 'plot', 'episodes']) # 正确访问字段(注意rating是小写) print(f"标题: {movie['title']}") print(f"年份: {movie['year']}") print(f"类型: {movie['genres']}") print(f"评分: {movie['rating']}") print(f"剧情简介: {movie['plot'][0]}") # 如果是剧集,遍历季和集 if 'episodes' in movie: for season_num, episodes in movie['episodes'].items(): print(f"\n第{season_num}季:") for episode in episodes: print(f" 第{episode['episode']}集: {episode['title']} 评分:{episode.get('rating', '无')}") return movie
关键优化点
- 复用IMDb实例:避免每次函数调用都重新初始化,减少连接开销。
- 启用缓存:
cache=True会把已请求的数据本地缓存,重复查询同一影视信息时直接读取缓存,速度提升明显。 - 限制搜索结果:
results=1只返回第一个搜索结果,减少数据传输量。 - 精准指定信息集:只请求需要的信息集,避免默认获取全部数据导致的慢加载。
二、替代方案推荐
如果IMDbPy的使用体验仍不理想,推荐以下两个更稳定、高效的方案:
1. OMDb API
- 特点:返回JSON格式,解析简单,支持电影/剧集的基础信息、剧情简介、评分,需免费API密钥(官网申请)。
import requests OMDB_API_KEY = "你的API密钥" def get_omdb_info(movie_name): params = { "t": movie_name, "apikey": OMDB_API_KEY, "plot": "full", # 获取完整剧情 "type": "movie" # 可选:指定类型为movie/tv } response = requests.get("http://www.omdbapi.com/", params=params) data = response.json() if data["Response"] == "True": # 提取关键信息 return { "title": data["Title"], "year": data["Year"], "genres": data["Genre"].split(", "), "rating": data["imdbRating"], "plot": data["Plot"] } return None
2. TMDB API
- 特点:功能全面,支持电影/剧集的详细信息(包括每一集的名称、评分、演员、海报等),数据更新及时,需免费API密钥(官网申请)。
import requests TMDB_API_KEY = "你的API密钥" BASE_URL = "https://api.themoviedb.org/3" def get_tmdb_info(movie_name): # 第一步:搜索目标影视,获取ID和类型 search_params = {"api_key": TMDB_API_KEY, "query": movie_name} search_res = requests.get(f"{BASE_URL}/search/multi", params=search_params).json() if not search_res["results"]: return None target = search_res["results"][0] media_type = target["media_type"] item_id = target["id"] # 第二步:根据类型获取详细信息 detail_params = {"api_key": TMDB_API_KEY} if media_type == "movie": detail_url = f"{BASE_URL}/movie/{item_id}" detail_params["append_to_response"] = "credits,images" # 附加演员、海报信息 elif media_type == "tv": detail_url = f"{BASE_URL}/tv/{item_id}" detail_params["append_to_response"] = "seasons,episodes" # 附加季/集信息 else: return None detail_res = requests.get(detail_url, params=detail_params).json() return detail_res
内容的提问来源于stack exchange,提问作者zedmahdi
相关产品推荐
相关产品推荐

