使用OMDB API遍历电影标题列表出现重复数据的技术求助
解决OMDB API遍历列表返回相同数据的问题
问题重现
你使用omdbapi第三方库遍历电影标题列表时,所有请求都返回相同的电影数据,期望得到以标题为键的电影信息字典但未达成。你的代码如下:
from omdbapi.movie_search import GetMovie def get_movie_data(api_key, titles): movie_data = {} movie_api = GetMovie(api_key=api_key) for title in titles: # 尝试获取电影信息 try: result = movie_api.get_movie(title=title) # 检查是否找到电影且标题匹配 if result and result.get('Response', 'False') == 'True' and result.get('Title') == title: movie_data[result.get('Title')] = result except GetMovieException as e: print(f"未找到电影: {title}") continue except Exception as e: print(f"查询标题 {title} 时出错: {e}") continue return movie_data api_key = 'api-key' titles = [x for x in movie_data['title'].head(10)] # 根据实际数据调整 movies_info = get_movie_data(api_key, titles) print(movies_info)
核心原因与解决方向
第三方库实例的状态缓存问题
部分第三方OMDB库的实例会缓存首次请求结果,后续调用get_movie时直接返回缓存数据,而非发起新请求。
修复方案:将GetMovie实例的创建移到循环内部,确保每次请求都使用新实例:def get_movie_data(api_key, titles): movie_data = {} for title in titles: # 每次循环创建新的API实例 movie_api = GetMovie(api_key=api_key) try: result = movie_api.get_movie(title=title) # 后续逻辑保持不变 except Exception as e: # 异常处理保持不变 continue return movie_data严格标题匹配导致的过滤失效
OMDB返回的电影标题可能和你查询的标题存在差异(比如大小写、副标题、标点符号),严格的result.get('Title') == title会过滤掉有效结果,若库存在缓存,就会反复返回第一个通过匹配的结果。
修复方案:放宽匹配条件,比如忽略大小写、检查标题包含关系:# 替换原匹配判断 if result and result.get('Response') == 'True': # 忽略大小写模糊匹配 if result.get('Title', '').lower() == title.lower(): movie_data[title] = result # 或者允许标题包含查询关键词(适用于带副标题的情况) # if title.lower() in result.get('Title', '').lower():查询精度不足导致返回相似结果
OMDB默认会返回最匹配的结果,如果多个查询的标题有相似性(或者部分标题不存在),可能返回同一个热门影片。
修复方案:如果有影片年份信息,添加year参数提高精度;或者指定type参数限定影片类型:# 假设titles列表是(title, year)的元组 result = movie_api.get_movie(title=title, year=year, type='movie')绕过第三方库,直接调用OMDB原生API
如果第三方库存在不可控的问题,直接使用requests调用OMDB的REST API,完全控制请求逻辑:import requests def get_movie_data(api_key, titles): movie_data = {} base_url = 'http://www.omdbapi.com/' for title in titles: params = { 'apikey': api_key, 't': title, 'type': 'movie' } try: response = requests.get(base_url, params=params) response.raise_for_status() result = response.json() if result.get('Response') == 'True': movie_data[title] = result else: print(f"未找到电影: {title}") except requests.exceptions.RequestException as e: print(f"查询标题 {title} 时出错: {e}") continue return movie_data
内容的提问来源于stack exchange,提问作者Paulo Vivanco
相关产品推荐
相关产品推荐

