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

IMDB电影时长爬虫问题:误爬取上映日期求助

解决IMDB Top250爬取时长而非日期的问题

问题根源在于IMDB页面里,电影的上映日期、时长这类元数据都使用了同一个CSS类名 sc-14dd939d-6 kHVqMR cli-title-metadata-item,你当前用find()方法只会获取到匹配该类的第一个元素(也就是上映日期),要拿到时长需要定位到第二个元素。

以下是修正后的完整代码:

import openpyxl as opx
from bs4 import BeautifulSoup
import requests

wb = opx.Workbook()
ws = wb.active
ws.title = "Movies"

header_row = ["Name", "Date", "Rate", "Duration"]
ws.append(header_row)

url = "https://www.imdb.com/chart/top/?ref_=nv_mv_250"
header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
}

response = requests.get(url, headers=header)
html_content = response.content
soup = BeautifulSoup(html_content, "html.parser")
movies = soup.find_all(
    "li", class_="ipc-metadata-list-summary-item sc-bca49391-0 eypSaE cli-parent")


for movie in movies:
    # 提取电影名称
    name = movie.find("h3", class_="ipc-title__text").text.strip()
    # 获取所有元数据项:第一个是日期,第二个是时长
    metadata_items = movie.find_all("span", class_="sc-14dd939d-6 kHVqMR cli-title-metadata-item")
    date = metadata_items[0].text.strip() if len(metadata_items) > 0 else "N/A"
    duration = metadata_items[1].text.strip() if len(metadata_items) > 1 else "N/A"
    # 提取评分,处理可能的None情况
    rate_element = movie.find("span", class_="ipc-rating-star ipc-rating-star--base ipc-rating-star--imdb ratingGroup--imdb-rating")
    rate = rate_element.text.strip() if rate_element else "N/A"
    
    # 将数据写入Excel
    ws.append([name, date, rate, duration])
    # 打印验证
    print(f"名称: {name}, 日期: {date}, 评分: {rate}, 时长: {duration}")

wb.save("IMDB_Top250_Movies.xlsx")

关键修改说明:

  • 用find_all()替代find()获取所有元数据span,通过索引区分日期(第0位)和时长(第1位)
  • 添加判空逻辑,避免页面结构变化导致的索引越界或属性错误
  • 补充了评分的文本提取和写入Excel的完整逻辑

内容的提问来源于stack exchange,提问作者Alireza Pirmahdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:30