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

Python爬虫中while循环为何陷入无限循环?

问题分析与修复方案

核心问题

你的代码陷入无限循环主要有3个原因:

  • while True没设置终止条件,没判断是否还有下一页
  • 翻页逻辑放错位置:把请求下一页的代码写在遍历单页电影的for循环里,导致每爬一部电影就请求一次下一页,完全打乱流程
  • 爬完下一页后,没更新当前页的电影容器(movie_div)和解析对象(movie_soup),导致每次while循环都重复爬第一页内容

修复步骤

  1. 调整翻页逻辑位置:把请求下一页、更新解析对象的代码移到for循环外面,等当前页所有电影爬完再处理翻页
  2. 添加循环终止条件:判断是否存在下一页按钮,没有就跳出while循环
  3. 更新页面数据:每次爬完下一页后,从新的soup里获取新的电影容器,替换原来的movie_div
  4. 修复runtime判断bug:原代码先取text再判断,元素不存在时会报错,改成先判断元素是否存在再取内容

修正后的完整代码

import requests
from bs4 import BeautifulSoup

# 初始化存储列表
movie_name = []
movie_years = []
movie_runtime = []
imdb_ratings = []
metascores = []
number_votes = []
us_gross = []

# 初始页面URL
current_url = "https://www.imdb.com/search/title/?groups=top_100&sort=user_rating,desc"

while True:
    # 请求当前页面
    response = requests.get(current_url)
    movie_soup = BeautifulSoup(response.text, 'html.parser')
    # 获取当前页的电影容器
    movie_div = movie_soup.find_all('div', class_='lister-item mode-advanced')
    
    # 遍历当前页所有电影
    for container in movie_div:
        # 电影名称
        name = container.h3.a.text
        movie_name.append(name)
        
        # 上映年份
        year = container.h3.find('span', class_='lister-item-year').text
        movie_years.append(year)
        
        # 时长:先判断元素是否存在,再取text
        runtime_elem = container.p.find('span', class_='runtime')
        runtime = runtime_elem.text if runtime_elem else '-'
        movie_runtime.append(runtime)
        
        # IMDB评分
        imdb = float(container.strong.text)
        imdb_ratings.append(imdb)
        
        # 元评分
        m_score_elem = container.find('span', class_='metascore')
        m_score = m_score_elem.text.strip() if m_score_elem else '-'
        metascores.append(m_score)
        
        # 投票和票房
        nv = container.find_all('span', attrs={'name': 'nv'})
        # 投票数
        vote = nv[0].text
        number_votes.append(vote)
        # 票房
        grosses = nv[1].text if len(nv) > 1 else '-'
        us_gross.append(grosses)
    
    # 处理翻页:查找下一页按钮
    next_btn = movie_soup.select_one('.next-page')
    if not next_btn:
        # 没有下一页,跳出循环
        break
    # 更新当前URL为下一页地址
    current_url = "https://www.imdb.com" + next_btn.get('href')

# 验证数据(可选)
for i in range(10):
    print(f"电影:{movie_name[i]},年份:{movie_years[i]},评分:{imdb_ratings[i]}")

补充说明

  • 每次请求页面后重新解析soup和获取电影容器,确保处理的是当前页数据
  • 翻页时先判断下一页按钮是否存在,不存在就终止循环,避免无限爬取
  • 优化了元素判断逻辑,防止因页面元素缺失导致报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:07:42