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

目录

一、项目背景

二、代码

三、总结


一、项目背景

(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.rhkb.cn/news/278365.html

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

相关文章

Leetcode 1. 两数之和

心路历程: 很简单的题,双层暴力就可以,用双指针的话快一点。暴力时间复杂度O( n 2 n^2 n2),双指针时间复杂度O(nlogn) O(n) O(n) O(nlogn)。 注意的点: 1、题目需要返回原数组的索引,所以排序后还需要…

x6.js 从流程图组件库中拖拽组件到画布dnd使用

上一篇已经了解到了x6.js常用功能以及使用方法。但我们使用流程图的时候还少不了一个非常重要的功能那就是拖拽组件库里的组件进来。如下图: 首先是布局这块,拖拽组件库的视图中布局无需我们去写,我们只需把界面搭建好。 添加组件库 1.搭建布…

开班在即 | 全栈开发与自动化测试高薪私教班,带你从0到1拿到高薪Offer

随着ChatGPT的火爆以及人工智能的崛起,在互联网工作的我们仿佛都感受到了职业危机。同时,我们也应该看到,人工智能技术的发展也带来了新的机遇,只要利用好人工智能,便会大大提升我们的工作效率。比如说,我们…

数据结构与算法Bonus-KNN问题的代码求解过程

一、问题提出 (一)要求 1.随机生成>10万个三维点的点云,并以适当方式存储 2.自行实现一个KNN算法,对任意Query点,返回最邻近的K个点 3.不允许使用第三方库(e.g.flann,PCL,opencv)! 4.语言任选(推荐…

智慧城市与数字经济:共创城市新价值

随着科技的快速发展,智慧城市与数字经济已成为推动城市现代化进程的重要引擎。它们不仅提升了城市治理的效率和公共服务水平,还为城市经济发展注入了新的活力。本文旨在探讨智慧城市与数字经济如何共同创造城市新价值,并分析其面临的挑战与发…

【晴问算法】入门篇—贪心算法—整数配对

题目描述 有两个正整数集合S、T,其中S中有n个正整数,T中有m个正整数。定义一次配对操作为:从两个集合中各取出一个数a和b,满足a∈S、b∈T、a≤b,配对的数不能再放回集合。问最多可以进行多少次这样的配对操作。 输入描…

YOLOv5目标检测学习(4):YOLOV5源码的文件结构解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言①py、cpp、java后缀的文件②md、txt、yml后缀的文件③yaml后缀的文件 一、.github文件夹1.1 workflows文件夹:该文件夹通常包含GitHub Actions 的工…

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

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

软件工程-第3章 软件需求与软件需求规约

3.1 需求与需求的获取 需求发现技术:自悟、交谈、观察、小组会、提炼。 3.2 需求规约SRS及其格式 3.3 本章小结

Java 根据IP获取IP地址信息(离线)

<!-- https://mvnrepository.com/artifact/org.lionsoul/ip2region --><dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency> 地址&#xff1a;http…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

Windows,MacOS,Linux下载python并配置环境图文讲解

Windows 打开python官网 点击download 点击黄色按钮 另存为 打开文件 全选 配置安装路径 安装中 关闭路径长度限制 完成 验证 同时按住winr(win就是空格键左边的东西) 输入cmd 键入python,如果出现版本(红框)即安装成功 MacOS 同理打开python官网 点击最新版本 拖…

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

基于单片机的灭火机器人设计

目 录 摘 要 I Abstract II 引 言 1 1 系统方案设计 4 1.1 方案论证 4 1.2 灭火机器人系统工作原理 4 2 系统硬件设计 6 2.1 单片机 6 2.2 火焰探测系统设计 8 2.3 灭火系统设计 8 2.4 循迹模块设计 9 2.5 电机驱动模块 10 3 系统软件设计 12 3.1 系统软件开发环境 12 3.2 系统…

java入门 -输入和输出

输入输出 开发中大量会使用输入和输出&#xff0c;今天来总结一下Java语法阶段常使用的输入和输出。 输出 System.out 控制台输出信息。 不换行显示一行&#xff1a; System.out.print( ); System.out.print("hello "); System.out.print("java!");运行结…

EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

EMQX 5.0水平扩展能力得到了指数级提升&#xff0c;能够更可靠地承载更大规模的物联网设备连接量。 在EMQX5.0正式发布前的性能测试中&#xff0c;我们通过一个23节点的EMQX集群&#xff0c;全球首个达成了1亿MQTT连接每秒100万消息吞吐&#xff0c;这也使得EMQX 5.0成为目前为…

阿里云-云服务器ECS新手如何建网站?

租阿里云服务器一年要多少钱&#xff1f; 不同类型的服务器有不同的价格。 以ECS计算型c5为例&#xff1a;2核4G-1年518.40元&#xff0c;4核8G-1年948.00元。 阿里云ECS云服务器租赁价格由三部分组成&#xff1a; 也就是说&#xff0c;云服务器配置成本磁盘价格网络宽带价格…

Vue.js+SpringBoot开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

vue3动态组件未渲染问题

渲染问题 component动态组件写法与vue2写法一致&#xff0c;代码如下&#xff1a; <component :is"componentName"/><script setup>import { ref } from vueimport account from ./user/account.vue// 组件名称const componentName ref(account)// 点击…

算法详解——Dijkstra算法

Dijkstra算法的目的是寻找单起点最短路径&#xff0c;其策略是贪心加非负加权队列 一、单起点最短路径问题 单起点最短路径问题&#xff1a;给定一个加权连通图中的特定起点&#xff0c;目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是&#xff0c;这里关心…