当前位置: 首页 > news >正文

Python爬取影评并进行情感分析和数据可视化

Python爬取影评并进行情感分析和数据可视化

文章目录

  • Python爬取影评并进行情感分析和数据可视化
    • 一、引言
    • 二、使用requests+BeautifulSoup进行影评的爬取
      • 1、分析界面元素
      • 2、编写代码
    • 三、情感分析
      • 1、数据预处理
      • 2、情感分析
      • 3、数据可视化

一、引言

前几天出了《航海王:红发歌姬》等电影,我就立马看了,正好做一个爬取影评,想看看影评的好坏。这就离不开python爬虫和自然语言处理技术了。
这是一个小案例:包含python爬虫、数据预处理、自然语言处理、数据可视化等内容。下面我将详细这个小案例。

二、使用requests+BeautifulSoup进行影评的爬取

1、分析界面元素

我这里使用简单的bs4进行爬取。
找到影评所在的标签位置

<div>的类名为 comment 标签为 <span>类名为 short
在这里插入图片描述

2、编写代码

代码如下,在User-Agent中设置自己的请求头信息,并将某个电影url填入。

请求头信息获取:点击网络,再刷新一下页面,点击名称为comments?status=P,点击标头,在请求标头的最下方就能看到user-agent了。

获取影评评论内容的函数

def get_comment_content(comment):span = comment.find('span', class_='short')return span.get_text()

定义将评论内容保存到csv文件中

def save_to_csv(comments):with open('comments.csv', 'a', newline='', encoding='utf-8-sig') as csvfile:writer = csv.writer(csvfile)for comment in comments:content = get_comment_content(comment)writer.writerow([content])

主方法中调用上述函数并实现爬取与写入

url = '影评url地址'
#你的请求头信息
headers = {'User-Agent': 'Mozilla/5.0xxxxxxxxxxxxxxxxxxxx'}
while url:print('正在爬取:', url)response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')comments = soup.find_all('div', class_='comment-item')save_to_csv(comments)time.sleep(1)

实现页面自动跳转的功能,这里加入了try来观察爬取不到的情况,并在结束时将url置空防止进入死循环。

    try:pagination = soup.find('div', class_='center').find('a', class_='next')print(pagination)if pagination:next_page = pagination['href']url = '影评url地址' + next_pageprint('跳转到下一页:', url)print('找到标签跳转')else:url = Noneprint('无跳转')except:url = Noneprint('没有找到,结束')
print('爬取完成!')

完整代码:

import requests
from bs4 import BeautifulSoup
import csv
import timedef get_comment_content(comment):span = comment.find('span', class_='short')return span.get_text()def save_to_csv(comments):with open('comments.csv', 'a', newline='', encoding='utf-8-sig') as csvfile:writer = csv.writer(csvfile)for comment in comments:content = get_comment_content(comment)writer.writerow([content])url = '影评url地址'
headers = {'User-Agent': 'Mozilla/5.0xxxxxxxxxxxxxxxxxxxx'}
while url:print('正在爬取:', url)response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')comments = soup.find_all('div', class_='comment-item')save_to_csv(comments)time.sleep(1)try:#页面跳转的点击在div的id为paginator ,class为center中的a标签class为nextpagination = soup.find('div', class_='center').find('a', class_='next')print(pagination)if pagination:next_page = pagination['href']url = '影评url地址' + next_pageprint('跳转到下一页:', url)print('找到标签跳转')else:url = Noneprint('无跳转')except:url = Noneprint('没有找到,结束')
print('爬取完成!')

最后将爬取到的评论信息进行保存。

尬住了,敷衍的打斗和过度的特效溢出屏幕的光污染。
这就是歌姬吧?
作为民工漫里最长寿的一部是有道理的,对粉丝来说这是一场蓄谋已久的狂欢,红发香克斯出演剧场电影本就不可多得,两代航海家在梦境内外完成了一种代际的交替也足够让人动容,热血和激情澎湃,贝波打call真的可爱极了。对非粉来说也没有观看难度,剧情对每一个出场的角色都有照顾,乌塔是香克斯的女儿自始至终都不会变,这是一次温柔的家庭和解,也是对银幕内外泛滥的负面情绪的一场救赎,乌塔想要创造一个没有苦难的世界,毫不意外最终是梦境一场,但一次完整的、有起有兴的ADO演唱会也能让人心头一软。
尾田这两年没少看女团吧
日本宅男文化還有救嗎 ファザコン蘿莉被ナルシスト裝帥大叔精神打擊變病嬌女idol 开场就说拯救世界的歌聲這個standard高的 結果一開嗓就想逃出影院 视觉听觉大脑受损本人 可以给你拔高一下说是讲娱乐至死 楚门的世界 然后 没了 这俩词就可以end of story 想煽情煽泪的地方皱眉+汗毛直竖save it plz!!!
ado个人演唱会
买red电影票送uta演唱会门票
缤纷的色彩,华丽的音符,仿佛在电影院听了一场Live演唱会,让人梦回大和歌姬时代,可如此美妙的歌声真的是无罪的吗?当音乐的魔法消失,有罪的歌姬和无辜的小女孩不过是阴谋的一体两面。你是愿意沉迷在甜美的歌声中死去,还是宁愿辛苦努力踏实过每一天?魔法音乐的这个哲思,要怎么回答才能安全地活下去
这是开了一场个人演唱会啊,我觉得这个很适合小朋友看,大人的话闭上眼睛听听音乐还是可以的,剧情几乎是为零。
好漫长又随意的一部剧场版,槽点真的有比隔壁柯南少吗……加各种强行的设定也一定要促成全员乱打的局面就真的跟柯南一定要爆炸很像了。当成精良的周年纪念音乐会来看,给一个三星吧。 对池田秀一的声音都要有阴影了,又是这种被过度神话的装逼人物。另外,中文字幕强行翻译成航海王就很真的很能让人意识到,到底为什么这些不偷不杀不作恶的人要自称“海贼”。每次看乌塔和路飞就“为什么要当海贼”鸡同鸭讲地吵起来时,都很想打断他们,“其实他只是想当巡游世界的夺宝奇兵啦”。

由于一些原因,我们只能爬取220条评论。这里我尝试过在220条之前更换请求头继续爬取,结果还是到220就停了。通过打印第220条下面的网页,也发现网址和网站内元素没有改动。

同样的,将电影更换也是这种情况,但也验证了将url更换为其他电影,我们的代码依旧能正常爬取。

电影《保你平安》影评

看这个电影最大的疑问,如果韩露真的是坐台女,她死后就可以被挖坟墓吗?
关于韩露如果真的是坐台小姐应不应该被挖出来这件事,开篇魏平安和墓地经理吵架已经给了创作者的表态。魏平安质问祁经理:坐台小姐怎么了,埋咱这的人不让有道德瑕疵?别老模糊重点了吧?真不知道是看不懂还是看不见。
之前在muji打工,遇到一个爸爸,一口气买了47支笔,开了发票,问我能不能在发票后面给他写这些笔购买于哪里。他说,他女儿班上同学丢了一支笔,号称家里人从日本买的,国内买不到,刚好他女儿之前在muji买了支一样的,班上同学都说是她偷的,爸爸想给女儿挣个公道!抹黑一个人很简单,一张模糊的图、一条朋友圈、一句话就够了,但是要证明一个人,真的太难了!善良的人,祝你平安!
立意很好,但只是浅浅摸到了边缘。一个女人要足够清白足够高尚才会被允许葬在男友旁边,本身这件事就很荒谬,通篇主角也只是为了帮她澄清谣言而奔走,从未想过女性是否可以挣脱这层枷锁。
腿上的胎记是女孩的软肋,乌有的传言是掘墓的铁铲。裤脚向下一寸遮不住审美的霸凌,棺椁移走一格破不掉信息的茧房。这时代多得是为流量胡说的嘴,因谣言蒙蔽的眼,却鲜有不凉的血和求真的心。冰可乐不凉热血,总抱怨直播间没人送出烟花。前方拦路的白马为不舍的爱牵线,江面盛放的烟花祝侠义的人平安。

三、情感分析

1、数据预处理

我们需要将我们所爬取的文件加一个简单的表头,方便我们接下来的操作

由于我们的文件只有一列数据,所以直接手动添加即可(使用记事本或者Excel)。

若需要批量添加表头,下面是代码.

with open('保你平安.csv', 'r',encoding='utf-8-sig') as f:reader = csv.reader(f)data = list(reader)# 修改第一列
data[0][0] = 'comment'
data[1][0] = 'xxxx'# 将其他数据向下移一个位置
for i in range(len(data)-1, 0, -1):data[i], data[i-1][1:] = [data[i-1][0]] + data[i][1:], data[i][1:]# 写回文件
with open('保你平安.csv', 'w', newline='') as f:writer = csv.writer(f)writer.writerows(data)

我们选择保你平安做情感分析,因为航海王的评论中有很多是日语的,不方便进行分析。

2、情感分析

添加表头之后,我们使用 jieba对句子进行分词处理,并调用停用词来去除一些干扰词

import pandas as pd
import jieba
from textblob import TextBlob
import matplotlib.pyplot as plt# 设置文件名
input_file = "保你平安.csv"
stopwords_file = "stopwords.txt"
output_file = "保你平安processed.csv"# 读取停用词
with open(stopwords_file, 'r', encoding='utf-8') as f:stopwords = [line.strip() for line in f.readlines()]# 定义分词函数
def cut(text):words = jieba.cut(text)return " ".join([word for word in words if word not in stopwords])# 读取数据文件
data = pd.read_csv(input_file)# 分词并写入新列
data['process'] = data['comment'].apply(lambda x: cut(str(x)))

并将处理好的句子写入第二列,表头为process。

使用textblob进行简单的情感分析,将情感分为正向和负向(好评与差评),分析出的结果中华,好评用1表示,差评用-1表示,将分析结果写入第三列sentiment中。

# 情感分析并写入新列
data['sentiment'] = data['process'].apply(lambda x: TextBlob(str(x)).sentiment.polarity)# 写入新文件
data.to_csv(output_file, index=False)

3、数据可视化

最后我们将结果进行可视化,通过绘制饼图,来观察好评和差评所占的比例。

sentiment_counts = data['sentiment'].value_counts()
labels = ['Positive', 'Negative']
colors = ['#66c2a5', '#fc8d62']
explode = (.1, )
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(sentiment_counts, colors=colors, autopct='%1.1f%%', startangle=90, pctdistance=1.1,textprops=dict(color="b"))
ax.legend(wedges, labels, loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))
ax.axis('equal')
plt.title("Sentiment Distribution")
plt.setp(autotexts, size=10, weight="bold")
plt.show()

如图发现这220条评论中,好评占比接近98%

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fg76ZR3q-1686367774469)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230610095322989.png)]

完整代码:

import pandas as pd
import jieba
from textblob import TextBlob
import matplotlib.pyplot as plt# 设置文件名
input_file = "保你平安.csv"
stopwords_file = "stopwords.txt"
output_file = "保你平安processed.csv"# 读取停用词
with open(stopwords_file, 'r', encoding='utf-8') as f:stopwords = [line.strip() for line in f.readlines()]# 定义分词函数
def cut(text):words = jieba.cut(text)return " ".join([word for word in words if word not in stopwords])# 读取数据文件
data = pd.read_csv(input_file)# 分词并写入新列
data['process'] = data['comment'].apply(lambda x: cut(str(x)))# 情感分析并写入新列
data['sentiment'] = data['process'].apply(lambda x: TextBlob(str(x)).sentiment.polarity)# 写入新文件
data.to_csv(output_file, index=False)sentiment_counts = data['sentiment'].value_counts()
labels = ['Positive', 'Negative']
colors = ['#66c2a5', '#fc8d62']
explode = (.1, )
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(sentiment_counts, colors=colors, autopct='%1.1f%%', startangle=90, pctdistance=1.1,textprops=dict(color="b"))
ax.legend(wedges, labels, loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))
ax.axis('equal')
plt.title("Sentiment Distribution")
plt.setp(autotexts, size=10, weight="bold")
plt.show()

在这里插入图片描述

相关文章:

Python爬取影评并进行情感分析和数据可视化

Python爬取影评并进行情感分析和数据可视化 文章目录 Python爬取影评并进行情感分析和数据可视化一、引言二、使用requestsBeautifulSoup进行影评的爬取1、分析界面元素2、编写代码 三、情感分析1、数据预处理2、情感分析3、数据可视化 一、引言 前几天出了《航海王&#xff1…...

ubuntu22.04.2安装onlyoffice(不更改默认端口版)

目录 一、配置阿里源 二、postgresql数据库 &#xff08;一&#xff09;安装postgresql &#xff08;二&#xff09;创建postgresql数据库和用户 三、安装 rabbitmq 四、安装nginx-extras 五、安装ONLYOFFICE Docs &#xff08;一&#xff09;Add GPG key &#xff08…...

企业如何有效制定企业信息化发展规划?(附信息化模板)

如何有效制定企业信息化发展规划&#xff1f;企业信息化发展规划是一个宏大而又复杂的命题&#xff0c;这篇来掰开揉碎讲一下企业应该如何有效制定信息化发展规划。 这里不给大家灌鸡汤&#xff0c;也不给大家画大饼&#xff0c;就说些实在的。 如果你想找经验方法&#xff0…...

计算机网络填空题

我会写下自己的答案和理解 希望自己可用在学习中体会到快乐&#xff0c;而不是麻木。 1. 网络协议三要素中语义是指 需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应 1.在计算机网络中要做到有条不紊的交换数据&#xff0c;就必须遵守一些事…...

【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法

【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法 【一】为什么有这个问题【二】Object类的中的hashcode方法和equals方法【三】重写hashcode【四】重写equals方法【五】hashmap中使用hashcode和equals方法 【一】为什么有这个问题 因为HashMa…...

Flutter自定义对话框返回相关问题汇总

Flutter自定义对话框返回相关问题汇总&#xff0c;详细解释 Flutter是一款流行的移动应用开发框架&#xff0c;它提供了很多内置的对话框&#xff0c;但是有时候我们需要自定义对话框来满足特定需求。在使用自定义对话框时&#xff0c;可能会遇到一些问题&#xff0c;下面是一…...

002docker 安装

官网安装https://docs.docker.com/engine/install/ 系统要求 Centos7 Linux 内核&#xff1a;官方建议 3.10 以上查看Linux内核版本 用于打印当前系统的相关信息(内核版本号,硬件架构,主机名称和操作系统类型等 cat /proc/version uname -a 更新YUM源 生产环境中此步操作…...

软件工程师,全面思考问题很重要

为什么要全面思考问题 □ 在软件开发中,对一个问题思考得越全面,编写出的代码就会越严谨,出现bug的几率就越低;反之,如果没有对一个问题进行全面而深入的思考,编写出的代码就会漏洞百出,出现各种莫名其妙、无法复现的bug的几率也就急剧增加。 □ 软件就是数据加逻辑,数…...

1.Apollo部署-linux

一.官方文档 https://www.apolloconfig.com/#/zh/deployment/quick-start-docker 二.环境准备 1.MySql 5.6.51.单独服务器192.168.2.13 https://downloads.mysql.com/archives/installer/ 2.JDK 1.8.X https://www.oracle.com/java/technologies/downloads/ 三.Apollo部署…...

【HTML】form标签

<form> 标签用于创建 HTML 表单&#xff0c;它是用于收集用户输入的重要元素。表单可以包含各种输入字段、按钮和其他交互元素&#xff0c;用于向服务器发送用户输入数据。 下面是一个简单的 <form> 标签的示例&#xff1a; <form action"/submit-form&q…...

基于SPAD / SiPM技术的激光雷达方案

激光雷达(LiDAR)是一种测距技术&#xff0c;近年来越来越多地用于汽车先进驾驶辅助系统(ADAS)、手势识别和3D映射等应用。尤其在汽车领域&#xff0c;随着传感器融合的趋势&#xff0c;LiDAR结合成像、超声波、毫米波雷达&#xff0c;互为补足&#xff0c;为汽车提供全方位感知…...

使用MATLAB工具模拟单/双频GPS和载波相位差分GPS

第一部分&#xff1a;介绍和背景 在我们的日常生活中&#xff0c;全球定位系统&#xff08;GPS&#xff09;发挥了重要的作用。无论是在我们的手机中&#xff0c;还是在各种应用中&#xff0c;GPS都是实现精确位置定位的关键技术。然而&#xff0c;有时候我们可能需要对GPS进行…...

当社恐成为技术面试官

前言 在被不知道多少个面试官拒绝之后&#xff0c;毕业四年之际&#xff0c;我这个社恐也成为了一位面试官。至于社恐为什么能成为面试官&#xff0c;我想放到文末讲&#xff0c;感觉不是重点。 之前被面试&#xff0c;最讨厌的话就是&#xff1a;请简单介绍一下自己 我的内心…...

Jetpack Compose:使用PagerIndicator和Infinity实现滚动的HorizontalPager

Jetpack Compose&#xff1a;使用PagerIndicator和Infinity实现滚动的HorizontalPager 可能你已经知道&#xff0c;Jetpack Compose 默认不包含内置的ViewPager组件。然而&#xff0c;我们可以通过在 build.gradle 文件中添加 accompanist 库依赖&#xff0c;将 ViewPager 功能…...

2023年杭州/广州/东莞/深圳软考(中/高级)认证,618报名特惠

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…...

springboot项目外卖管理 day03-公共字段填充与新增删除分类

文章目录 一、公共字段自动填充1.1、问题分析1.2、代码实现1.2.1、在实体类的属性上加入TableField注解&#xff0c;指定自动填充的策略1.2.2按照框架要求编写元数据对象处理器&#xff0c;在此类中统一为公共字段赋值&#xff0c;此类需要实现MetaObjectHandler接口1.2.3 功能…...

Nginx:Tomcat部署及优化(一)

Nginx&#xff1a;Rewrite 一、Tomcat介绍1.1 Tomcat 简介1.2 Tomcat 核心的组件1.2.1 什么是 servlet1.2.2 什么是 JSP 1.3 Tomcat 功能组件结构1.3.1 Container 结构分析 1.4 Tomcat 请求过程 二、Tomcat 服务部署三、Tomcat 虚拟主机配置四、Tomcat多实例部署 一、Tomcat介绍…...

Docker Swarm 集群搭建和使用 —— 筑梦之路

简单介绍 swarm 集群由管理节点(Manager)和工作节点(Worker)构成。 管理节点:主要负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。诸如监控集群状态、分发任务至工作节点等操作。 工作节点:主要负责执行运行服务的任务。 官方文档:docker swarm…...

是否需要更换CRM系统如何评估?如何确保更换成功?

很多企业在使用CRM客户管理系统的过程中&#xff0c;并没有达到预期的效果&#xff0c;甚至出现了实施失败的情况。部分企业可能会考虑更换CRM系统&#xff0c;以期获得更好的结果。但是&#xff0c;更换CRM系统是否值得呢&#xff1f;下面我们就来说说。 一、是否该更换CRM …...

CSDN竞赛57期题解

总结 交卷时一看才六十多分还有点吃惊&#xff0c;一看非编程题部分还是丢了二十分。填空题是这类竞赛最大的诟病&#xff0c;答案是名词的必然不唯一&#xff0c;答案需要计算的给定的参考答案必然计算错误&#xff0c;更离谱的是题目出成这样&#xff0c;反馈后官方竟然一点…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...