大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现

news2025/1/21 0:58:33

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现

本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示,构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据,我们提供了一个全面的电影信息平台,为用户提供深入了解电影产业趋势、影片评价与演员表现的工具。项目的关键步骤包括数据采集、数据清洗、数据分析与可视化展示。首先,我们使用爬虫技术从豆瓣电影网站获取丰富的电影数据,包括电影基本信息、评分、评论等存储到Mysql数据库。然后,通过数据清洗与预处理,确保数据的质量与一致性,以提高后续分析的准确性。数据分析阶段主要包括对电影评分分布、不同类型电影的数量分布、评分、演员的影响力等方面的深入研究。基于Echarts进行可视化展示,借助Python中的数据分析库(如Pandas、NumPy)和可视化库(如Matplotlib、Seaborn),我们能够以图表的形式清晰地展示电影数据的特征和趋势。最终,我们将分析结果以交互式的可视化界面呈现,用户可以通过系统自定义的查询与过滤功能,深入挖掘他们感兴趣的电影信息。这个项目不仅为电影爱好者提供了一个全面的数据参考平台,也为电影产业从业者提供了洞察行业动向的工具。

最后我们爬取到的字段信息:电影名,评分,封面图,详情url,上映时间,导演,类型,制作国家,语言,片长,电影简介,星星比例,多少人评价,预告片,前五条评论,五张详情图片

 for i,moveInfomation in enumerate(moveisInfomation):
        try:
            resultData = {}
            # 详情
            resultData['detailLink'] = detailUrls[i]
            # 导演(数组)
            resultData['directors'] = ','.join(moveInfomation['directors'])
            # 评分
            resultData['rate'] = moveInfomation['rate']
            # 影片名
            resultData['title'] = moveInfomation['title']
            # 主演(数组)
            resultData['casts'] = ','.join(moveInfomation['casts'])
            # 封面
            resultData['cover'] = moveInfomation['cover']

            # =================进入详情页====================
            detailMovieRes = requests.get(detailUrls[i], headers=headers)
            soup = BeautifulSoup(detailMovieRes.text, 'lxml')
            # 上映年份
            resultData['year'] = re.findall(r'[(](.*?)[)]',soup.find('span', class_='year').get_text())[0]
            types = soup.find_all('span',property='v:genre')
            for i,span in enumerate(types):
                types[i] = span.get_text()
            # 影片类型(数组)
            resultData['types'] = ','.join(types)
            country = soup.find_all('span',class_='pl')[4].next_sibling.strip().split(sep='/')
            for i,c in enumerate(country):
                country[i] = c.strip()
            # 制作国家(数组)
            resultData['country'] = ','.join(country)
            lang = soup.find_all('span', class_='pl')[5].next_sibling.strip().split(sep='/')
            for i, l in enumerate(lang):
                lang[i] = l.strip()
            # 影片语言(数组)
            resultData['lang'] = ','.join(lang)

            upTimes = soup.find_all('span',property='v:initialReleaseDate')
            upTimesStr = ''
            for i in upTimes:
                upTimesStr = upTimesStr + i.get_text()
            upTime = re.findall(r'\d*-\d*-\d*',upTimesStr)[0]
            # 上映时间
            resultData['time'] = upTime
            if soup.find('span',property='v:runtime'):
                # 时间长度
                resultData['moveiTime'] = re.findall(r'\d+',soup.find('span',property='v:runtime').get_text())[0]
            else:
                # 时间长度
                resultData['moveiTime'] = random.randint(39,61)
            # 评论个数
            resultData['comment_len'] = soup.find('span',property='v:votes').get_text()
            starts = []
            startAll = soup.find_all('span',class_='rating_per')
            for i in startAll:
                starts.append(i.get_text())
            # 星星比例(数组)
            resultData['starts'] = ','.join(starts)
            # 影片简介
            resultData['summary'] = soup.find('span',property='v:summary').get_text().strip()

            # 五条热评
            comments_info = soup.find_all('span', class_='comment-info')
            comments = [{} for x in range(5)]
            for i, comment in enumerate(comments_info):
                comments[i]['user'] = comment.contents[1].get_text()
                comments[i]['start'] = re.findall('(\d*)', comment.contents[5].attrs['class'][0])[7]
                comments[i]['time'] = comment.contents[7].attrs['title']
            contents = soup.find_all('span', class_='short')
            for i in range(5):
                comments[i]['content'] = contents[i].get_text()
            resultData['comments'] = json.dumps(comments)

            # 五张详情图
            imgList = []
            lis = soup.select('.related-pic-bd img')
            for i in lis:
                imgList.append(i['src'])
            resultData['imgList'] = ','.join(imgList)

将结果保存到CSV文件和SQL数据库中,并在完成后更新页数记录。

从豆瓣电影数据中提取演员和导演的电影数量信息,以便后续的分析和可视化展示。

def getAllActorMovieNum():
    allData = homeData.getAllData()
    ActorMovieNum = {}
    for i in allData:
        for j in i[1]:
            if ActorMovieNum.get(j,-1) == -1:
                ActorMovieNum[j] = 1
            else:
                ActorMovieNum[j] = ActorMovieNum[j] + 1
    ActorMovieNum = sorted(ActorMovieNum.items(), key=lambda x: x[1])[-20:]
    x = []
    y = []
    for i in ActorMovieNum:
        x.append(i[0])
        y.append(i[1])
    return x,y

定义统计导演执导电影数量的函数getAllDirectorMovieNum():

def getAllDirectorMovieNum():
    allData = homeData.getAllData()
    ActorMovieNum = {}
    for i in allData:
        for j in i[4]:
            if ActorMovieNum.get(j,-1) == -1:
                ActorMovieNum[j] = 1
            else:
                ActorMovieNum[j] = ActorMovieNum[j] + 1
    ActorMovieNum = sorted(ActorMovieNum.items(), key=lambda x: x[1])[-20:]
    x = []
    y = []
    for i in ActorMovieNum:
        x.append(i[0])
        y.append(i[1])
    return x,y
  1. allData = homeData.getAllData():调用homeData模块中的getAllData函数,获取所有的电影数据,并将其保存在allData变量中。
  2. ActorMovieNum = {}:创建一个空字典ActorMovieNum,用于存储导演与其执导电影数量的映射。
  3. for i in allData::遍历所有电影数据,其中i代表每一部电影的信息。
  4. for j in i[4]::在每部电影的信息中,使用i[4]访问导演的信息,然后遍历每个导演。
  5. if ActorMovieNum.get(j, -1) == -1::检查字典ActorMovieNum中是否已经存在该导演的记录。如果不存在,则将该导演作为键加入字典,并将对应的值初始化为1。
  6. else::如果字典中已存在该导演的记录,则将对应的值加1,表示该导演又执导了一部电影。
  7. ActorMovieNum = sorted(ActorMovieNum.items(), key=lambda x: x[1])[-20:]:将字典中的导演及其执导电影数量按照电影数量进行降序排序,然后取排序后的前20项。排序的依据是key=lambda x: x[1],即按照字典中的值进行排序。
  8. x = []y = []:创建两个空列表,用于存储导演名称和对应的执导电影数量。
  9. for i in ActorMovieNum::遍历排序后的前20项导演及其执导电影数量。
  10. x.append(i[0])y.append(i[1]):将导演的名称和执导电影数量分别加入列表xy
  11. return x, y:返回存储导演名称和执导电影数量的两个列表。

从名为homeData的模块中导入getAllData函数,然后使用pandas库创建一个数据框(DataFrame)dfgetAllData函数的返回值被传递给DataFrame的构造函数,同时指定了数据框的列名。

  1. from . import homeData: 这行代码从当前目录(.表示当前目录)导入homeData模块。
  2. import pandas as ps: 这行代码导入pandas库,并使用ps作为别名。一般来说,pandas的别名是pd,但在这里使用了ps
  3. df = ps.DataFrame(homeData.getAllData(), columns=[...]): 这行代码创建一个数据框df,并使用homeData.getAllData()的返回值填充数据框。列名由columns参数指定,列的顺序与列表中的顺序相对应。列名包括:
    • ‘id’: 电影ID
    • ‘directors’: 导演
    • ‘rate’: 评分
    • ‘title’: 标题
    • ‘casts’: 演员
    • ‘cover’: 封面
    • ‘year’: 上映年份
    • ‘types’: 类型
    • ‘country’: 制片国家
    • ‘lang’: 语言
    • ‘time’: 时长
    • ‘moveiTime’: 电影时长
    • ‘comment_len’: 评论长度
    • ‘starts’: 星级
    • ‘summary’: 摘要
    • ‘comments’: 评论
    • ‘imgList’: 图片列表
    • ‘movieUrl’: 电影链接
    • ‘detailLink’: 详细链接

这样就创建了一个包含特定列名的数据框,其中的数据来自homeData.getAllData()函数的返回结果。

from . import homeData
import pandas as ps
df = ps.DataFrame(homeData.getAllData(),columns=[
        'id',
        'directors',
        'rate',
        'title',
        'casts',
        'cover',
        'year',
        'types',
        'country',
        'lang',
        'time',
        'moveiTime',
        'comment_len',
        'starts',
        'summary',
        'comments',
        'imgList',
        'movieUrl',
        'detailLink'
    ])

从数据框(DataFrame)中的’country’列中提取地址数据。数据框中的地址数据提取出来,并统计每个地址出现的次数。它首先检查’country’列中的每个元素,如果元素是一个列表,则将列表中的每个元素添加到一个新的列表(address)中。然后,它创建一个字典(addressDic),将地址作为键,出现次数作为值,最后返回地址列表和对应的出现次数列表。

def getAddressData():
    # 获取名为 'country' 的列的值
    addresses = df['country'].values
    
    # 创建一个空列表来存储地址
    address = []
    
    # 遍历 'country' 列的每个元素
    for i in addresses:
        # 如果元素是列表类型
        if isinstance(i, list):
            # 遍历列表中的每个元素并添加到 address 列表中
            for j in i:
                address.append(j)
        else:
            # 如果元素不是列表类型,直接将其添加到 address 列表中
            address.append(i)
    
    # 创建一个空字典来存储地址及其出现次数
    addressDic = {}
    
    # 遍历地址列表中的每个元素
    for i in address:
        # 如果地址字典中不存在该地址,则将其添加并设置出现次数为1
        if addressDic.get(i, -1) == -1:
            addressDic[i] = 1
        else:
            # 如果地址字典中已存在该地址,则将其出现次数加1
            addressDic[i] = addressDic[i] + 1
    
    # 返回地址列表和对应的出现次数列表
    return list(addressDic.keys()), list(addressDic.values())

从数据框的’lang’列中提取语言数据,并统计每种语言出现的次数。最终返回语言列表和对应的出现次数列表。

def getLangData():
    # 获取名为 'lang' 的列的值
    langs = df['lang'].values
    
    # 创建一个空列表来存储语言数据
    languages = []
    
    # 遍历 'lang' 列的每个元素
    for i in langs:
        # 如果元素是列表类型
        if isinstance(i, list):
            # 遍历列表中的每个元素并添加到 languages 列表中
            for j in i:
                languages.append(j)
        else:
            # 如果元素不是列表类型,直接将其添加到 languages 列表中
            languages.append(i)
    
    # 创建一个空字典来存储语言及其出现次数
    langsDic = {}
    
    # 遍历语言列表中的每个元素
    for i in languages:
        # 如果语言字典中不存在该语言,则将其添加并设置出现次数为1
        if langsDic.get(i, -1) == -1:
            langsDic[i] = 1
        else:
            # 如果语言字典中已存在该语言,则将其出现次数加1
            langsDic[i] = langsDic[i] + 1
    
    # 返回语言列表和对应的出现次数列表
    return list(langsDic.keys()), list(langsDic.values())

数据库创建四个表:
在这里插入图片描述
在这里插入图片描述
修改为自己的数据库主机名和账号密码:
在这里插入图片描述
启动项目:
在这里插入图片描述

服务端口:5000 http://127.0.0.1:5000

用户注册 http://127.0.0.1:5000/registry

在这里插入图片描述

用户登录

在这里插入图片描述

首页页面展示:

在这里插入图片描述

还有电影数据,包括电影名、评分、片场、预告片等数据。

在这里插入图片描述

查看电影预告片

在这里插入图片描述

电影搜索

在这里插入图片描述

电影产量分析

在这里插入图片描述

电影数据时长分布占比

在这里插入图片描述

电影评分统计分析

在这里插入图片描述

在这里插入图片描述

​ 豆瓣评分星级饼状图、豆瓣年度评价评分柱状图

在这里插入图片描述

​ 豆瓣电影中外评分分布图

在这里插入图片描述

数据视图切换

在这里插入图片描述
在这里插入图片描述

​ 电影拍摄地点统计图

在这里插入图片描述

​ 电影语言统计图

在这里插入图片描述

电影类型饼图

在这里插入图片描述

​ 导演作品数量前20

在这里插入图片描述

在这里插入图片描述

​ 数据表操作

在这里插入图片描述

​ 标题词云图

在这里插入图片描述

​ 简介词云图

在这里插入图片描述
s4XV8qh-1701860368769)

​ 演员名词云图

在这里插入图片描述

评论词云图

在这里插入图片描述
在这里插入图片描述
经过对一系列测试结果的有效分析,本平台开发系统符合用户的要求和需求。所有的基本功能齐全,可视化展示效果好,服务运行稳定,操作起来简单方便,测试系统性能、整体设计和代码逻辑都很Nice!

各位有兴趣的小伙伴 可以私信我要项目开发文档、完整项目源码和其它相关资料

后面有时间和精力也会分享更多关于大数据领域方面的优质内容,喜欢的小伙伴可以点赞关注收藏,有需要的都可以私信我!感谢各位的喜欢与支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1290418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS2019 下配置 OpenCV4.6.0 库

一、编辑电脑系统环境变量。 二、打开 VS2019 新建一个C项目。 1.进行Debug和Release的配置 X64 平台。 2.属性配置:VC目录 -> 包含目录 3.属性配置:VC目录 -> 库目录 4.属性配置:链接器 -> 输入 -> 附加依赖项 带 d 的 .lib 为 …

使用C语言操作kafka ---- librdkafka

1 安装librdkafka git clone https://github.com/edenhill/librdkafka.git cd librdkafka git checkout v1.7.0 ./configure make sudo make install sudo ldconfig 在librdkafka的examples目录下会有示例程序。比如consumer的启动需要下列参数 ./consumer <broker> &…

高工氢电年会 | 未势能源解超朋博士受邀出席并做主题演讲

12月4日&#xff0c;以“战略重构 商业觉醒”为主题的2023高工氢电年会在深圳举办&#xff0c;未势能源副总裁解超朋博士受邀出席开幕式论坛&#xff0c;以《把握机遇、直面挑战&#xff0c;迎接氢车规模化推广时代》为主题发表演讲&#xff0c;并参与圆桌论坛研讨。 氢势已来&…

C++类和对象——(8)类的组合

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

uniapp 设置内容超长时的省略样式

需求 在uniapp中&#xff0c;页面在展示搜索历史的时候&#xff0c;需要对内容过长的进行处理&#xff0c;也就是文本超出我的最大长度时&#xff0c;不允许换行&#xff0c;且末尾为省略 期望的效果如下 思路 使用 官网 text-overflow 可选值俩个 clip 修建文本ellipsi…

电脑版便签软件怎么设置在桌面上显示?

对于不少上班族来说&#xff0c;如果想要在使用电脑办公的时候&#xff0c;随手记录一些常用的工作资料、工作注意事项等内容&#xff0c;直接在电脑上使用便签软件记录是比较方便的。电脑桌面便签工具不仅方便我们随时记录各类工作事项&#xff0c;而且支持我们快速便捷使用这…

虚拟机网络设置

虚拟机网络设置 上一篇讲了虚拟机的安装与使用 因为虚拟机默认使用的是网络地址转换和端口转发的方式&#xff0c;这种方式对于后面的开发不方便&#xff0c;所以我们需要设置虚拟机网络。 直接修改虚拟机的网卡信息 进入虚拟机并和虚拟机建立连接&#xff0c;在虚拟机内修改…

分布式环境下的session 共享-基于spring-session组件和Redis实现

1、问题概述 不是所有的项目都是单机模式的&#xff0c;当一个项目服务的局域比较广&#xff0c;用户体量比较大&#xff0c;数据量较大的时候&#xff0c;我们都会将项目部署到多台服务器上&#xff0c;这些个服务器都是分布在不同的区域&#xff0c;这样实现了项目的负载和并…

Spring Boot 项目的创建、配置文件、日志

文章目录 Spring Boot 优点创建 Spring Boot 项目创建项目认识目录网页创建&#xff08;了解&#xff09; 约定大于配置Spring Boot 配置文件配置文件格式读取配置项properties 配置文件yml 配置文件基本语法进阶语法配置对象配置集合yml 设置不同环境的配置文件 Spring Boot 日…

使用MIB builder自定义物联网网关的MIB结构

文章目录 物联网网关初识&#xff08;了解即可&#xff09;IoT的通用MIB库结构MIB Builder开发流程指导问题总结子叶没所属分组值范围不为0 物联网网关初识&#xff08;了解即可&#xff09; 网关又称网间连接器、协议转换器。简单说&#xff0c;物联网网关是一台智能计算机&a…

Java集合进阶(上)

集合 集合在Java开发中应用极为广泛&#xff0c;它其实就是一些常用的数据结构的包装类&#xff0c;分为单列集合&#xff08;Collecton接口类&#xff0c;例如LinkdeList集合&#xff09;和双列集合&#xff08;Map接口类&#xff0c;例如HashMap集合)两种 Collection Coll…

Sprite Editor图片编辑器的使用_unity基础开发教程

Sprite Editor图片编辑器的使用 什么是Sprite Editor安装插件&#xff08;3D项目&#xff09;切片方式Automatic&#xff1a;自动切片Grid By Cell Size&#xff1a;按照像素大小进行切片Grid By Cell Count&#xff1a;按照个数进行切片Isometric Grid&#xff1a;等距网格切片…

Java利用UDP实现简单群聊

一、创建新项目 首先新建一个新的项目&#xff0c;并按如下操作 二、实现代码 界面ChatFrame类 package 群聊; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.InetAddress; public abstract class ChatFrame extends JFrame { p…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含pytho、JS工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度下降算法&#xff0c;按比例…

MAC 系统在vs code中,如何实现自动换行

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在vscode中&#xff0c;有些时候&#xff0c;一行内容过多&#xff0c;如果不能自动换行&#xff0c;就需要拖动页面&#xff0c;才能看到完整的内容。如下图两行所示&#xff1a; 问题解决&#xff1a…

华为数通---使用基本ACL限制Telnet登录权限案例

组网需求 如下图所示&#xff0c;PC与设备之间路由可达&#xff0c;用户希望简单方便的配置和管理远程设备&#xff0c;可以在服务器端配置Telnet用户使用AAA验证登录&#xff0c;并配置安全策略&#xff0c;保证只有符合安全策略的用户才能登录设备。 配置通过Telnet登录设备…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组&#xff08;样卷&#xff09; 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段教师组样题&#xff0c; 内容包括&#xff1a;网络安全渗透、理论技能与职业素养。 本次比赛时间为180分钟。 介绍 Ge…

Unity中Batching优化的GPU实例化(1)

文章目录 前言一、GPU实例化的规则1、必须满足 Mesh 网格一样2、只有OpenGL es 3.0及以上才支持&#xff08;3.0及以上有部分硬件可能也不支持&#xff09; 二、GPU实例化的应用场景1、公开几个成员属性&#xff0c;用于存放可以调整的数据2、用Random.insideUnitCircle随机生成…

Linux(ubuntu)利用ffmpeg+qt设计rtsp_rtmp流媒体播放器(完全从0开始搭建环境进行开发)

一、前言 从0开始搭建Linux下Qt、ffmpeg开发环境。 从安装虚拟机开始、安装Linux(Ubuntu)系统、安装Qt开发环境、编译ffmpeg源码、配置ffmpeg环境、编写ffmpeg项目代码、完成项目开发。 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开…