【GitHub已开源】某博热点事件评论数据分析与用户情感分析平台完整项目

news2024/11/23 19:09:41

找遍全网无奈只能自己开发某博热点评论数据爬取与用户情感分析平台,这就是技术人的创新!

最近想看一下微博热点评论的用户人群情感趋势,想到的就是去爬取某博的评论数据,然后进行一个可视化的情感分析。想想吧,这个项目肯定网上一大堆,然后呢,自己去搜索,可把我气的。Github和csdn居然没有一个能够参考的好项目,不是拉下来跑不了。就是一些过时的程序,早都被反爬了。这可把我气的,花了两天时间自己研究琢磨了一个平台。现在免费提供给大家,希望大家多多收藏。相信我,你以后一定会用到的!

文章目录

  • 找遍全网无奈只能自己开发某博热点评论数据爬取与用户情感分析平台,这就是技术人的创新!
  • 前言
  • 一、layui介绍
  • 二、echart介绍
  • 三、开发过程
    • 3.1 后端设计
      • 3.1.1 使用flask web框架快速搭建
      • 3.1.2 某博热点数据爬取
        • 3.1.2.1 登录某博网页
        • 3.1.2.2 点击进入你要爬取的热点事件
        • 3.1.2.3 点击进入你要爬取的评论目标
        • 3.1.2.4 抓取评论url并且获取cookie
        • 3.1.2.5 通过requests请求获取数据
      • 3.1.3 数据分析与清洗
      • 3.1.4 情感分析过程
      • 3.1.5 数据保存
    • 3.2 前端设计
      • 3.2.1 用户登录注册
      • 3.2.2 某博评论数据爬取
      • 3.2.3 某博评论数据分析
  • 总结
  • 最后当然是源码公开拉!


前言

为了能让小白能够看懂我先来介绍一下我使用到的一些技术

  • 前端为layui和echart
  • 后端为python flask框架
  • MYSQL数据库
  • 情感分析NLP
  • 爬虫技术

一、layui介绍

Layui是一个基于Web界面的前端UI框架,提供了丰富的组件和接口,并且易于使用和定制。它被广泛应用于Web开发项目中,可以帮助开发者快速搭建出美观、高效的用户界面。Layui采用了模块化的设计方式,使得开发者可以根据需要选择需要的组件,同时也可以方便的自定义扩展组件。它的主要特点包括简洁、易用、减少样式冲突、响应式设计。

二、echart介绍

Echart是一种用于数据可视化的JavaScript图表库,它支持多种图表类型,如折线图、柱状图、饼图、散点图等,并且具有动态交互性和可定制性。Echart可以通过简单的JavaScript代码来实现丰富的数据可视化效果,适用于不同领域的数据分析与展示。

三、开发过程

3.1 后端设计

3.1.1 使用flask web框架快速搭建

在这里插入图片描述

  1. Controller里面是和前端交互的API。
  2. Dao里面是与数据库连接的映射接口实体
  3. Mapper里面是与数据库连接的接口
  4. Service里面实现爬虫数据逻辑
  5. Static里面存放静态资源数据
  6. Templates存放前端HTML文件里面集成了类UI
  7. Utils是我自己分装的一些工具实体,里面有一些词云生成器和数据库脚本一键生成工具。数据库脚本一键生成工具,下期我再介绍。
    先看效果图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.1.2 某博热点数据爬取

爬取思路,大神勿喷:

3.1.2.1 登录某博网页

登录地址为:微博地址
在这里插入图片描述
如果没有登录记得登录,登录成功后进入微博的H5页面。

3.1.2.2 点击进入你要爬取的热点事件

在这里插入图片描述

  • 要注意现在需要获取一下网站的cookie
  • 获取方式为如下:
    在这里插入图片描述

3.1.2.3 点击进入你要爬取的评论目标

在这里插入图片描述
评论链接:评论链接
在这里插入图片描述
有个恶心的问题是爬取这个链接根本不是固定的,需要我们自己手动翻页收集,这里应该是人家的反扒策略。
在这里插入图片描述
所以我只能将所有链接复制填写到输入框中进行遍历。遍历时要进行字符串处理

# 识别多页评论数据
def get_readUrl(data_url):
    data = data_url
    data_goods = []
    str_data = data.split("hotflow")
    for k in str_data:
        if len(k) > 10:
            data = k[:78]
            print(data)
            data_goods.append(data)
    return data_goods

3.1.2.4 抓取评论url并且获取cookie

代码如下:

# 爬取微博热点评论

# 获取当前热搜信息
import json
import time

import requests

from service.feelcheck import write


# 获取某个信息
def get_data(hot_band_url, data_goods, cookie, name):
    mydata_pa = []
    headers = {
        'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39',
        'cookie': cookie,
        'Accept': 'application/json, text/plain, */*'
    }
    id = 0
    try:
        for k in data_goods:
            print(hot_band_url + k)
            data = requests.get(hot_band_url + k, headers=headers)  # 请求
            # time.sleep(1)  # 防止被监控
            data = data.json()
            data = data['data']['data']
            for k in data:
                res = {}
                text = get_split(k['text'])
                if text != "":
                    res['id'] = id
                    res['source'] = k['source']
                    res['console'] = get_split(k['text'])
                    mydata_pa.append(res)
                    id += 1
        print("开始写数据")
        write(mydata_pa, name)
        return mydata_pa
    except:
        res = []
        return res


# 截取评论
def get_split(comments):
    start = str(comments).find("<")
    return comments[0:start]


# 识别多页评论数据
def get_readUrl(data_url):
    data = data_url
    data_goods = []
    str_data = data.split("hotflow")
    for k in str_data:
        if len(k) > 10:
            data = k[:78]
            print(data)
            data_goods.append(data)
    return data_goods

#
# if __name__ == '__main__':
#     data = get_readUrl()
#     get_data(hot_band_url, data)

3.1.2.5 通过requests请求获取数据

# 获取某个信息
def get_data(hot_band_url, data_goods, cookie, name):
    mydata_pa = []
    headers = {
        'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39',
        'cookie': cookie,
        'Accept': 'application/json, text/plain, */*'
    }
    id = 0
    try:
        for k in data_goods:
            print(hot_band_url + k)
            data = requests.get(hot_band_url + k, headers=headers)  # 请求
            # time.sleep(1)  # 防止被监控
            data = data.json()
            data = data['data']['data']
            for k in data:
                res = {}
                text = get_split(k['text'])
                if text != "":
                    res['id'] = id
                    res['source'] = k['source']
                    res['console'] = get_split(k['text'])
                    mydata_pa.append(res)
                    id += 1
        print("开始写数据")
        write(mydata_pa, name)
        return mydata_pa
    except:
        res = []
        return res

3.1.3 数据分析与清洗

    try:
        for k in data_goods:
            print(hot_band_url + k)
            data = requests.get(hot_band_url + k, headers=headers)  # 请求
            # time.sleep(1)  # 防止被监控
            data = data.json()
            data = data['data']['data']
            for k in data:
                res = {}
                text = get_split(k['text'])
                if text != "":
                    res['id'] = id
                    res['source'] = k['source']
                    res['console'] = get_split(k['text'])
                    mydata_pa.append(res)
                    id += 1
        print("开始写数据")
        write(mydata_pa, name)
        return mydata_pa
    except:
        res = []
        return res

3.1.4 情感分析过程

主要使用NLP进行情感分析,这里我又要和小白科普了:
什么是NLP?
NLP代表自然语言处理(Natural Language Processing)。它是计算机科学和人工智能领域的分支之一,旨在使计算机能够理解、分析、生成和处理人类语言的形式和含义。它涉及许多技术,包括语音识别、文本分析、信息提取、语义理解和机器翻译等。NLP的应用范围很广,包括智能语音助手、机器翻译、数据挖掘、自动化客户服务、垃圾邮件过滤等。

import pandas
import pandas as pd
from snownlp import SnowNLP
import matplotlib.pyplot as plt
import numpy as np
import jieba
from jieba import analyse
import csv
# 生成词云数据
from wordcloud import WordCloud


def write(data, name):
    # 打开文件
    file_name = 'G:/mydemo/film-recommend/static/{}.csv'.format(name)
    with open(file_name, 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(["id", "console", "local"])

    try:
        pd.DataFrame(data).to_csv(file_name)
    except:
        print("the data is over")


def read_files(data_file):
    data = pd.read_csv(data_file)  # 读取csv文件数据
    data.head(2)
    data1 = data[['id', 'console', 'source']]
    data1.head(10)
    data1['emotion'] = data1['console'].apply(lambda x: SnowNLP(x).sentiments)
    print(data1.head(10))
    data1.describe()
    return data1


def getattion_chart(data1):
    # 计算积极评论与消极评论各自的数目
    pos = 0
    neg = 0
    for i in data1['emotion']:
        if i >= 0.5:
            pos += 1
        else:
            neg += 1
    # 积极评论占比
    res = {
        'pos': pos,
        'neg': neg
    }
    print(res)
    return res


def getap10_chart(data):
    # 关键词top10
    text = ''
    for s in data['console']:
        text += s
    key_words = jieba.analyse.extract_tags(sentence=text, topK=10, withWeight=True, allowPOS=())
    print(key_words)
    res = []
    for k in range(0, 10):
        res.append(key_words[k][0])
    return res
    # 参数说明 :
    # sentence
    # 需要提取的字符串,必须是str类型,不能是list
    # topK
    # 提取前多少个关键字
    # withWeight
    # 是否返回每个关键词的权重
    # allowPOS是允许的提取的词性,默认为allowPOS =‘ns’, ‘n’, ‘vn’, ‘v’,提取地名、名词、动名词、动词


def getcloud_chart(data):
    w = WordCloud(background_color="white",
                  font_path="G:/mydemo/film-recommend/service/SimplifiedChinese/SourceHanSerifSC-SemiBold.otf")  # font_path="msyh.ttc",设置字体,否则显示不出来
    text = ''
    for s in data:
        text += s + "\n"
    w.generate(text)
    w.to_file("G:/mydemo/film-recommend/static/img/doubanTop10cloud.png")


if __name__ == '__main__':
    getap10_chart(read_files())

3.1.5 数据保存

在这里插入图片描述

def write(data, name):
    # 打开文件
    file_name = 'G:/mydemo/film-recommend/static/{}.csv'.format(name)
    with open(file_name, 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(["id", "console", "local"])

    try:
        pd.DataFrame(data).to_csv(file_name)
    except:
        print("the data is over")

3.2 前端设计

3.2.1 用户登录注册

在这里插入图片描述
在这里插入图片描述

3.2.2 某博评论数据爬取

在这里插入图片描述

3.2.3 某博评论数据分析

在这里插入图片描述
在这里插入图片描述

总结

经过两天没日没夜的开发,终于把这个搞完了,想告诉大家的是,我们开发者有现成的东西,当然可以用,但是如果找不到,那么我们就要开动自己的小脑筋,虽然这个事儿简单,但是不难看出,只有自己有创造力,有激情,有动力,最后总能做成一件事。正在求职找工作的同学可以私聊我,跟我一起学习更有趣的技术。
还有就是官方的ai写作nb!
在这里插入图片描述
以后什么概念不怕自己写不好啦,同学们还不快用起来。

最后当然是源码公开拉!

github地址:某博热点事件评论数据获取与用户情感分析
还不快快收藏,那天自己要用找不到了,哭去吧!哈哈

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

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

相关文章

RPC核心原理

大家好&#xff0c;我是易安&#xff0c;今天我们一起来研究下RPC的核心原理。 什么是RPC&#xff1f; RPC的全称是Remote Procedure Call&#xff0c;即远程过程调用。简单解读字面上的意思&#xff0c;远程肯定是指要跨机器而非本机&#xff0c;所以需要用到网络编程才能实现…

用Gmail邮箱注册任天堂日本区账号

任天堂是一家日本公司&#xff0c;日区的任天堂可以买到常驻的任亏券&#xff0c;兑换任天堂第一方游戏&#xff0c;而且经常搞活动&#xff0c;可以买到低价的游戏。 首先进入任天堂官网 https://accounts.nintendo.com/register 注册账号 比如我的Gmail邮箱为 zhaooleegma…

EBU6304 Software Engineering 知识点总结_3 requirements

requirements 确定需求是软工设计中最重要的部分。 feature to satisfy customer. indicates what should this sys do. 可能是高层抽象的需求 high-level abstract 或者底层具体的 low-level specific. Stakeholder 利益相关者&#xff1a;受系统影响的组织或个人&#x…

STM32驱动W25Q64---笔记

这次来分享最近经常用到的知识点----FLASH 初学者会疑惑&#xff0c;有了EEPROM为什么还要用W25Q64呢&#xff1f;&#xff08;笔者一开始就百思不得其解&#xff09; 答&#xff1a; EEPROM和W25Q64都是用于数据存储的存储器&#xff0c;它们各有优缺点&#xff0c;需要根据…

chatgpt赋能python:Python的修改及其对SEO的影响

Python的修改及其对SEO的影响 介绍 Python是一种高级编程语言&#xff0c;以其简单易学和功能强大而闻名。它被广泛用于开发各种应用程序&#xff0c;从网站到机器学习和大数据分析。Python不断更新和改进&#xff0c;新版本带来了许多新功能和改进&#xff0c;这些修改对SEO…

如何读取带空格的字符串?

scanf()函数在读取字符时&#xff0c;识别到空格就会终止读取&#xff0c;那么如何读取带空格的字符串呢&#xff1f; 一、gets()&#xff08;gets_s()&#xff09; 从标准输入(stdin)&#xff08;指的是键盘输入&#xff09;读取字符&#xff0c;并将它们作为 C 字符串存储到…

1688详情 sign签名分析

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01; 网站地址&#xff1a;aHR0cHM6Ly9kZXRhaWwuMTY4OC5jb20vb2ZmZXIvNzEzNDMzMDYyOTUzLmh0bWw 接口&#xff1a;aHR0cHM6Ly9oNWFwaS5tLjE…

软件工程学复习笔记

目录 软件工程学概述软件危机的典型表现、产生原因、消除途径软件的构成&#xff1a;程序、数据、文档软件工程的七点特性软件工程的七条基本原理软件工程方法&#xff1a;传统方法学&#xff0c;面向对象方法学软件的生命周期&#xff1a;三个时期&#xff0c;软件定义&#x…

MMPose学习笔记1

文章目录 摘要什么是人体姿态估计3D 姿态估计人体参数化模型下游任务2D姿态估计多人姿态估计&#xff1a;自顶向下方法基于回归的自顶向下方法基于热力图的自顶向下方法 多人姿态估计&#xff1a;自底向上方法单阶段方法基于Transformer的方法小结 3D姿态估计评估指标 Dense Po…

面向对象特征之一:封装和隐藏

为什么要引入封装性&#xff1f; ●我们程序设计追求“高内聚&#xff0c;低耦合” ➢高内聚:类的内部数据操作细节自己完成&#xff0c;不允许外部干涉; ➢低耦合:仅对外暴露少量的方法用于使用。 ●隐藏对象内部的复杂性&#xff0c;只对外公开简单的接口。便于外界调用&am…

ISIS路由渗透实验

1&#xff09;拓扑 2&#xff09;需求&#xff1a;ISIS全网互联互通 3&#xff09;原因分析&#xff1a; 因为&#xff0c;L1/2 路由器&#xff08;R4、R8&#xff09;学习到L1类型路由信息会装进L2-LSP&#xff0c;在泛洪给其他区域的L2和L1/2路由器&#xff0c;所以&#x…

【socket】从计算机网络基础到socket编程——Windows Linux C语言 + Python实现(TCP+UDP)

一、部分基础知识1.1 计算机网络的体系结构1.11 互联网简介1.12 计算机网络的分类1.13 协议与网络的分层体系结构▶ 协议▶ 网络的分层体系结构 1.14 OSI 七层模型&#xff08;重要&#xff09;▶ OSI 模型的结构▶ OSI 模型各层的功能 1.15 TCP/IP 的体系结构&#xff08;重要…

linux服务器彻底清除xmrig挖矿病毒

不想看前面的内容可直接进入第三点看解决方案。 一&#xff0c;事件起因 二&#xff0c;检查过程 三&#xff0c;解决方案 1&#xff0c;找到病毒文件 2 &#xff0c;杀死病毒进程&#xff0c;删除病毒文件 3&#xff0c;查看linux服务器上的定时任务 4&#xff0c;最后&…

【MySQL新手到通关】第七章 聚合函数使用详解

文章目录 0. 前置1. 聚合函数介绍1.1 AVG 和 SUM 函数1.2 MIN 和 MAX 函数1.3 COUNT函数 2. GROUP BY2.1 基本使用 3. HAVING3.1 基本使用3.2 WHERE和HAVING的对比 0. 前置 为了方便测试&#xff0c;我们导入一些数据 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ------…

编程(39)----------多线程中的锁

假设一个这样的场景: 在多线程的代码中, 需要在不同的线程中对同一个变量进行操作. 那此时就会出现问题: 多线程是并发进行的, 也就是说代码运行的时候, 俩个线程会同时对一个变量进行操作, 这样就会涉及到多线程的安全问题: class Counter{public int count;public void add…

RPC核心原理(整体架构/调用过程)

Server: Provider ,暴露服务,服务提供方 Client: Consumer ,服务消费,调用远程服务 Registry:服务注册与发现 RPC的调用过程如下&#xff1a; 第一步&#xff1a;server会将他需要暴露的服务以及他的地址信息注册到Registry这一注册中心。 第二步&#xff1a;client通过注册…

【VScode】ESLint :warning Delete `CR` prettier/prettier

一. ESLint 作用 检查 Javascript 编程时的语法错误。 新建或修改文件时报错 原因 Windows系统 &#xff0c;clone的代码会自动把换行符 LF转为回车符CRLF&#xff0c;这时本地的代码都是回车符。可在prettier.config.js中查看到 检查配置&#xff08;ESLint中是…

linux(system V标准)信号量

目录&#xff1a; 1.什么是信号量 2.信号量的本质 1.什么是信号量 2.信号量的本质 什么是临界资源呢?? 凡是倍多个执行流同时访问的资源就是临界资源&#xff01;&#xff01;&#xff01; 我们看一个问题&#xff0c;我们fork&#xff08;&#xff09;之后创建一个子进程&a…

redis----缓存穿透、击穿、雪崩问题解决

缓存 缓存更新方式 这是决定在使用缓存时就该考虑的问题。 设置缓存数据的TTL&#xff0c;当缓存数据失效后&#xff0c;如果有系统要请求&#xff0c;则会查询数据库并插入缓存&#xff08;被动更新&#xff09; 不友好在各类会往mysql写入数据的系统中&#xff0c;植入更新…

360天御滑块

又来水文章&#xff1f;当然&#xff0c;闲着无聊&#xff0c;走过路过&#xff0c;不要错过&#xff0c;点进来多看看。 两种类型。滑块&#xff0c;文字点选。此案例就以网友投稿的滑块来说。 怎么说呢&#xff0c;名字好听&#xff0c;本次难点&#xff0c;js混淆&#xff…