豆瓣电影Top250爬虫与可视化分析平台开发实战

技术选型与架构设计

技术栈选择

  1. Python:作为主要开发语言,用于实现爬虫和Web应用
  2. Flask:轻量级Web框架,用于搭建后端服务
  3. BeautifulSoup:HTML解析库,用于提取网页数据
  4. SQLite3:轻量级数据库,用于存储电影信息
  5. Echarts:数据可视化库,用于展示评分分布和词频统计
  6. WordCloud:词云生成库,用于生成电影名称词云图

项目架构

核心代码实现

网络爬虫实现
python 复制代码
# 导入必要的库
import urllib.request
from bs4 import BeautifulSoup
import re
import sqlite3
import xlwt

# 定义爬取函数
def get_movie_info(url):
    # 发送HTTP请求
    response = urllib.request.urlopen(url)
    html = response.read().decode('utf-8')
    
    # 解析HTML页面
    soup = BeautifulSoup(html, 'html.parser')
    
    # 提取电影信息
    movies = []
    movie_items = soup.find_all('div', class_='item')
    
    for item in movie_items:
        movie = {}
        # 提取电影排名
        movie['rank'] = re.findall(r'\d+', item.find('em').text)[0]
        # 提取电影名称
        movie['title'] = item.find('span', class_='title').text
        # 提取评分
        movie['rating'] = item.find('span', class_='rating_num').text
        # 提取评价人数
        movie['votes'] = re.findall(r'\d+', item.find('div', class_='star').find_all('span')[-1].text)[0]
        # 提取一句话概述
        quote = item.find('span', class_='inq')
        movie['quote'] = quote.text if quote else ''
        
        movies.append(movie)
    
    return movies

# 主函数
def main():
    base_url = 'https://movie.douban.com/top250?start='
    movies = []
    
    # 爬取10页数据
    for i in range(0, 250, 25):
        url = base_url + str(i)
        page_movies = get_movie_info(url)
        movies.extend(page_movies)
    
    # 保存到Excel文件
    save_to_excel(movies)
    
    # 保存到SQLite数据库
    save_to_sqlite(movies)

if __name__ == '__main__':
    main()
Web应用实现
python 复制代码
# 导入必要的库
from flask import Flask, render_template, request
import sqlite3
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

# 初始化Flask应用
app = Flask(__name__)

# 首页路由
@app.route('/')
def index():
    return render_template('index.html')

# 电影列表路由
@app.route('/movies')
def movies():
    # 从数据库中获取电影信息
    conn = sqlite3.connect('top250.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM movies')
    movies = cursor.fetchall()
    conn.close()
    
    return render_template('movies.html', movies=movies)

# 评分分布路由
@app.route('/rating')
def rating():
    # 从数据库中获取评分数据
    conn = sqlite3.connect('top250.db')
    cursor = conn.cursor()
    cursor.execute('SELECT rating FROM movies')
    ratings = cursor.fetchall()
    conn.close()
    
    # 处理评分数据
    rating_distribution = {}
    for rating in ratings:
        rating = float(rating[0])
        rating_range = f"{int(rating)}-{int(rating)+0.9}"
        if rating_range in rating_distribution:
            rating_distribution[rating_range] += 1
        else:
            rating_distribution[rating_range] = 1
    
    return render_template('rating.html', rating_distribution=rating_distribution)

# 词频统计路由
@app.route('/wordcloud')
def wordcloud():
    # 从数据库中获取电影名称
    conn = sqlite3.connect('top250.db')
    cursor = conn.cursor()
    cursor.execute('SELECT title FROM movies')
    titles = cursor.fetchall()
    conn.close()
    
    # 对电影名称进行分词
    words = []
    for title in titles:
        words.extend(jieba.lcut(title[0]))
    
    # 生成词云图
    wordcloud = WordCloud(
        font_path='simhei.ttf',
        background_color='white',
        mask=np.array(Image.open('cat.jpg'))
    ).generate(' '.join(words))
    
    # 保存词云图
    wordcloud.to_file('static/wordcloud.png')
    
    return render_template('wordcloud.html')

# 启动应用
if __name__ == '__main__':
    app.run(debug=True)

项目成果与展示

本项目成功爬取豆瓣电影Top250的完整信息,涵盖电影排名、名称、评分、评价人数和一句话概述等核心数据,并将数据持久化存储到Excel文件和SQLite数据库中。基于Flask框架搭建的Web应用实现了四大核心功能模块:首页展示项目简介与热门电影推荐、电影列表页呈现完整Top250电影信息、评分分布页通过Echarts可视化展示不同评分区间的电影数量与占比、词云页生成以猫咪图片为背景的电影名称高频词汇云图,全方位满足用户对电影信息的浏览、查询和分析需求。





项目总结与展望

通过这个项目,我不仅提升了Python编程能力,还学习了网络爬虫、数据处理和Web开发等技术。项目中遇到的主要挑战是豆瓣反爬虫机制的处理。

未来进一步优化的方面:

  1. 实现电影搜索和筛选功能
  2. 增加用户评论和评分功能
  3. 优化词云图生成算法,提高展示效果

这个项目展示了我在Python开发、数据处理和Web应用开发方面的能力,也为我今后的学习和工作打下了坚实的基础。

相关推荐
喵手14 小时前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手14 小时前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
喵手16 小时前
Python爬虫实战:全站 Sitemap 自动发现 - 解析 sitemap.xml → 自动生成抓取队列的工业级实现!
爬虫·python·爬虫实战·零基础python爬虫教学·sitemap·解析sitemap.xml·自动生成抓取队列实现
iFeng的小屋17 小时前
【2026年新版】Python根据小红书关键词爬取所有笔记数据
笔记·爬虫·python
Love Song残响17 小时前
揭秘Libvio爬虫:动态接口与逆向实战
爬虫
喵手19 小时前
Python爬虫实战:构建招聘会数据采集系统 - requests+lxml 实战企业名单爬取与智能分析!
爬虫·python·爬虫实战·requests·lxml·零基础python爬虫教学·招聘会数据采集
iFeng的小屋20 小时前
【2026最新当当网爬虫分享】用Python爬取千本日本相关图书,自动分析价格分布!
开发语言·爬虫·python
数研小生21 小时前
关键词搜索京东列表API技术对接指南
大数据·数据库·爬虫
喵手21 小时前
Python爬虫实战:网页截图归档完全指南 - 构建生产级页面存证与历史回溯系统!
爬虫·python·爬虫实战·零基础python爬虫教学·网页截图归档·历史回溯·生产级方案
Blurpath住宅代理1 天前
动态代理的五大优点:提升爬虫效率与安全性
网络·爬虫·动态ip·住宅ip·住宅代理