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

Python爬取IMDB A24影片列表无法输出完整结果如何解决

爬虫代码问题修复

现存问题

  • 电影节点选取错误:soup.find('div',class_="lister-list").find_all('div')会抓取列表容器下所有层级的div,包含评分块、海报块等非单部电影的节点,遍历到这类节点时调用元素查找方法会返回None,触发报错中断程序。正确的单部电影容器class为lister-item mode-detail。
  • 输出语句位置错误:print写在for循环外部,循环执行完只会保留最后一部电影的变量值,无法输出完整列表。
  • 缺少合法请求头:IMDB会拦截requests默认的请求标识,直接访问大概率返回反爬校验页,拿不到真实的榜单内容。
  • 缺失空值判断:部分影片没有metascore、票房数据,直接调用属性/文本方法会触发NoneType错误,导致循环中断。
  • 存在无效导入:开头导入的cmath.e、pydoc.synopsis和当前逻辑完全无关,属于冗余代码。

修复后代码

from bs4 import BeautifulSoup
import requests
import time

# 配置请求头模拟浏览器访问
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}

try:
    source = requests.get('https://www.imdb.com/list/ls024372673/', headers=HEADERS)
    source.raise_for_status()  

    soup = BeautifulSoup(source.text, 'html.parser')
    # 仅选取单部电影对应的容器节点
    movies = soup.find('div', class_="lister-list").find_all('div', class_="lister-item mode-detail")
   
    for movie in movies :
        # 所有字段增加空值判断,避免单条数据缺字段导致整个程序崩溃
        name = movie.find('h3', class_="lister-item-header").a.text.strip() if movie.find('h3', class_="lister-item-header") else "无"
        rank = movie.find('span', class_="lister-item-index unbold text-primary").text.strip() if movie.find('span', class_="lister-item-index unbold text-primary") else "无"
        year = movie.find('span', class_="lister-item-year text-muted unbold").text.strip() if movie.find('span', class_="lister-item-year text-muted unbold") else "无"
        star = movie.find('span', class_="ipl-rating-star__rating").text.strip() if movie.find('span', class_="ipl-rating-star__rating") else "无"
        
        metascore_tag = movie.find('div', class_="inline-block ratings-metascore")
        metascore = metascore_tag.span.text.strip() if metascore_tag else "无"
        
        score_tag = movie.find('div', class_="list-description")
        score = score_tag.text.strip() if score_tag else "无"
        
        genre_tag = movie.find('span', class_="genre")
        genre = genre_tag.text.strip() if genre_tag else "无"
        
        runtime_tag = movie.find('span', class_="runtime")
        runtime = runtime_tag.text.strip() if runtime_tag else "无"
        
        about_tag = movie.find('p', class_="")
        about = about_tag.text.strip() if about_tag else "无"
       
        elements = movie.find_all('span', attrs = {'name':'nv'})
        votes = elements[0]['data-value'] if len(elements)>=1 else "无"
        gross = elements[1]['data-value'] if len(elements)>=2 else "无"

        # 输出逻辑移到循环内部,每遍历一部影片即时打印结果
        print(name, rank, year, star, metascore, score, genre, runtime, about, votes, gross)
        # 增加请求间隔,避免触发反爬
        time.sleep(1)
except Exception as e:
    print(e) 

注意事项

  • 代码中用strip()清除了提取文本前后多余的换行、空格,输出格式更整洁。
  • 该榜单默认单页展示100条内容,抓全量数据需要拼接分页参数,比如第二页url为https://www.imdb.com/list/ls024372673/?page=2,依次递增page值即可翻页。
  • 不要短时间内高频发起请求,否则容易被IMDB临时封禁IP。

内容的提问来源于stack exchange,提问作者Veronika Mihovec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:30:46