使用Python爬取IMDB电影数据保存为CSV为空问题求助
问题修复指导
你代码存在的核心问题
- 缩进错误:
import requests,csv行存在多余缩进,会直接触发语法错误 - 反爬拦截:IMDB对无请求头的裸请求会返回验证页面,你拿到的
soup根本没有目标电影节点,数据提取循环完全未执行 - 未存储提取数据:你仅把爬取到的内容打印到控制台,没有存入变量,后续调用的
data属于未定义变量,运行会报错 - 写法兼容性问题:
import files、data.to_csv属于Google Colab专属写法,本地运行环境完全不支持
可直接运行的修正代码
from bs4 import BeautifulSoup import requests,csv # 添加请求头模拟浏览器,绕过IMDB反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } source = requests.get('https://www.imdb.com/chart/top', headers=headers) soup = BeautifulSoup(source.text, 'html.parser') movies = soup.find('tbody', class_="lister-list").find_all('tr') # 初始化列表存储所有电影数据 movie_data = [] # 先加表头 movie_data.append(["排名", "电影名称", "上映年份", "评分"]) for movie in movies: name = movie.find('td',class_="titleColumn").a.text rank = movie.find('td',class_="titleColumn").get_text(strip=True).split('.')[0] year = movie.find('td',class_="titleColumn").span.text.strip('()') rating = movie.find('td',class_="ratingColumn imdbRating").strong.text # 把单条数据存入列表 movie_data.append([rank, name, year, rating]) print(rank,name,year,rating) # 写入CSV文件,本地运行直接在代码同目录生成文件 with open('sample.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerows(movie_data) # 如果是在Google Colab环境运行,取消注释下面两行即可触发下载 # from google.colab import files # files.download("sample.csv")
额外说明
- 代码使用标准
csv模块写入文件,不需要额外安装pandas依赖 - 编码指定为
utf-8-sig是为了兼容Excel打开CSV时不乱码 - 如果后续需要用pandas处理数据,只需要把
movie_data转成DataFrame即可,示例:
import pandas as pd data = pd.DataFrame(movie_data[1:], columns=movie_data[0]) data.to_csv('sample.csv', index=False, encoding='utf-8-sig')
内容的提问来源于stack exchange,提问作者orange
相关产品推荐
相关产品推荐

