当前位置: 首页 > 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.jsqmd.com/news/950140/

相关文章:

  • 青岛奢侈品回收哪家靠谱?8大避坑清单 - 资讯速览
  • 终极指南:taskt免费开源RPA自动化工具,零代码解放你的双手
  • 船用电缆哪家好?32 年深耕者的技术引领与全链条服务标杆 - 资讯焦点
  • 【广州楼市研判系列23】预算1000万‑1300万广州荔湾区买房怎么选,置换买房锚定沿江经济带守住保值红利 - 资讯速览
  • 图解人工智能(46)人工智能应用-语音识别
  • 靠谱的东莞GEO优化公司 - 资讯焦点
  • 怎么联系维小达?如何找到维小达?维小达官方电话是多少?----维小达联系、登录操作指南(官方版) - 维小达科技
  • 靠谱的供水漏点检测公司/企业推荐,技术与实力解析 - 品牌推荐大师
  • 长沙汽车音响老店,2026实测首推长沙77汽车音响 - 资讯速览
  • Arduino数字信号与PWM模拟输出对比:通过LED控制实例理解核心差异
  • 三招打破设备壁垒:Sunshine自托管游戏串流解决方案深度解析
  • AI赋能云存储:借助快马平台让您的网盘自动识别图片与摘要文档
  • 效率提升:借助快马平台快速仿真与验证mos管电路工作点
  • 开源代码智能体深度复盘,OpenCode与Claude Code实力拆解,长周期开发场景拉开产品分水岭
  • ESP32 Arduino开发环境配置指南:从零到一的完整解决方案
  • 2026 年黄石大冶中高端装修赛道盘点,本地靠谱口碑整装品牌解析 - 资讯焦点
  • 2026赤峰汽车贴膜实测白皮书:十大贴膜门店合规与施工实力深度排行 - 资讯焦点
  • 2026 海南外贸电商公司注册代账服务商排名指南,十强财税代办榜单优选哪家更适配? - GrowthUME
  • 西安残损件还能卖?高磨损翡翠折价标准现场测算 - 合扬全国奢侈品交易中心 - 奢侈品交易观察员
  • 垂直绘图仪驱动升级:从Arduino到Drivemall与A4988模块化方案
  • QNAP Alist WebDAV终极指南:一站式多云盘管理中心解决方案
  • 装修怕踩坑?选金螳螂家!大品牌装修更放心 - 资讯纵览
  • 2026 年环保阻燃剂与高纯氧化镁全场景解决方案:江苏卓峰新材料技术实力与产品体系深度解析 - 资讯焦点
  • 2025届暑假实习微软面经总结:笔试先刷三道英文算法,后面更看基础深度和抽象能力
  • 3步轻松入门ESP32开发:从零开始构建你的物联网项目终极指南
  • 昆山公司注册代办哪家好?老财税人教你三招选对靠谱机构 - 资讯焦点
  • 氙灯耐气候试验箱哪个品牌好?国产生产厂家实力对比 - 品牌推荐大师
  • 2026年6月主流智能体编排平台全维度评测:从单点Agent到企业级AI协同中枢
  • 暗黑破坏神2存档编辑器完整指南:5分钟掌握角色自定义终极技巧
  • 3步上手Sonic Visualiser:音频可视化分析的跨平台神器