Python爬虫中while循环为何陷入无限循环?
问题分析与修复方案
核心问题
你的代码陷入无限循环主要有3个原因:
while True没设置终止条件,没判断是否还有下一页- 翻页逻辑放错位置:把请求下一页的代码写在遍历单页电影的
for循环里,导致每爬一部电影就请求一次下一页,完全打乱流程 - 爬完下一页后,没更新当前页的电影容器(
movie_div)和解析对象(movie_soup),导致每次while循环都重复爬第一页内容
修复步骤
- 调整翻页逻辑位置:把请求下一页、更新解析对象的代码移到
for循环外面,等当前页所有电影爬完再处理翻页 - 添加循环终止条件:判断是否存在下一页按钮,没有就跳出
while循环 - 更新页面数据:每次爬完下一页后,从新的soup里获取新的电影容器,替换原来的
movie_div - 修复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
相关产品推荐
相关产品推荐

