豆瓣电影信息爬取与可视化分析

目录

一、项目背景

二、代码

三、总结


一、项目背景

(1)利用requests库采集豆瓣网分类排行榜 (“https://movie.douban.com/chart”)中各分类类别前100部电影的相关信息并存储为csv文件。

(2)利用获取的13个分类类别共1300部电影数据,获取电影所有上映国家并保存至csv文件。要求:其中index属性为国家或地区,columns属性为该国家发行电影的电影类型,值标识了各国家发行不同类型电影的数量信息。在表格的行尾和列尾分别加上属性“总计”,值为对应行、列的值加和;然后分别根据表格的index和columns“总计”进行从小到大排序。

(3)基于上述排序后的数据,选取发行电影数量最多的10个国家,选取电影类型最多的5个类型,使用matplotlib方法制作柱状堆叠图。其中横轴显示的国家,纵轴显示的电影数量,图例是各电影类别。

(4)分别获取13个分类类别对应的电影数量前7个国家,其他的用“其他”代替,计算每个分类类别对应的7个国家及“其他”部分的占比。使用matplotlib.pyplot.pie方法直观的显示这13个分类类别对应的国家发行电影数量占比,使用subplot方法进行多子图展示。

(5)计算获得所有电影的相似度(用欧式距离来定义),其中,DataFrame对象的index和columns均为所有的电影名称,值为两个电影的相似度。向每部电影推荐相似都最高的前5部电影。利用循环结构,循环提取每一部电影与其他所有电影的相似度数据,并进行排序,选择相似度最大(距离最近)的5部电影,同时将这5部电影的相似度记录下来。

二、代码

1、导入所需的Python包

#导包
import pandas as pd
import requests as rq
from bs4 import BeautifulSoup
import re
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore", category=pd.errors.PerformanceWarning)
warnings.filterwarnings("ignore", category=pd.errors.SettingWithCopyWarning)
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

各模块功能如下:

pandas:用于数据处理和存储。
requests:用于发送HTTP请求。
BeautifulSoup:用于解析HTML内容。
re:用于正则表达式操作。
numpy:用于数值计算。
matplotlib.pyplot:用于绘图。
warnings:用于过滤警告信息。
pylab:用于设置图形显示的默认配置。

2、爬取豆瓣电影信息

通过requests读取包含电影信息的json,并将其转换为DataFrame。

#电影分类
movie_types = ['剧情','喜剧','动作','爱情','科幻','悬疑','惊悚','恐怖','历史','战争','犯罪','奇幻','冒险']
#设置requests headers,应对反爬机制
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'}def get_douban_movies():'''项目内容:利用 requests 库采集豆瓣网分类排行榜(“https://movie.douban.com/chart”)中各分类类别前 100 部电影的相关信息'''#豆瓣电影主页homepage = 'https://movie.douban.com/chart'#爬取主页web = rq.get(homepage,headers=headers)#设置中文编码web.encoding = 'utf-8'#解析HTMLsoup = BeautifulSoup(web.text,'lxml')#获取分类列表urls = [span.a['href'] for span in soup.select('div.types span')]require_urls = ['https://movie.douban.com'+u for movie_type in movie_types for u in urls if movie_type in u]#获取每个分类的数字编号numbers = [re.search(r'type=(\d+)', url).group(1) for url in require_urls]#数据存储到data列表data = []#遍历爬取13个分类counts = 0for number in numbers:url = 'https://movie.douban.com/j/chart/top_list?type={}&interval_id=100%3A90&action=&start=0&limit=100'.format(number)response = rq.get(url,headers=headers)#获取JSON数据data_json = response.json()#遍历100个电影for i in data_json:data.append([i['title'],i['release_date'],i['regions'],i['types'],i['url'],i['actors'],i['actor_count'],i['score'],i['vote_count'],i['types']])counts += 1print("成功爬取第{}个电影分类".format(counts))#将列表data转换为表格,配置列名df = pd.DataFrame(data,columns=['title','release_date','regions','types','film_url','actors','actor_count','score','vote_count','fenlei'])return df

3、统计各国家地区发行电影数量

def get_df_counties(df):#打散国家地区df = df.explode('regions')#创建空表格,后面再填充数据df_counties = pd.DataFrame()#遍历每一个电影分类for t in movie_types:df_counties[t] = df['types'].apply(lambda x:1 if t in x else 0)df_counties['regions'] = df['regions']#汇总df_counties = df_counties.groupby('regions').sum()df_counties['总计'] = df_counties.sum(axis=1)#计算行方向的统计count_list = []for t in movie_types+['总计']:count_list.append(df_counties[t].sum())df_counties.loc['总计'] = count_listprint('统计完成')return df_counties

4、绘制各国家地区分类电影堆叠图

def draw_bar_diagram(select_data):# 创建堆叠柱状图ax = select_data.plot.bar(stacked=True, figsize=(10, 6))# 添加标题和标签plt.title('各国家地区分类电影堆叠图')plt.xlabel('国家地区')plt.ylabel('电影数目')# 显示图形plt.savefig('各国家地区分类电影堆叠图.jpg')plt.show()

绘制图像如下:

5、绘制各国家地区发行电影数量占比图

def draw_pie_diagram(df_counties):df_counties = df_counties.drop('总计')#处理数据df_list = []for t in movie_types:df_sub = df_counties[t].nlargest(7)df_sub.loc['其他'] = df_counties.drop(df_sub.index)[t].sum()df_list.append(df_sub)# 设置子图布局fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(10, 10))# 遍历每个电影类型的DataFramefor i, df in enumerate(df_list):# 将索引转换为整数类型#df.index = range(len(df))# 计算电影数量占比proportions = df / df.sum()# 绘制饼图ax = axes[i // 4, i % 4]ax.pie(proportions, labels=df.index, autopct='%1.1f%%', startangle=90)ax.set_title(df.name,fontdict={'fontsize': 20, 'color': 'black'})  # 使用电影类型作为子图标题#调整间距plt.subplots_adjust(wspace=0.5, hspace=2)#隐藏空白子图for i in range(len(df_list), 16):axes.flatten()[i].axis('off')plt.tight_layout()plt.savefig('各国家地区发行电影数量占比.jpg')# 显示图形plt.show()

绘制图像如下:

6、基于近邻规则生成推荐电影信息

def get_data_tuijian(df):df = df.drop_duplicates(subset='title', keep='first')#归一化df['score'] = (df['score'] - df['score'].min()) / (df['score'].max() - df['score'].min())df['vote_count'] = (df['vote_count'] - df['vote_count'].min()) / (df['vote_count'].max() - df['vote_count'].min())data = df[['title','score', 'vote_count']]#遍历每部电影,计算与其他电影的相似度for t in data.title.unique():col = data[data.title==t].iloc[0]sim_values = []for _ ,row in data.iterrows():sim_values.append(np.sqrt((row['score']-col['score'])**2+(row['vote_count']-col['vote_count'])**2))data[t] = sim_values#data[t] = (data[t] - data[t].min()) / (data[t].max() - data[t].min())#设置索引data.index=data.titledata = data.drop(columns=['title', 'score', 'vote_count'])data_tuijian = pd.DataFrame()data_tuijian['电影名称'] = data.indexdata_tuijian[['推荐电影1', '推荐电影2', '推荐电影3', '推荐电影4', '推荐电影5','与电影1相似度', '与电影2相似度', '与电影3相似度', '与电影4相似度', '与电影5相似度']] = None#遍历每一部电影,提取每一部电影的前5最相似电影for c in data.columns:top5 = data[c].sort_values().iloc[1:6].reset_index().valuesfor i in range(5):data_tuijian.loc[data_tuijian['电影名称']==c,'推荐电影'+str(i+1)] = top5[i][0]data_tuijian.loc[data_tuijian['电影名称']==c,'与电影{}相似度'.format(i+1)] = top5[i][1]print('推荐信息获取完成')return data_tuijian

7、主程序

if __name__ == '__main__':print('===========项目1、豆瓣电影信息爬取与存储==========')df = get_douban_movies()df.to_csv('film_info.csv',index=False,encoding='utf-8-sig')print('===========项目2、国家地区发行各类别电影的可视化分析==========')df_counties = get_df_counties(df)df_counties.to_csv('df_counties.csv',encoding='utf-8-sig')#绘制图表select_data = df_counties.sort_values(by='总计',ascending=False).iloc[:11]columns = select_data.iloc[0].sort_values(ascending=False).iloc[1:6].index.to_list()select_data = select_data[columns].iloc[1:] draw_bar_diagram(select_data)draw_pie_diagram(df_counties)print('===========项目3、基于近邻的电影推荐研究==========')df = pd.read_csv('film_info.csv')data_tuijian = get_data_tuijian(df)data_tuijian.to_csv('data_tuijian.csv',index=False,encoding='utf-8-sig')

三、总结

本项目主要考察的是对requests爬虫、pandas数据处理、matplotlib绘图等Python模块的使用,难度不大。

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

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

相关文章

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网,并且搭建了ntp服务给其他主机同步 另外一个没有连接外网,通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器,主…

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时,经常会与数据库打交道,一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句,每当写完SQL语句的时候总是有黄色下划线,看着很不舒服。 解决方案: 修改idea的配置 Edi…

服务器段的连接端口和监听端口编程实现

new ServerSocket(int)是开启监听端口,并不是连接端口。真正的连接端口是随机开辟的空闲端口,当连接创建完成后,监听关口可以继续等待下一次连接请求,处于空闲等待状态。 编程实现方式 1 、主线程一直处于阻塞等待状态&#xff0c…

C 练习实例77-指向指针的指针-二维数组

关于数组的一些操作 #include<stdio.h> #include<stdio.h> void fun(int b[],int length) {for(int i0;i<length;i){printf("%d ",b[i]);}printf("\n");for(int i0;i<length;i){ //数组作为形参传递&#xff0c;传递的是指针&#xff0…

人工智能如何撬动新质生产力发展?

全国两会期间&#xff0c;“新质生产力”成为高频词&#xff0c;引发高度关注。新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级催生的当代先进生产力。而人工智能被视为形成新质生产力的重要引擎。 随着人工智能&#xff08;AI&#xff09;技术跨越奇点…

Python3+RIDE+RobotFramework自动化测试框架搭建

Python2.7已于2020年1月1日开始停用&#xff0c;之前RF做自动化都是基于Python2的版本。 没办法&#xff0c;跟随时代的脚步&#xff0c;我们也不得不升级以应用新的控件与功能。 升级麻烦&#xff0c;直接全新安装。 一、Python安装 最新版Python下载地址&#xff1a;http…

Python环境下基于注意力机制的小样本轴承故障诊断

传统的基于特征提取与分类相结合的轴承智能诊断算法&#xff0c;对信号处理要求很高的专家经验&#xff0c;既费时又缺乏通用性。基于深度学习的智能轴承故障诊断方由于具有强大的特征提取能力&#xff0c;避免了繁琐复杂的特征提取工作&#xff0c;但是大多数研究都是在标准数…

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日&#xff0c;2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办&#xff0c;众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展&#xff0c;为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节&#xff0c;纷享销客凭借其卓…

【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、除法运算&#xff1a; 拓展&#xff1a;MySQL中常用的几种除法运算 1、取整除法 2、浮点数除法 3、取余除法 4、向上取整除法 5、向下取整除法 2、运算结果的精度处理 1.1、浮点数 1.2、总位数 1.3、…

android 怎么自定义view

首先了解view的绘制流程: 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout,确定子view 而onDraw----是继承view时候需要操作的。 所以:自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件。 自定义Vi…

python打包时遇见第三方包有隐藏依赖或者出现依赖错误

使用pyinstaller 打包成exe 文件步骤&#xff1a; 1.创建虚拟环境&#xff0c;并激活虚拟环境 #创建虚拟环境 python -m venv myenv #激活虚拟环境&#xff08;windows&#xff09; myenv\Scripts\activate2.导出需要的依赖 pip freeze > requirements.txt 或者 pip list …

AutoCAD 2020:三维建模与渲染,设计未来的建筑蓝图

AutoCAD 2020是一款功能强大且广泛应用的计算机辅助设计软件&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;满足了机械、建筑、家居、纺织等诸多行业的设计需求。以下是AutoCAD 2020的一些主要功能介绍&#xff1a; 保存和安装优化&#xff1a;AutoCAD 2020在性能上进…

观成科技-基于自适应学习的人工智能加密流量检测技术

1.前言 人工智能技术的广泛应用正在深刻改变我们的生活。在网络安全领域&#xff0c;基于机器学习的检测技术也应用在许多场景中。随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;加密技术逐渐成为保障网络安全和数据隐私的核心手段&#xff0c;而基于机器学习的检…

每日五道java面试题之mybatis篇(四)

目录&#xff1a; 第一题. 映射器#{}和${}的区别第二题. 模糊查询like语句该怎么写?第三题. 在mapper中如何传递多个参数?第四题. Mybatis如何执行批量操作第五题 MyBatis框架适用场景 第一题. 映射器#{}和${}的区别 #{}是占位符&#xff0c;预编译处理&#xff1b;${}是拼接…

windows 安装cuda 11.2过程记录

参考&#xff1a; https://blog.csdn.net/m0_45447650/article/details/123704930 https://zhuanlan.zhihu.com/p/99880204?from_voters_pagetrue 在显卡驱动被正确安装的前提下&#xff0c;在命令行里输入nvidia-smi.exe 下载CUDA Toolkit: https://developer.nvidia.com/…

CrossEntropyLoss 和NLLLoss的关系

交叉熵损失在做一件什么事? 看公式: x是预测(不需要softmax归一化),y是label, N是batch维度的数量,交叉熵损失,干了三件事. 1. 对输入在类别维度求softmax 2. 多softmax后的数,求log 3. 对(样本数, 类别数)为shape的tensor计算NLLLoss. 其中,NLLloss做的就是log取负, 和o…

java入门 - 规范你的代码注释

java基础语法-代码注释 注释只是为了提高可读性&#xff0c;不会被计算机编译。代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。 开发中注释可以分为三种方式&#xff1a; 行注释块注释类/方法注释…

Linux 大页内存 Huge Pages 虚拟内存

Linux 大页内存 Huge Pages 虚拟内存 - 秋来叶黄 - 博客园 (cnblogs.com) Linux为什么要有大页内存&#xff1f;为什么DPDK必须要设置大页内存&#xff1f;这都是由系统架构决定的。一开始为了解决一个问题&#xff0c;设计了对应的方案&#xff0c;随着事物的发展&#xff0c…

Splitpanes拆分窗格插件使用

目录 基本用法 纵向排列 遍历渲染 动态拆分宽度 项目开发中用到了拆分窗格(就是下面的效果&#xff0c;可以拆分网页&#xff0c;我们项目通常都是用左右两块拆分&#xff0c;可以通过拖动图标进行左右拖动)&#xff0c;于是就发现了一个很好用的插件&#xff1a;Splitpane…

上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分同学在开始做计算机图像的时候&#xff0c;是没有意识到畸变矫正这个问题的。当然不仅仅是畸变矫正&#xff0c;很多同学还会忽略光源的问题…