用Python爬取电影数据并可视化分析

 3f6a7ab0347a4af1a75e6ebadee63fc1.gif

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

一、获取数据

1.技术工具

2.爬取目标

3.字段信息

二、数据预处理

1.加载数据

2.异常值处理

3.字段处理

三、数据可视化

四、总结

文末福利


 

一、获取数据

1.技术工具

IDE编辑器:vscode

发送请求:requests

解析工具:xpath

def Get_Detail(Details_Url):Detail_Url = Base_Url + Details_UrlOne_Detail = requests.get(url=Detail_Url, headers=Headers)One_Detail_Html = One_Detail.content.decode('gbk')Detail_Html = etree.HTML(One_Detail_Html)Detail_Content = Detail_Html.xpath("//div[@id='Zoom']//text()")Video_Name_CN,Video_Name,Video_Address,Video_Type,Video_language,Video_Date,Video_Number,Video_Time,Video_Daoyan,Video_Yanyuan_list = None,None,None,None,None,None,None,None,None,Nonefor index, info in enumerate(Detail_Content):if info.startswith('◎译  名'):Video_Name_CN = info.replace('◎译  名', '').strip()if info.startswith('◎片  名'):Video_Name = info.replace('◎片  名', '').strip()if info.startswith('◎产  地'):Video_Address = info.replace('◎产  地', '').strip()if info.startswith('◎类  别'):Video_Type = info.replace('◎类  别', '').strip()if info.startswith('◎语  言'):Video_language = info.replace('◎语  言', '').strip()if info.startswith('◎上映日期'):Video_Date = info.replace('◎上映日期', '').strip()if info.startswith('◎豆瓣评分'):Video_Number = info.replace('◎豆瓣评分', '').strip()if info.startswith('◎片  长'):Video_Time = info.replace('◎片  长', '').strip()if info.startswith('◎导  演'):Video_Daoyan = info.replace('◎导  演', '').strip()if info.startswith('◎主  演'):Video_Yanyuan_list = []Video_Yanyuan = info.replace('◎主  演', '').strip()Video_Yanyuan_list.append(Video_Yanyuan)for x in range(index + 1, len(Detail_Content)):actor = Detail_Content[x].strip()if actor.startswith("◎"):breakVideo_Yanyuan_list.append(actor)print(Video_Name_CN,Video_Date,Video_Time)f.flush()try:csvwriter.writerow((Video_Name_CN,Video_Name,Video_Address,Video_Type,Video_language,Video_Date,Video_Number,Video_Time,Video_Daoyan,Video_Yanyuan_list))except:pass

保存数据:csv

if __name__ == '__main__':with open('movies.csv','a',encoding='utf-8',newline='')as f:csvwriter = csv.writer(f)csvwriter.writerow(('Video_Name_CN','Video_Name','Video_Address','Video_Type','Video_language','Video_Date','Video_Number','Video_Time','Video_Daoyan','Video_Yanyuan_list'))spider(117)

2.爬取目标

        本次爬取的目标网站是阳光电影网https://www.ygdy8.net,用到技术为requests+xpath。主要获取的目标是2016年-2023年之间的电影数据。

3.字段信息

        获取的字段信息有电影译名、片名、产地、类别、语言、上映时间、豆瓣评分、片长、导演、主演等,具体说明如下:

字段名含义

Video_Name_CN

电影译名

Video_Name

电影片名

Video_Address

电影产地

Video_Type

电影类别

Video_language

电影语言

Video_Date

上映时间

Video_Number

电影评分

Video_Time

片长

Video_Daoyan

导演

Video_Yanyuan_list

主演列表

2eb1c81e86c946a9bb0f639a603507ec.png

二、数据预处理

技术工具:jupyter notebook

1.加载数据

首先使用pandas读取刚用爬虫获取的电影数据

9777abe0e1d343f683e8693af8b2d2e7.png

2.异常值处理

这里处理的异常值包括缺失值和重复值

首先查看原数据各字段的缺失情况

7eb50ac4e1514425a915b6dec4483703.png

 从结果中可以发现缺失数据还蛮多的,这里就为了方便统一删除处理,同时也对重复数据进行删除

831de5c76758493c8127b2e4c55ed5d8.png

可以发现经过处理后的数据还剩1711条。

3.字段处理

由于爬取的原始数据中各个字段信息都很乱,出现很多“/”“,”之类的,这里统一进行处理,主要使用到pandas中的apply()函数,同时由于我们分析的数2016-2023年的电影数据,除此之外的进行删除处理

# 数据预处理
data['Video_Name_CN'] = data['Video_Name_CN'].apply(lambda x:x.split('/')[0]) # 处理Video_Name_CN
data['Video_Name'] = data['Video_Name'].apply(lambda x:x.split('/')[0]) # 处理Video_Name
data['Video_Address'] = data['Video_Address'].apply(lambda x:x.split('/')[0])  # 处理Video_Address
data['Video_Address'] = data['Video_Address'].apply(lambda x:x.split(',')[0].strip())
data['Video_language'] = data['Video_language'].apply(lambda x:x.split('/')[0])
data['Video_language'] = data['Video_language'].apply(lambda x:x.split(',')[0])
data['Video_Date'] = data['Video_Date'].apply(lambda x:x.split('(')[0].strip())
data['year'] = data['Video_Date'].apply(lambda x:x.split('-')[0])
data['Video_Number'] = data['Video_Number'].apply(lambda x:x.split('/')[0].strip())
data['Video_Number'] = pd.to_numeric(data['Video_Number'],errors='coerce')
data['Video_Time'] = data['Video_Time'].apply(lambda x:x.split('分钟')[0])
data['Video_Time'] = pd.to_numeric(data['Video_Time'],errors='coerce')
data['Video_Daoyan'] = data['Video_Daoyan'].apply(lambda x:x.split()[0])
data.drop(index=data[data['year']=='2013'].index,inplace=True)
data.drop(index=data[data['year']=='2014'].index,inplace=True)
data.drop(index=data[data['year']=='2015'].index,inplace=True)
data.dropna(inplace=True)
data.head()

d4b371dc9cd5455abf1680f37929c04b.png

三、数据可视化

1.导入可视化库

本次可视化主要用到matplotlib、seaborn、pyecharts等第三方库

import matplotlib.pylab as plt
import seaborn as sns
from pyecharts.charts import *
from pyecharts.faker import Faker
from pyecharts import options as  opts 
from pyecharts.globals import ThemeType
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示

2.分析各个国家发布的电影数量占比

# 分析各个国家发布的电影数量占比
df2 = data.groupby('Video_Address').size().sort_values(ascending=False).head(10)
a1 = Pie(init_opts=opts.InitOpts(theme = ThemeType.LIGHT))
a1.add(series_name='电影数量',data_pair=[list(z) for z in zip(df2.index.tolist(),df2.values.tolist())],radius='70%',)
a1.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item'))
a1.render_notebook()

0cb43f91c069428a869464b8154f2356.png

3.发布电影数量最高Top5导演

# 发布电影数量最高Top5导演
a2 = Bar(init_opts=opts.InitOpts(theme = ThemeType.DARK))
a2.add_xaxis(data['Video_Daoyan'].value_counts().head().index.tolist())
a2.add_yaxis('电影数量',data['Video_Daoyan'].value_counts().head().values.tolist())
a2.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(color='#B87333'))
a2.set_series_opts(label_opts=opts.LabelOpts(position="top"))
a2.render_notebook()

3729dda2f8134060be3c22b02877201d.png

4.分析电影平均评分最高的前十名国家

# 分析电影平均评分最高的前十名国家
data.groupby('Video_Address').mean()['Video_Number'].sort_values(ascending=False).head(10).plot(kind='barh')
plt.show()

b5c0bb8766ad4b59a956bd85eb80d771.png

5.分析哪种语言最受欢迎

# 分析哪种语言最受欢迎
from pyecharts.charts import WordCloud
import collections
result_list = []
for i in data['Video_language'].values:word_list = str(i).split('/')for j in word_list:result_list.append(j)
result_list
word_counts = collections.Counter(result_list)
# 词频统计:获取前100最高频的词
word_counts_top = word_counts.most_common(100)
wc = WordCloud()
wc.add('',word_counts_top)
wc.render_notebook()

0a6985be59194a13b35e0ebcffa99eb0.png

6.分析哪种类型电影最受欢迎

# 分析哪种类型电影最受欢迎
from pyecharts.charts import WordCloud
import collections
result_list = []
for i in data['Video_Type'].values:word_list = str(i).split('/')for j in word_list:result_list.append(j)
result_list
word_counts = collections.Counter(result_list)
# 词频统计:获取前100最高频的词
word_counts_top = word_counts.most_common(100)
wc = WordCloud()
wc.add('',word_counts_top)
wc.render_notebook()

a45b8c08cbdc42b89ed7e49665b2b3d5.png

7.分析各种类型电影的比例

# 分析各种类型电影的比例
word_counts_top = word_counts.most_common(10)
a3 = Pie(init_opts=opts.InitOpts(theme = ThemeType.MACARONS))
a3.add(series_name='类型',data_pair=word_counts_top,rosetype='radius',radius='60%',)
a3.set_global_opts(title_opts=opts.TitleOpts(title="各种类型电影的比例",pos_left='center',pos_top=50))
a3.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item',formatter='{a} <br/>{b}:{c} ({d}%)'))
a3.render_notebook()

55179367949d41dabc16322715245895.png

 8.分析电影片长的分布

# 分析电影片长的分布
sns.displot(data['Video_Time'],kde=True)
plt.show()

198a8105d28e49f5bfad37f07c7bb327.png

 9.分析片长和评分的关系

# 分析片长和评分的关系
plt.scatter(data['Video_Time'],data['Video_Number'])
plt.title('片长和评分的关系',fontsize=15)
plt.xlabel('片长',fontsize=15)
plt.ylabel('评分',fontsize=15)
plt.show()

0f8408e04743414f9a96ab8ca3a9f380.png

10.统计 2016 年到至今的产出的电影总数量

# 统计 2016 年到至今的产出的电影总数量
df1 = data.groupby('year').size()
line = Line()
line.add_xaxis(xaxis_data=df1.index.to_list())
line.add_yaxis('',y_axis=df1.values.tolist(),is_smooth = True)  
line.set_global_opts(xaxis_opts=opts.AxisOpts(splitline_opts = opts.SplitLineOpts(is_show=True)))
line.render_notebook()

b5c16c900c4f42cbb97da0958808dd34.png

四、总结

本次实验通过使用爬虫获取2016年-2023年的电影数据,并可视化分析的得出以下结论:

1.2016年-2019年电影数量逐渐增大,2019年达到最大值,从2020年开始迅速逐年下降。

2.发布电影数量最多的国家是中国和美国。

3.电影类型最多的剧情片。

4.电影片长呈正态分布,且片长和评分呈正相关关系。

 

文末福利

《MySQL数据库基础与实战应用》免费送出!

aba35a4fc7394d8799e66d36c467b01a.jpeg

内容简介:

        MySQL 数据库性能优越,功能强大,是深受读者欢迎的开源数据库之一。本书由浅入深、循序渐进、系统地介绍了MySQL 的相关知识及其在数据库开发中的实际应用,并通过具体案例,帮助读者巩固所学知识,以便更好地开发实践。

        全书共分为13 章,内容涵盖了认识与理解数据库、安装与配置MySQL 数据库、数据库与数据表的基本操作、数据查询、索引的创建与管理、视图的创建与管理、触发器、事务、事件、存储过程与存储函数、访问控制与安全管理、数据库的备份与恢复,以及综合的实践教学项目—图书管理系统数据库设计。

        本书结合全国计算机等级考试二级MySQL 考试大纲编写,章节后面配有习题,适当融入思政元素,并配备了相应的教案与课件。本书内容丰富,讲解深入,适合初级、中级MySQL 用户,既可以作为各类高等职业技术院校与职业本科院校相关专业的课程教材,也可以作为广大MySQL 爱好者的实用参考书。

参与福利 

  • 抽奖方式:评论区随机抽取2位小伙伴免费送出!
  • 参与方式:关注博主、点赞、收藏、评论区评论“人生苦短,我用Python!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!
  • 活动截止时间:2023-04-13 20:00:00
  •  京东自营购买链接:https://item.jd.com/13663131.html

名单公布时间:2023-04-13 21:00:00  

90aa748736f44afd9cb6046bbe9e9bf3.png

 

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

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

相关文章

2024.1.7-实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功)

实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功) 目录 最终效果 原文链接 https://onedayxyy.cn/docs/prometheus-grafana-ecs 参考模板 https://i4t.com/ https://grafana.frps.cn &#x1f530; 额&#xff0c;注意哦: 他这个是通过frp来…

FastDFS安装与测试

目录 目标 版本 环境 官方文档 相关概念 安装FastDFS 启动FastDFS 关闭FastDFS 重启FastDFS 用命令测试上传文件 用命令测试下载文件 用命令测试删除文件 用HTTP的方式访问FastDFS中的文件 用HTTP的方式访问FastDFS中的文件整体流程 目标 在Linux服务器上搭建单…

Visual Studio C#创建windows服务程序

选择一个windows服务程序创建 命名一个项目名称双击Service1.cs文件&#xff0c;然后鼠标右键添加安装程序接下来&#xff0c;我们对服务做一些简单的配置&#xff0c;配置Account为LocalSystem&#xff0c;否则启动服务时需要输入账户和密码设置启动服务名称我们可以在OnSt…

机器视觉技能培养:桥接学院与工业界的鸿沟

在当前的教育体系中&#xff0c;大学生往往缺乏直接参与机器视觉工作的机会。本文将探讨机器视觉学习的重要性&#xff0c;分析技术指导和实践项目的必要性。并提出一个全面的机器视觉学习路线图。 机器视觉及其在现代工业中的应用 机器视觉是指利用计算机视觉技术对图像进行自…

MySql常用函数之 convert()、str_to_date()、date_format()、to_base64()、from_base64()等使用介绍

一、convert() 1、将日期字符串转换为 date 类型 select convert(2024-01-06, date) from dual; 输出&#xff1a; 2024-01-06 2、将日期字符串转换为 datetime 类型 select convert(2024-01-06, datetime) from dual; 输出&#xff1a; 2024-01-06 00:00:00 3、将日期转换…

解决Docker报错问题:Docker Desktop – Unexpected WSL error

最近因为准备在NAS上通过Docker容器方式安装MYSQL&#xff0c;发现https://hub.docker.com网站被墙了&#xff0c;无法自动安装&#xff0c;同时又找不到靠谱的离线镜像&#xff0c;所以准备在Window上安装Docker&#xff0c;通过电脑的网络代理制作离线镜像再上传到NAS上。 在…

【温故而知新】JavaScript数据结构详解

一、概念 JavaScript是一种弱类型的编程语言&#xff0c;它提供了一些内置的数据结构来存储和组织数据。 在计算机科学中&#xff0c;数据结构是一种特定的方式来组织和存储数据&#xff0c;以便于有效地访问和修改数据。在JavaScript中&#xff0c;数据结构是指相互之间存在…

PTA——分支结构练习02 用if-else语句判断上课周和放假

本题需要用if-else语句判断上课周和放假&#xff1a;输入1-12范围的数字表示月份&#xff08;month&#xff09;&#xff0c;若输入的月份是9-12和1时&#xff0c;输出“本学年上学期”&#xff1b;若输入的月份为2时&#xff0c;则输出“寒假&#xff01;”&#xff1b;若输入…

【AIGC-图片生成视频系列-6】SSR-Encoder:用于主题驱动生成的通用编码器

目录 一. 贡献概述 二. 方法详解 a) 训练阶段 b) 推理生成阶段&#xff1a; 三. 综合结果 四. 注意力可视化 五. 选择性主题驱动图像生成 六. 人体图像生成 七. 可推广到视频生成模型 八. 论文 九. 个人思考 稳定扩散&#xff08;Stable Diffusion&#xff09;模型可…

python豆瓣实例,抓取多页数据-应用到知识点:随时数,xpath,间隔请求sleep

源代码: <!DOCTYPE html> <html lang="zh-CN" class="ua-windows ua-webkit"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="renderer" content=&q…

Calibre PEX Hspice Netlist提取步骤(数模芯片提取spice netlist流程)

在数模混合芯片中&#xff0c;通常模拟需要数字模块通过calibre工具来提取Hspice netlist用于功耗仿真。注意这里的spice netlist和做Calibre的spice netlist是不太一样的。 另外在做calibre pex时需要确保当前的design LVS已经pass。否则功耗仿真可能会不准。 Calibre LVS常…

八. 实战:CUDA-BEVFusion部署分析-spconv原理

目录 前言0. 简述1. 举例分析spconv的计算流程2. 导出带有spconv网络的onnx需要考虑的事情总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章——实战&a…

【数据库原理】(13)视图的使用

文章目录 一.定义和删除视图1.建立视图2.删除视图 二.查询视图视图查询的基本操作视图查询的内部机制查询转换的注意事项视图查询的限制 三.更新视图1.插入视图数据2.删除视图数据3.修改视图数据可更新性的限制 视图&#xff08;View&#xff09; 是一种虚拟的表&#xff0c;它…

Next.js 第一次接触

因为需要整个漂亮的在线文档&#xff0c;所以接触了next.js&#xff0c;因为对前端js本身不够熟悉&#xff0c;别说对react.js 又不会&#xff0c;时间又不允许深入研究&#xff0c;所以&#xff0c;为了加一个导航菜单&#xff0c;极其痛苦。 有点小bug&#xff0c;不过不影响…

学习笔记:C++之 switch语句

Switch语句 作用&#xff1a;执行多条件分支语句 语法&#xff1a; switch&#xff08;表达式&#xff09;{ case 结果1&#xff1a;执行语句&#xff1b;break&#xff1b; case 结果2&#xff1a;执行语句&#xff1b;break&#xff1b; ... default&#xff1a;执行语句&a…

Golang leetcode142 环形链表 暴力map 快慢指针法

文章目录 环形链表 leetcode142暴力遍历 map哈希记录快慢指针法 环形链表 leetcode142 该题目要求找到入环的第一个节点 我们可以通过map进行记录&#xff0c;没到新的节点查询是否经过原有节点 入环节点&#xff0c;上两个节点的next相同 若有入环节点&#xff0c;则一定能检…

如何用python实现一个简单的单向链表?

实现一个简单的单向链表涉及两个基本的构建块&#xff1a;节点&#xff08;Node&#xff09;和链表&#xff08;LinkedList&#xff09;。下面是详细步骤和解释&#xff1a; 1. 实现节点&#xff08;Node&#xff09; 链表中的每个节点通常包含两部分&#xff1a;存储的数据&…

Flutter 图片和资源的高效使用指南

文章目录 指定资源什么是 [pubspec.yaml](https://dart.cn/tools/pub/pubspec) 文件 图片图片常用的配置属性加载本地图片通过 pubspec.yml 文件进行配置图片目录使用 Image.asset 小部件加载本地图片 加载网络图片通过 Image.network小部件加载网络图片&#xff1a;使用Image.…

LeCode:(606. 根据二叉树创建字符串)

题目链接 本体的难点&#xff1a; 什么时候去打印左右括号&#xff1f;什么时候省略&#xff1f; 解题过程&#xff1a;通过观察看到&#xff0c;每次遍历结点之前&#xff0c;打印了一个左括号&#xff1b;遍历到叶子&#xff0c;叶子的左右也要打印出括号来&#xff08;先…

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

原创/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建&#xff0c;但时间久了&#xff0c;都快忘记当时的搭建过程了&#xff0c;故而决定在虚拟机centOS 7的环境&#xff0c;自行搭建一套redis5.x版本的集群&#xff0c;该版本集群的搭建比较方便&#xff0c;不用再像…