【深度学习】Python爬取豆瓣实现影评分析

news2024/10/6 20:29:53

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、任务描述
  • 二、使用步骤
    • 1.数据爬取
    • 1.2.对爬取的页面数据进行解析,并保存为JSON文件
    • 2、数据分析
    • 2.1数据分析之评论时间分布图
    • 2.2角色评分


前言

爬虫的过程,就是模仿浏览器的行为,往目标站点发送请求,接收服务器的响应数据,提取需要的信息,并进行保存的过程。

Python为爬虫的实现提供了工具:requests模块、BeautifulSoup库


一、任务描述

本次实践使用Python来爬取豆瓣网中《安家》下所有的评论,进行了一波分析,从观众的角度来了解这部电视剧。

数据获取:https://movie.douban.com/subject/30482003/reviews?sort=time&start=0

普通用户:

打开浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 渲染到页面上。

爬虫程序:

模拟浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 提取有用的数据 --> 保存到本地/数据库。
爬虫的过程:

1.发送请求(requests模块)

2.获取响应数据(服务器返回)

3.解析并提取数据(BeautifulSoup查找或者re正则)

4.保存数据
request模块:

requests是python实现的简单易用的HTTP库,官网地址:http://cn.python-requests.org/zh_CN/latest/

requests.get(url)可以发送一个http get请求,返回服务器响应内容。

BeautifulSoup库:

BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库。网址:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml。

BeautifulSoup(markup, "html.parser")或者BeautifulSoup(markup, "lxml"),推荐使用lxml作为解析器,因为效率更高。

二、使用步骤

# 如果需要进行持久化安装, 需要使用持久化路径, 如下方代码示例:
!mkdir /home/aistudio/external-libraries
!pip install beautifulsoup4 -t /home/aistudio/external-libraries
!pip install lxml -t /home/aistudio/external-libraries
!pip install xgboost==1.1.0 -t /home/aistudio/external-libraries
!pip install wordcloud -t /home/aistudio/external-libraries
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可:
import sys
sys.path.append('/home/aistudio/external-libraries')

1.数据爬取

代码如下(示例):

import json
import re
import requests
from bs4 import BeautifulSoup


def crawl_data(crawl_url):
    '''
    爬取豆瓣《安家》影评信息,返回response,并进行解析
    '''
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
    }
    
    url = 'https://movie.douban.com/subject/30482003/reviews'+crawl_url
    try:
        response = requests.get(url, headers=headers)
        print(response.status_code)     
        parse(response)
    except Exception as e:
        print(e)

1.2.对爬取的页面数据进行解析,并保存为JSON文件

代码如下(示例):

item_list = []
def parse(response):
    '''
    解析爬取的网页内容
    '''
    soup = BeautifulSoup(response.text, 'html.parser')
    review_list = soup.find_all('div', class_='main review-item')

    for review_div in review_list:
        author = review_div.find('a', class_='name').text.strip()
        author = str_format(author)

        pub_time = review_div.find('span', class_='main-meta').text.strip()

        rating = review_div.find('span', class_='main-title-rating')
        if rating:
            rating = rating.get('title')
        else:
            rating = ""

        title = review_div.find('div', class_='main-bd').find('a').text.strip()

        is_unfold = review_div.find('a', class_='unfold')
        if is_unfold:
            review_id = review_div.find('div', class_='review-short').get('data-rid')
            content = get_fold_content(review_id)
        else:
            content = review_div.find('div', class_='short-content').text.strip()

        if content:
            content = re.sub(r"\s", '', content)

        item = {
            "author": author,
            "pub_time": pub_time,
            "rating": rating,
            "title": title,
            "content": content
        }
        print(item["title"])
        item_list.append(item)

    next_url = soup.find('span', class_='next').find('a')

    if next_url:
        crawl_data(next_url.get('href'))
    else:
        save_json()


def get_fold_content(review_id):
    '''
    根据评论id,获取被折叠的评论内容
    '''
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
    }
    url = "https://movie.douban.com/j/review/{}/full".format(review_id)

    resp = requests.get(url, headers=headers)
    data = resp.json()

    content = data['html']
    content = re.sub(r"(<.+?>)", "", content)

    content = str_format(content)
    return content


def str_format(line):
    '''
    去除content中特殊字符,单引号、双引号、反斜杠
    '''
    error_list = ['\'', '\"', '\\', ',']
    for c in line:
        if c in error_list:
            line = line.replace(c, '')
    return line


def save_json():
    '''
    将爬取的数据保存为JSON文件
    '''
    with open('work/review.json', 'w', encoding='UTF-8') as f:
        json.dump(item_list, f, ensure_ascii=False)

    print("爬取完成,共爬取%d条数据" % len(item_list))


if __name__ == '__main__':
    start_url = '?sort=time&start=0'

    crawl_data(start_url)

    #将所爬取的数据,保存为JSON文件
    json_data = json.loads(str(item_list).replace("'",'"').replace("\\",""))
    with open('work/reviews.json', 'a', encoding='UTF-8') as f:        
        json.dump(item_list, f, ensure_ascii=False)

    print("爬取完成,共爬取%d条数据"% len(item_list))

在这里插入图片描述

2、数据分析

代码如下(示例):

# 下载中文字体
!wget http://d.xiazaiziti.com/en_fonts/fonts/s/SimHei.ttf

# 将字体文件复制到matplotlib字体路径
!cp SimHei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
# 创建系统字体文件路径
!mkdir .fonts
# 复制文件到该路径
!cp SimHei.ttf .fonts/
!rm -rf .cache/matplotlib
!pip install wordcloud

在这里插入图片描述

import json
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from matplotlib import cm
import seaborn as sns
import jieba
import collections
import wordcloud
with open('work/review.json', 'r', encoding='UTF-8') as file:
    item_list = json.loads(file.read().replace("}][{","},{"))

review_df = pd.DataFrame(item_list,columns=['author','pub_time','rating','title','content'])
print(review_df)

# # 删除缺失数值
review_df.dropna(inplace=True)

# 将缺失的评论情况设置为"放弃"
review_df.loc[review_df['rating']=='','rating'] = '放弃' 

# # 将字符串格式的时间转换为datatime类型
review_df['pub_time'] = pd.to_datetime(review_df['pub_time'])
print(review_df)

在这里插入图片描述

#按照评分进行聚合
grouped=review_df['author'].groupby(review_df['rating'])
grouped_count = grouped.count()
print(grouped_count)

plt.figure(figsize=(10,5))
plt.bar(range(len(grouped_count.index)), grouped_count.values,color=['b','r','g','y','c','m',])
plt.xticks(range(len(grouped_count.index)),grouped_count.index,fontsize=15)
plt.yticks(fontsize=15)
plt.savefig('/home/aistudio/work/05.jpg')
plt.show()

在这里插入图片描述

# 分析评论日期 
import re
from matplotlib import dates
#显示matplotlib生成的图形
%matplotlib inline

#添加一个索引“pub_date”,存储评论日期(2020年2月到3月期间)
review_df['pub_date'] = review_df['pub_time'].dt.date

review_df = review_df[pd.to_datetime(review_df['pub_date']).dt.year==2020]
review_df = review_df[pd.to_datetime(review_df['pub_date']).dt.month>1]
review_df = review_df[pd.to_datetime(review_df['pub_date']).dt.month<4]

# 根据评论日期进行聚合
review_date_df = review_df['author'].groupby(review_df['pub_date'])
review_date_df = review_date_df.count()
# print(review_date_df.index)
# print(review_date_df.values)

#创建一个画布,指定宽、高
plt.figure(figsize=(20,10))

#设置显示中文
plt.rcParams['font.sans-serif'] = ['FZSongYi-Z13S'] # 指定默认字体

#绘制折线图
plt.plot(review_date_df.index.to_numpy(), review_date_df.values, marker='o')

#配置横坐标
plt.gca().xaxis.set_major_formatter(dates.DateFormatter("%m-%d"))

#这里是调节坐标的倾斜度,rotation是度数,以及设置刻度字体大小
plt.xticks(review_date_df.index.to_numpy(),rotation=45,fontsize=15)
plt.yticks(fontsize=15)

#配置坐标标题
plt.xlabel("发布日期",fontsize=15)
plt.ylabel("评论数量",fontsize=15)
#网格化
plt.grid()
#保存图形
plt.savefig('/home/aistudio/work/01.jpg')
#显示图形
plt.show()

在这里插入图片描述

2.1数据分析之评论时间分布图

import datetime
# 指定多个时间区间
time_range = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]
# 提取评论的小时信息
review_df['pub_hour'] = review_df['pub_time'].dt.hour
# 根据时间区间进行分组并统计数量
review_hour_range_df = review_df.groupby(pd.cut(review_df['pub_hour'], time_range)).size()
# 创建一个画布,指定宽、高
plt.figure(figsize=(10, 5))
# 绘制柱状图
plt.bar(range(len(review_hour_range_df)), review_hour_range_df.values)
# 配置横坐标刻度
plt.xticks(range(len(review_hour_range_df)), review_hour_range_df.index, fontsize=12, rotation=45)
# 配置坐标标题和刻度
plt.xlabel("评论时间区间", fontsize=15)
plt.ylabel("评论数量", fontsize=15)
plt.yticks(fontsize=12)
# 网格化
# plt.grid()
# 保存图形
plt.savefig('work/03.jpg')
# 显示图形
plt.show()

在这里插入图片描述

2.2角色评分

# # 电视剧人物的评分
# # 力荐:+5,推荐:+4,还行:3,较差:2,很差:1
# roles = {'房似锦':0,'徐文昌':0,'张乘乘':0,'王子健':0,'楼山关':0,'朱闪闪':0,
# '谢亭丰':0,'鱼化龙':0,'宫蓓蓓':0,'阚文涛':0}
# 定义角色评分字典
roles = {'房似锦': 3, '徐文昌': 0, '张乘乘': 2, '王子健': 4, '楼山关': 1, '朱闪闪': 3,
        '谢亭丰': 0, '鱼化龙': 2, '宫蓓蓓': 0, '阚文涛': 1}
# 遍历每条评论
for index, row in review_df.iterrows():
    rating = int(row['rating']) if row['rating'].isdigit() else 0 # 将评分转换为整型,非数字的评分设为0
    content = row['content']
    # 统计每个角色在评论中出现的次数
    for role in roles.keys():
        count = content.count(role)
        roles[role] += count * rating
# 打印角色评分结果
for role, score in roles.items():
    print(f"{role}的评分:{score}")
# 绘制角色评分柱状图
plt.figure(figsize=(10, 5))
plt.bar(roles.keys(), roles.values())
plt.xlabel("角色")
plt.ylabel("评分")
plt.xticks(rotation=45)
plt.savefig('work/04.jpg')
plt.show()

在这里插入图片描述

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

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

相关文章

雷神学习---视音频数据处理入门:RGB、YUV像素数据处理

原文地址&#xff1a;https://blog.csdn.net/leixiaohua1020/article/details/50534150 ​​​​​​​​从代码可以看出&#xff0c;如果想把YUV格式像素数据变成灰度图像&#xff0c;只需要将U、V分量设置成128即可。 这是因为U、V是图像中的经过偏置处理的色度分量。色度分…

Python继承和多态:基础继承、方法重写、多态的基本概念

文章目录 基础继承方法重写多态在编程语言中,特别是在面向对象编程(OOP)中,继承和多态是两个核心概念,它们提供了代码重用和接口设计的强大工具。Python 作为一种支持 OOP 的语言,也具备这些特性。 基础继承 继承是面向对象编程的一个基本概念,它允许我们定义一个类(…

Angew. Chem. Int. Ed.:Co-1T-MoS2-bpe碱性介质中电催化HER

高效析氢反应&#xff08;HER&#xff09;电催化剂决定氢动力清洁技术的质量分布&#xff0c;但仍面临着巨大的挑战。基于此&#xff0c;中国石油大学&#xff08;华东&#xff09;董斌副教授等人报道了通过CoMo -金属-有机骨架前驱体对1T-MoS2催化剂进行了配体调制和Co掺杂的协…

前端图片压缩上传,减少等待时间!优化用户体检

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 这里有两张图片&#xff0c;它们表面看上去是一模一样的&#xff0c;但实际上各自所占用的内存大小相差了180倍。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&…

JumpServer 打开RDP客户端出现由于在客户端检测到一个协议错误 错误代码 0x2104

环境: Win10 专业版 JumpServer Version v2.25.4 问题描述: JumpServer 打开RDP客户端出现由于在客户端检测到一个协议错误 错误代码 0x2104 个别电脑又是正常可以连接 解决方案: 检查网络连接:确保您的计算机和JumpServer之间的网络连接正常。尝试使用其他网络连接…

操作系统基础知识1

1、用户态和内核态的区别&#xff1f; a、访问权限。用户态下&#xff0c;应用程序只能访问受限的的资源和执行受限的程序&#xff1b;而在内核态下&#xff0c;操作系统具有完全的访问权限&#xff0c;可以访问系统的所有资源和执行所有操作&#xff1b; b、CPU指令集。用户态…

拍摄中的信息表达者---镜头语言!

炫我科技在影视动画行业为众多影片提供了渲染支持。涉及到的业务有云渲染系统、实时渲染系统、XR虚拟拍摄系统&#xff0c;强势赋能元宇宙。在影视动画创作过程中提供了多种解决方案&#xff0c;例如集群渲染、私有云渲染解决方案、虚拟拍摄等。 今天我们来聊一些不一样的东西…

学习pytorch15 优化器

优化器 官网如何构造一个优化器优化器的step方法coderunning log出现下面问题如何做反向优化&#xff1f; 官网 https://pytorch.org/docs/stable/optim.html 提问&#xff1a;优化器是什么 要优化什么 优化能干什么 优化是为了解决什么问题 优化模型参数 如何构造一个优化器…

【Proteus仿真】【51单片机】水质监测报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、蜂鸣器、LCD1602、PCF8591 ADC、PH传感器、浑浊度传感器、DS18B20温度传感器、继电器模块等。 主要功能&#xff1a; 系统运行后&…

链表经典面试题之一讲

什么是链表&#xff1f; 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 今天给大家分享一道经典的单链表面试题 力扣题目——反转链表https://leetcode.cn/problems/reverse-linked-list/ 只给了头…

Wsl2 Ubuntu在不安装Docker Desktop情况下使用Docker

目录 1. 前提条件 2.安装Distrod 3. 常见问题 3.1.docker compose 问题无法使用问题 3.1. docker-compose up报错 参考文档 1. 前提条件 win10 WSL2 Ubuntu(截止202308最新版本是20.04.xx) 有不少的博客都是建议直接安装docker desktop&#xff0c;这样无论在windows…

实体属性映射框架mapstruct

1. 框架介绍 mapstruct框架是一种实体类间的映射框架&#xff0c;能够通过JAVA注解的形式将一个实体类的属性安全的赋值给另一个实体类。通过一系列注解可以定义实体类属性之间的映射关系&#xff0c;mapstruct会在编译期间生成映射实现类&#xff0c;而非通过反射的方式进行实…

Dcoker学习笔记(一)

Dcoker学习笔记一 一、 初识Docker1.1 简介1.2 虚拟机和docker的区别1.3 Docker架构1.4 安装Docker&#xff08;Linux&#xff09; 二、 Dcoker基本操作2.1 镜像操作2.2 容器操作练习 2.3 数据卷volume&#xff08;容器数据管理&#xff09;简介数据卷语法数据卷挂载 2.4 自定义…

【Git】Git基础命令操作速记

【Git】Git基础命令操作速记 文章目录 【Git】Git基础命令操作速记1. 初始化1.1 设置用户名和邮箱1.2 初始化仓库 2. 基础命令2.1 add和commit2.2 reset2.3 查看日志2.4 删除/找回本地仓库文件2.5 找回暂存区文件2.6 diff命令(找不同) 3. 分支命令3.1 查看分支3.2 创建分支3.3 …

深度学习之基于YoloV5的火灾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 火灾检测系统基于YoloV5的介绍 火灾检测是一项重要的安全任务&#xff0c;它旨在及时发现和报警火灾风险。基于深度…

postgresql|数据库|提升查询性能的物化视图解析

前言&#xff1a; 我们一般认为数字的世界是一个虚拟的世界&#xff0c;OK&#xff0c;但我们其实有些需求是和现实世界一模一样的&#xff0c;比如&#xff0c;数据库尤其是关系型数据库&#xff0c;希望在使用的数据库能够更快&#xff08;查询速度&#xff09;&#xff0c;…

《008.Springboot+vue之自习室选座系统》

[火]《008.Springbootvue之自习室选座系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisredis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 前端…

云端生成式 AI – 基于 Amazon EKS 的 Stable Diffusion 图像生成方案

Stable Diffusion 是当下生成式 AI 领域最受欢迎的开源多模态语言-图像模型&#xff0c;由于其易用的接口和良好的使用体验&#xff0c;受到了开源社区和广大设计行业从业者的追捧。Stable Diffusion 模型版本正在快速迭代&#xff0c;并带动了各行各业的生产力变革。目前市场上…

vmware16.1.2安装 windows7后 VMVMware tools 灰色 需要手动安装操作详情

问题1&#xff1a; 问题描述&#xff1a; 在Windows7镜像安装完成后&#xff0c;安装"VMware Tools"时出现&#xff1a;安装程序无法继续&#xff0c;需要将操作系统更新到SP1.2 重新安装后也没办法解决。 证明问题没有出在操作系统上&#xff1b;那么&#xff0c…

RISC Zero的Bonsai证明服务

1. 引言 Bonsai为通用ZKP网络&#xff0c;其支持任意链、任意协议、以及任意应用&#xff0c;利用ZKP来扩容、隐私和互操作。Bonsai的目标是为每条链都提供无限计算的能力。 借助Bonsai&#xff0c;可仅需数天的开发&#xff0c;即可实现对以太坊、L1链、Cosmos app链、L2 ro…