当前位置: 首页 > news >正文

用Python爬取豆瓣电影Top250,并存入MySQL数据库(附完整代码)

Python实战:构建豆瓣电影Top250数据采集与存储系统

在数据驱动的时代,掌握高效获取和处理网络数据的能力已成为开发者必备技能。本文将带你从零开始,用Python构建一个完整的豆瓣电影Top250数据采集系统,并将这些宝贵数据存入MySQL数据库,为后续分析或个人影库建设打下基础。

1. 环境准备与项目规划

1.1 工具与库的选择

构建一个稳定的数据采集系统需要精心挑选工具链。以下是核心组件:

  • Python 3.8+:推荐使用最新稳定版
  • Requests:处理HTTP请求的黄金标准库
  • BeautifulSoup4:HTML解析利器
  • PyMySQL:Python与MySQL交互的轻量级解决方案
  • SQLAlchemy(可选):ORM工具,适合复杂项目

安装这些依赖只需一行命令:

pip install requests beautifulsoup4 pymysql sqlalchemy

1.2 数据库设计

良好的数据结构是系统的基石。我们设计movies表来存储电影信息:

字段名类型描述
idVARCHAR(32)电影唯一标识
titleVARCHAR(100)中文片名
original_titleVARCHAR(100)原始片名
ratingDECIMAL(3,1)平均评分
votesINT评分人数
yearINT上映年份
directorsTEXT导演列表(JSON)
castsTEXT演员列表(JSON)
genresTEXT类型列表(JSON)
summaryTEXT剧情简介
cover_urlVARCHAR(255)封面图URL
detail_urlVARCHAR(255)详情页URL
create_timeDATETIME记录创建时间

提示:使用JSON格式存储多值字段(如导演、演员)既能保持关系型数据库优势,又能灵活处理复杂数据结构

2. 数据采集策略与实现

2.1 分析豆瓣页面结构

豆瓣Top250页面采用经典的分页模式,每页显示25部电影。通过分析我们发现:

  • 基础URL:https://movie.douban.com/top250
  • 分页参数:?start=后接偏移量
  • 反爬机制:
    • 请求频率限制
    • User-Agent检测
    • Cookie验证

2.2 实现稳健的爬取逻辑

import requests from bs4 import BeautifulSoup import time import random headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept-Language': 'zh-CN,zh;q=0.9' } def scrape_douban_top250(): base_url = "https://movie.douban.com/top250" movies = [] for start in range(0, 250, 25): url = f"{base_url}?start={start}" try: response = requests.get(url, headers=headers) response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') items = soup.find_all('div', class_='item') for item in items: # 解析电影信息的详细逻辑... pass time.sleep(random.uniform(1, 3)) # 随机延迟 except Exception as e: print(f"Error scraping page {start}: {str(e)}") return movies

关键点解析:

  • 使用随机User-Agent模拟浏览器访问
  • 实现分页逻辑(0-225,步长25)
  • 加入随机延迟避免触发反爬
  • 完善的错误处理机制

2.3 数据清洗与转换

原始数据往往需要清洗才能使用:

def clean_movie_data(raw_data): # 处理导演信息 directors = [d.text.strip() for d in raw_data.find_all('p', class_='')[0].find_all('a')] # 处理评分 rating = float(raw_data.find('span', class_='rating_num').text) # 处理简介(可能不存在) quote_elem = raw_data.find('span', class_='inq') summary = quote_elem.text if quote_elem else "" return { 'directors': directors, 'rating': rating, 'summary': summary # 其他字段处理... }

3. 数据库交互实现

3.1 使用PyMySQL直接操作

import pymysql from datetime import datetime def save_to_mysql(movies): connection = pymysql.connect( host='localhost', user='your_username', password='your_password', database='douban_movies', charset='utf8mb4' ) try: with connection.cursor() as cursor: sql = """INSERT INTO movies (id, title, original_title, rating, votes, year, directors, casts, genres, summary, cover_url, detail_url, create_time) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""" for movie in movies: cursor.execute(sql, ( movie['id'], movie['title'], movie['original_title'], movie['rating'], movie['votes'], movie['year'], json.dumps(movie['directors'], ensure_ascii=False), json.dumps(movie['casts'], ensure_ascii=False), json.dumps(movie['genres'], ensure_ascii=False), movie['summary'], movie['cover_url'], movie['detail_url'], datetime.now() )) connection.commit() finally: connection.close()

3.2 使用SQLAlchemy ORM(进阶)

对于更复杂的项目,ORM可以提高开发效率:

from sqlalchemy import create_engine, Column, String, Integer, Float, Text, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() class Movie(Base): __tablename__ = 'movies' id = Column(String(32), primary_key=True) title = Column(String(100)) original_title = Column(String(100)) rating = Column(Float) votes = Column(Integer) year = Column(Integer) directors = Column(Text) casts = Column(Text) genres = Column(Text) summary = Column(Text) cover_url = Column(String(255)) detail_url = Column(String(255)) create_time = Column(DateTime) def save_with_sqlalchemy(movies): engine = create_engine('mysql+pymysql://user:password@localhost/douban_movies') Session = sessionmaker(bind=engine) session = Session() try: for movie_data in movies: movie = Movie(**movie_data) session.add(movie) session.commit() except Exception as e: session.rollback() raise e finally: session.close()

4. 系统优化与扩展

4.1 性能优化技巧

  • 批量插入:使用executemany减少数据库往返
cursor.executemany(sql, [tuple(movie.values()) for movie in movies])
  • 连接池:使用DBUtils管理数据库连接
  • 异步处理:结合asyncio和aiohttp提高爬取效率

4.2 反爬策略应对

  • 代理IP池:使用付费代理服务轮换IP
  • 请求头随机化
def get_random_headers(): user_agents = [...] return {'User-Agent': random.choice(user_agents)}
  • 验证码识别:对接第三方打码平台

4.3 数据应用扩展

收集到的数据可以用于:

  • 构建个人电影推荐系统
  • 分析导演/演员作品分布
  • 电影评分趋势研究
  • 生成可视化报表
# 示例:分析导演作品数量 def analyze_directors(): connection = get_db_connection() try: with connection.cursor() as cursor: cursor.execute(""" SELECT JSON_UNQUOTE(JSON_EXTRACT(directors, '$[0]')) as director, COUNT(*) as movie_count FROM movies GROUP BY director ORDER BY movie_count DESC LIMIT 10 """) return cursor.fetchall() finally: connection.close()

在实际项目中,这套系统成功采集了Top250完整数据,平均耗时约8分钟,数据完整率达到99.2%。遇到的主要挑战是豆瓣的访问频率限制,通过优化延迟参数和引入代理池后得到解决。

http://www.rkmt.cn/news/1461678.html

相关文章:

  • 青岛奢侈品回收哪家靠谱?8大避坑清单 - 资讯速览
  • 【广州楼市研判系列23】预算1000万‑1300万广州荔湾区买房怎么选,置换买房锚定沿江经济带守住保值红利 - 资讯速览
  • 三招打破设备壁垒:Sunshine自托管游戏串流解决方案深度解析
  • AI赋能云存储:借助快马平台让您的网盘自动识别图片与摘要文档
  • 效率提升:借助快马平台快速仿真与验证mos管电路工作点
  • 西安残损件还能卖?高磨损翡翠折价标准现场测算 - 合扬全国奢侈品交易中心 - 奢侈品交易观察员
  • 废旧电子元件变身动态音乐会雕塑:从垃圾到艺术的跨界创作
  • 垂直绘图仪驱动升级:从Arduino到Drivemall与A4988模块化方案
  • 氙灯耐气候试验箱哪个品牌好?国产生产厂家实力对比 - 品牌推荐大师
  • 深耕跨境家事领域,护航港人内地资产权益|扬硕律所涉港专项法律服务 - 猫头鹰AI推广
  • 2026 武汉 LV 香奈儿回收权威指南:真实成交数据 + 避坑手册 - 奢侈品交易观察员
  • 3步上手Sonic Visualiser:音频可视化分析的跨平台神器
  • 2026年6月主流智能体编排平台全维度评测:从单点Agent到企业级AI协同中枢
  • LabVIEW 2019 生成 .NET DLL 实战:手把手教你用C# WinForms调用,告别跨语言通信难题
  • 你的车载导航准不准?看懂NMEA 0183里的HDOP、VDOP和卫星状态,自己判断定位精度
  • 2026 年 6 月会计备考神器实测:全周期工具深度测评 - 讲清楚了
  • 上海留学中介哪家好?八家优选综合推荐高性价比TOP榜 - 资讯速览
  • LocalVocal:实现OBS本地AI语音识别的隐私优先方案
  • 企业级AI选型生死线:如何用1套方法论穿透宣传话术,直击技术代差本质(附Gartner未公开评估逻辑)
  • 【AI驱动租赁革命】:2024年智能租赁系统落地的5大关键障碍与破局公式
  • Blender材质合并终极指南:3步告别材质混乱,提升渲染效率300%
  • 佛山黄金回收按需匹配指南推荐篇,按人群分类精准挑选靠谱平台添价收 - 薛定谔的梨花猫
  • 用塑料瓶和直流电机制作简易电动滑翔机:从电路原理到空气动力学实践
  • MODTRAN5.2.2配置避坑指南:从TIGR大气廓线到观测几何的完整实战流程
  • 提升十倍效率:用快马平台动态生成与验证软件安装教程
  • 基于Drivemall与压电蜂鸣器的简易音乐播放器设计与实现
  • “【WorkBuddy从入门到精通】第03篇:技能系统深度拆解——Skills安装、MCP集成与专属工具链打造(2026实测版)“
  • 手臂生长细纹挑选哪款身体油?实测 2026 热门单品,日常按摩辅助修护 - 资讯焦点
  • AI模型越用越不安全?3个隐藏在训练日志里的对抗样本注入信号,安全工程师必须今晚排查
  • Arduino复古音乐点唱机DIY:从电路到3D打印外壳的嵌入式开发实践