You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:52:37