从豆瓣TOP250到个人电影数据库用BeautifulSoupPandasSQLite打造你的专属影库每次看到豆瓣电影TOP250榜单你是否想过将这些经典影片信息永久保存并随时调阅本文将带你用Python构建一个完整的电影数据管道——从爬取、清洗到存储与查询。不同于简单的数据抓取教程我们更关注如何让数据产生长期价值。1. 环境准备与数据抓取首先确保安装必要的库pip install beautifulsoup4 pandas requests sqlalchemy抓取数据时需要注意反爬机制。豆瓣对频繁请求会进行限制建议设置合理的请求间隔如3-5秒使用随机User-Agent只抓取公开数据不触碰需要登录的内容核心抓取代码结构import requests from bs4 import BeautifulSoup import time import random def get_movie_page(url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36... } time.sleep(random.uniform(1, 3)) response requests.get(url, headersheaders) return response.text if response.status_code 200 else None2. 数据解析与结构化处理使用BeautifulSoup提取关键字段时建议采用防御性编程def parse_movie_item(item): try: title item.find(span, class_title).text.strip() except AttributeError: title None try: rating float(item.find(span, class_rating_num).text) except (AttributeError, ValueError): rating None return { title: title, rating: rating, # 其他字段... }将数据转换为DataFrame时Pandas提供了强大的处理能力import pandas as pd def create_movie_df(movie_list): df pd.DataFrame(movie_list) # 数据清洗示例 df[year] df[title].str.extract(r\((\d{4})\)) df[title] df[title].str.replace(r\(\d{4}\), ).str.strip() return df3. 数据存储方案设计SQLite是轻量级数据库的绝佳选择适合个人项目from sqlalchemy import create_engine def save_to_sqlite(df, db_namemovies.db): engine create_engine(fsqlite:///{db_name}) df.to_sql(douban_top250, engine, if_existsreplace, indexFalse)数据库表结构设计建议包含以下字段字段名类型描述titleTEXT电影名称ratingREAL豆瓣评分yearINTEGER上映年份poster_urlTEXT海报URLsummaryTEXT剧情简介last_updateTIMESTAMP最后更新时间4. 数据应用与扩展有了数据库后你可以轻松实现以下功能基础查询按评分、年份筛选电影def get_high_rated_movies(min_rating9.0): query fSELECT * FROM douban_top250 WHERE rating {min_rating} ORDER BY rating DESC return pd.read_sql(query, engine)数据可视化使用Matplotlib生成评分分布图import matplotlib.pyplot as plt def plot_rating_distribution(df): df[rating].hist(bins20) plt.title(豆瓣TOP250评分分布) plt.xlabel(评分) plt.ylabel(电影数量) plt.show()自动更新机制定期检查并更新数据def check_for_updates(): # 比较现有数据与新抓取数据 # 只添加新记录或更新变更字段5. 项目优化建议异常处理增强网络请求重试机制数据解析失败日志记录数据库操作事务管理性能优化使用多线程加速数据抓取建立适当的数据库索引考虑使用缓存减少重复请求功能扩展添加个人评分和标签系统实现电影推荐算法开发简单的Web界面# 示例添加个人评分字段 def add_personal_rating(db_path, movie_id, rating): conn sqlite3.connect(db_path) cursor conn.cursor() cursor.execute( ALTER TABLE douban_top250 ADD COLUMN personal_rating REAL DEFAULT NULL ) cursor.execute( UPDATE douban_top250 SET personal_rating ? WHERE rowid ?, (rating, movie_id) ) conn.commit() conn.close()这个项目最有趣的部分在于你可以根据自己的需求不断扩展功能。我曾经用它来追踪某个导演的所有作品评分变化也有人用它分析不同类型电影的平均得分趋势。
从豆瓣TOP250到个人电影数据库:用BeautifulSoup+Pandas+SQLite打造你的专属影库
发布时间:2026/6/11 5:14:16
从豆瓣TOP250到个人电影数据库用BeautifulSoupPandasSQLite打造你的专属影库每次看到豆瓣电影TOP250榜单你是否想过将这些经典影片信息永久保存并随时调阅本文将带你用Python构建一个完整的电影数据管道——从爬取、清洗到存储与查询。不同于简单的数据抓取教程我们更关注如何让数据产生长期价值。1. 环境准备与数据抓取首先确保安装必要的库pip install beautifulsoup4 pandas requests sqlalchemy抓取数据时需要注意反爬机制。豆瓣对频繁请求会进行限制建议设置合理的请求间隔如3-5秒使用随机User-Agent只抓取公开数据不触碰需要登录的内容核心抓取代码结构import requests from bs4 import BeautifulSoup import time import random def get_movie_page(url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36... } time.sleep(random.uniform(1, 3)) response requests.get(url, headersheaders) return response.text if response.status_code 200 else None2. 数据解析与结构化处理使用BeautifulSoup提取关键字段时建议采用防御性编程def parse_movie_item(item): try: title item.find(span, class_title).text.strip() except AttributeError: title None try: rating float(item.find(span, class_rating_num).text) except (AttributeError, ValueError): rating None return { title: title, rating: rating, # 其他字段... }将数据转换为DataFrame时Pandas提供了强大的处理能力import pandas as pd def create_movie_df(movie_list): df pd.DataFrame(movie_list) # 数据清洗示例 df[year] df[title].str.extract(r\((\d{4})\)) df[title] df[title].str.replace(r\(\d{4}\), ).str.strip() return df3. 数据存储方案设计SQLite是轻量级数据库的绝佳选择适合个人项目from sqlalchemy import create_engine def save_to_sqlite(df, db_namemovies.db): engine create_engine(fsqlite:///{db_name}) df.to_sql(douban_top250, engine, if_existsreplace, indexFalse)数据库表结构设计建议包含以下字段字段名类型描述titleTEXT电影名称ratingREAL豆瓣评分yearINTEGER上映年份poster_urlTEXT海报URLsummaryTEXT剧情简介last_updateTIMESTAMP最后更新时间4. 数据应用与扩展有了数据库后你可以轻松实现以下功能基础查询按评分、年份筛选电影def get_high_rated_movies(min_rating9.0): query fSELECT * FROM douban_top250 WHERE rating {min_rating} ORDER BY rating DESC return pd.read_sql(query, engine)数据可视化使用Matplotlib生成评分分布图import matplotlib.pyplot as plt def plot_rating_distribution(df): df[rating].hist(bins20) plt.title(豆瓣TOP250评分分布) plt.xlabel(评分) plt.ylabel(电影数量) plt.show()自动更新机制定期检查并更新数据def check_for_updates(): # 比较现有数据与新抓取数据 # 只添加新记录或更新变更字段5. 项目优化建议异常处理增强网络请求重试机制数据解析失败日志记录数据库操作事务管理性能优化使用多线程加速数据抓取建立适当的数据库索引考虑使用缓存减少重复请求功能扩展添加个人评分和标签系统实现电影推荐算法开发简单的Web界面# 示例添加个人评分字段 def add_personal_rating(db_path, movie_id, rating): conn sqlite3.connect(db_path) cursor conn.cursor() cursor.execute( ALTER TABLE douban_top250 ADD COLUMN personal_rating REAL DEFAULT NULL ) cursor.execute( UPDATE douban_top250 SET personal_rating ? WHERE rowid ?, (rating, movie_id) ) conn.commit() conn.close()这个项目最有趣的部分在于你可以根据自己的需求不断扩展功能。我曾经用它来追踪某个导演的所有作品评分变化也有人用它分析不同类型电影的平均得分趋势。