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

Python爬取IMDb时for循环重复输出同一年份问题咨询

问题原因

你遇到的重复输出问题根本不是「多部电影同一年份」导致的,是代码里写了两层多余的嵌套循环,造成单部电影的年份被反复追加到列表中:

  • 定位到单部电影的内容容器urunDivs后,你加了for i in urunDivs:遍历容器所有子节点,这层循环完全无意义
  • 定位到单部电影的标题容器tumTextler后,你又加了for x in tumTextler:遍历h3下的所有子标签(序号、电影名a标签、年份span),每遍历一个子标签就会执行一次追加年份、追加电影名的逻辑,直接导致同一部电影的年份被重复写入列表多次。
修复方法

直接删掉两层多余的循环即可,不需要给年份加去重判断——同一年份对应多部电影是正常业务数据,你要解决的是「同一条数据被重复采集」的问题,不是给年份去重。
另外不要把电影名和年份分开存在两个独立列表里,一旦某条数据采集失败,两个列表长度不一致,就会出现电影和年份错位匹配的问题,建议直接按单部电影维度存储数据。

修正后的可运行代码:

from bs4 import BeautifulSoup as bs
import requests

# 加请求头模拟浏览器,避免被IMDb反爬拦截
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"
}
source = requests.get("https://www.imdb.com/list/ls070233852/", headers=headers)
source.encoding = "utf-8"
soup = bs(source.content,'html.parser')
movies = soup.find_all("div",attrs={"class":"mode-detail"})
movie_info = []

for movie in movies:
    content_div = movie.find("div",attrs={"class":"lister-item-content"})
    header = content_div.find("h3",attrs={"class":"lister-item-header"})
    # 直接提取对应字段,不需要遍历子节点
    year = header.find("span",attrs={"class":"lister-item-year"}).text.strip()
    title = header.find("a").text.strip()
    movie_info.append( {"title": title, "year": year} )

# 输出验证,电影名和年份一一对应,无重复采集问题
for item in movie_info:
    print(f"电影名称:{item['title']},出品年份:{item['year']}")
补充提示

如果后续需要统计所有出现过的不重复年份,单独对采集好的movie_info里的year字段做去重即可,不要在采集阶段就过滤年份,否则会丢失电影和年份的对应关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:42:26