使用urllib爬取IMDb榜单生成DataFrame失败,求技术帮助
IMDb Top榜单爬取问题修复
原代码存在的问题
- 循环中始终引用第一个电影的
film对象,而非当前迭代的films,导致所有条目重复第一条数据 - 标题查找用了硬编码的
title属性值,只能匹配《肖申克的救赎》这一部电影,无法适配其他条目 - 排名选择器错误,误取了评分列的内容,实际排名在
titleColumn列中 - 未导入pandas库,代码中调用
pd.DataFrame会报错 - 字典里
film字段存储的是BeautifulSoup节点对象,而非标题文本 - 直接用
urlopen请求易被IMDb反爬拦截,需添加请求头伪装浏览器
修复后的完整代码
from urllib.request import urlopen, Request from bs4 import BeautifulSoup import pandas as pd # 添加请求头,伪装浏览器 url = 'https://www.imdb.com/chart/top/?sort=rk,asc&mode=simple&page=1' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } req = Request(url, headers=headers) page = urlopen(req) soup = BeautifulSoup(page, 'html.parser') film_in = soup.find('tbody', class_='lister-list').find_all('tr') imdb = [] def remove_parentheses(string): return string.replace("(", "").replace(")", "").replace("\n", "").strip() for film in film_in: # 提取标题:定位titleColumn下的a标签 title_tag = film.find('td', class_='titleColumn').find('a') titre = title_tag.text # 提取排名:从titleColumn的文本中拆分 rang_text = film.find('td', class_='titleColumn').get_text(strip=True).split('.')[0] # 提取年份 année = remove_parentheses(film.find('span', class_='secondaryInfo').text) # 提取评分 rating = film.find('td', class_='ratingColumn imdbRating').find('strong').text dictionnaire = { 'film': titre, 'rang': rang_text, 'année': année, '评分': rating } imdb.append(dictionnaire) df_imdb = pd.DataFrame(imdb) print(df_imdb.head())
关键修改说明
- 添加
Request对象并设置User-Agent请求头,避免被反爬拦截 - 循环中使用当前迭代的
film对象,确保每条数据对应不同电影 - 用通用选择器
td.titleColumn a定位标题,适配所有电影条目 - 从
titleColumn的文本中拆分出排名,解决原选择器错误问题 - 导入pandas库,确保
DataFrame能正常实例化 - 字典中存储标题文本而非节点对象,同时补充评分字段让数据更完整
内容的提问来源于stack exchange,提问作者Raouf Yahiaoui
相关产品推荐
相关产品推荐

