基于spark小红书舆情分析可视化预测系统 大数据技术 社交平台数据分析 爬虫技术 深度学习Fnn前馈神经网络 snownlp情感分析 毕业设计(源码+文档)✅

基于spark小红书舆情分析可视化预测系统 大数据技术 社交平台数据分析 爬虫技术 深度学习Fnn前馈神经网络 snownlp情感分析 毕业设计(源码+文档)✅

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈:
python语言、spark、Hadoop、hive、Django框架、Echarts可视化、requests爬虫、
深度学习Fnn前馈神经网络、snownlp情感分析、

基于spark大数据技术小红书舆情分析可视化预测系统

2、项目界面

(1)系统首页数据大屏面板

(2)数据中心(小红书笔记数据、评论数据)

(3)小红书笔记类型分析

(4)小红书笔记分析

(5)小红书笔记评论分析

(6)小红书笔记热词分析

(7)小红书笔记舆情分析

(8)小红书笔记评论数据

(9)小红书笔记词云图分析

(11)小红书笔记点赞量预测

(12)注册登录

3、项目说明

功能模块:
数据采集
注册登录
首页:数据统计、top笔记点赞评论分析柱状图、点赞Top评论、笔记类型统计分析、小红书笔记数据概览
小红书笔记数据列表(列表展示)
小红书笔记数据详情页(笔记内容、笔记时间、话题、图片展示、发表评论功能)
修改个人信息(修改密码)
笔记类型分析(各类型点赞收藏评论均值分析、各类型总热度分析、)
笔记分析(笔记收藏区间分析、笔记点赞最值分析、)
评论分析(评论点赞与回复量max值分析、评论点赞区间分析)
热词分析(选择热词进行分析,包括时间线分析、热词类型分布)

情感分析(情感类型统计分析、热词top10、情感得分区间统计)
笔记词云图分析
点赞量预测(选择:类型、收藏量、评论量,输出点赞量预测结果)

后台管理(笔记数据管理、用户管理)

摘 要
小红书每天会产生大量笔记数据,但传统方法处理这些数据、分析舆情趋势以及预测热门程度时,效果都不够好。为此,本文设计并实现了一套基于 Spark 技术的小红书舆情分析可视化预测系统,帮大家更好地处理和分析小红书数据。​
系统用 Python 作为主要开发语言,搭配 Spark、Hadoop、Hive 这些工具来处理海量数据;用爬虫(Requests 和 Selenium)抓取小红书的公开数据;用 Django 搭建网页框架,Echarts 制作数据图表;还用到 FNN 模型和 SnowNLP 工具,分别做点赞量预测和评论情感分析,形成了从抓数据、存数据、分析数据到展示结果的完整流程。​
研究主要实现了四个核心模块:基础功能模块里,能合法抓取小红书的笔记内容、发布时间、话题标签、点赞收藏等数据,抓取成功率不低于 90%,同时做了注册登录功能,支持多种注册方式,密码加密保存,还分了普通用户和管理员两种权限;数据展示模块里,首页能看到核心数据和图表(比如点赞多的笔记柱状图、笔记类型分布饼图),笔记列表能按点赞、时间等排序和分页加载,详情页能看完整笔记信息,还能发表评论;数据挖掘分析模块里,会计算不同类型笔记的平均互动数据和总热度,统计笔记收藏区间、点赞最多最少的笔记,分析评论的点赞和回复情况,提取热门词并看它的时间变化和类型分布,用 SnowNLP 分析评论是正面、负面还是中性,还能生成词云图;预测模块里,根据笔记类型、收藏量、评论量,用 FNN 模型预测笔记的点赞量,用户在界面上就能看到预测结果。​
这套系统能及时掌握小红书的舆情动态,它不仅能帮企业做更精准的营销,帮监管部门关注舆情,对学习社交媒体大数据分析也有实际意义。

关键词:小红书;spark;大数据;数据分析;可视化

目录
摘 要 1
Abstract 2
一、引言 3
1.1 研究背景与意义 4
1.2 国内外研究现状 4
1.3 研究目标与内容 5
1.4 研究方法 7
二、关键技术概述 7
2.1 Spark 大数据处理框架 7
2.2 Hadoop 与 Hive 8
2.3 Django 框架 9
2.4 Echarts 可视化 10
2.5 Requests 爬虫与 Selenium 爬虫 10
2.6 深度学习 Fnn 前馈神经网络 11
2.7 SnowNLP 情感分析 12
三、系统需求分析 12
3.1 功能需求 13
3.2 性能需求 15
3.3 安全需求 16
四、系统设计 16
4.1 总体架构设计 16
4.2 功能模块设计 18
五、系统实现 24
5.1 开发环境搭建 24
5.2 数据采集模块实现 28
5.3 用户模块实现 31
5.4 数据展示 35
六、系统测试 35
6.1 测试环境与工具 35
6.2 功能测试 35
6.3 性能测试 37
6.4 安全测试 38
6.5 测试结果总结 38
七、结论与展望 38
7.1 研究成果总结 39
7.2 研究不足与展望 39
致谢 41
参考文献 42

4、核心代码

#coding:utf8

from pyspark.sql import SparkSession
from pyspark.sql.functions import monotonically_increasing_id
from pyspark.sql.types import StructType,StructField,StringType,IntegerType,FloatType
from pyspark.sql.functions import count,mean,col,sum,when,max,min,avg,to_timestamp,current_timestamp,expr,coalesce,lit



if __name__ == '__main__':
    #构建
    spark = SparkSession.builder.appName("sparkSQL").master("local[*]").\
        config("spark.sql.shuffle.partitions", 2). \
        config("spark.sql.warehouse.dir", "hdfs://node1:8020/user/hive/warehouse"). \
        config("hive.metastore.uris", "thrift://node1:9083"). \
        enableHiveSupport().\
        getOrCreate()


    #读取数据
    xhsData = spark.read.table("xhsData")
    xhs***ment = spark.read.table("xhs***ment")


    #需求1 点赞TOP
    TOP_result = xhsData.orderBy(col("likeNum").desc())
    result1 = TOP_result.limit(100)

    TOP_result2 = xhs***ment.orderBy(col("***Like").desc())
    result2 = TOP_result2.limit(10)

    #sql
    # sql
    result1.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "TopXhsData"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result1.write.mode('overwrite').saveAsTable("TopXhsData", "parquet")
    spark.sql("select * from TopXhsData").show()

    result2.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "TopXhs***ment"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result2.write.mode('overwrite').saveAsTable("TopXhs***ment", "parquet")
    spark.sql("select * from TopXhs***ment").show()

    #需求2 笔记点赞分析
    reuslt3 = xhsData.groupby("type").agg(
        max("likeNum").alias("max_likeNum"),
        mean("likeNum").alias("mean_likeNum"),
    )
    #sql
    reuslt3.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "noteDoubleLike"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    reuslt3.write.mode('overwrite').saveAsTable("noteDoubleLike", "parquet")
    spark.sql("select * from noteDoubleLike").show()

    #需求3 评论
    xhsdata_like_category = xhsData.withColumn(
        "replyCategory",
        when(col("replyNum").between(0,100),'0-100')
        .when(col("replyNum").between(100,500),'1-500')
        .when(col("replyNum").between(500,1000),'500-1000')
        .when(col("replyNum").between(1000,2000),'1000-2000')
        .when(col("replyNum").between(2000,5000),'2000-5000')
        .otherwise('5000以上')
    )
    result4 = xhsdata_like_category.groupby("replyCategory").count()


    xhsdata_collect_category = xhsData.withColumn(
        "collectCategory",
        when(col("replyNum").between(0,100),'0-100')
        .when(col("replyNum").between(100,500),'1-500')
        .when(col("replyNum").between(500,1000),'500-1000')
        .when(col("replyNum").between(1000,2000),'1000-2000')
        .when(col("replyNum").between(2000,5000),'2000-5000')
        .otherwise('5000以上')
    )
    result5 = xhsdata_collect_category.groupby("collectCategory").count()

    # sql
    result4.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "noteCategoryReply"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result4.write.mode('overwrite').saveAsTable("noteCategoryReply", "parquet")
    spark.sql("select * from noteCategoryReply").show()

    result5.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "noteCategoryCollect"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result5.write.mode('overwrite').saveAsTable("noteCategoryCollect", "parquet")
    spark.sql("select * from noteCategoryCollect").show()

    #需求五 评论点赞区间
    xhs***ment_like_category = xhs***ment.withColumn(
        "***LikeCategory",
        when(col("***Like").between(0, 10), '0-10')
        .when(col("***Like").between(10, 20), '10-20')
        .when(col("***Like").between(20, 50), '20-50')
        .when(col("***Like").between(50, 100), '50-100')
        .when(col("***Like").between(100, 200), '100-200')
        .otherwise('200以上')
    )
    result6 = xhs***ment_like_category.groupby("***LikeCategory").count()

    result6.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "***LikeCategory"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result6.write.mode('overwrite').saveAsTable("***LikeCategory", "parquet")
    spark.sql("select * from ***LikeCategory").show()

    #需求6 评论点赞与评论量对比
    ***Double_df = xhs***ment.groupby("noteId").agg(
        max("***Like").alias("max_***Like"),
        max("***Relpy").alias("max_***Relpy")
    )

    result7 = ***Double_df.orderBy(col("max_***Like").desc()).limit(10)

    result7.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "***pareDouble"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result7.write.mode('overwrite').saveAsTable("***pareDouble", "parquet")
    spark.sql("select * from ***pareDouble").show()

    #各类型统计
    result8 = xhsData.groupby("type").count()


    result8.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "xhsTypeCount"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result8.write.mode('overwrite').saveAsTable("xhsTypeCount", "parquet")
    spark.sql("select * from xhsTypeCount").show()

    #需求8
    result9 = xhsData.groupby("type").agg(
        avg("likeNum").alias("avg_likeNum"),
        avg("collectNum").alias("avg_collectNum"),
        avg("replyNum").alias("avg_replyNum"),
    )

    result9.write.mode("overwrite"). \
            format("jdbc"). \
            option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
            option("dbtable", "tripleAvg"). \
            option("user", "root"). \
            option("password", "root"). \
            option("encoding", "utf-8"). \
            save()

    result9.write.mode('overwrite').saveAsTable("tripleAvg", "parquet")
    spark.sql("select * from tripleAvg").show()

    #需求9 按类型得出每个类型的热度
    joined_df = xhsData.join(xhs***ment,"noteId","inner")

    result10 = joined_df.groupby("type").agg(sum("***Like").alias("total_***Like"))

    result10.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "type***Hot"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result10.write.mode('overwrite').saveAsTable("type***Hot", "parquet")
    spark.sql("select * from type***Hot").show()

    #需求11

    xhs***ment_range_category = xhs***ment.withColumn(
        "scoreCategory",
        when(col("scores").between(0, 0.1), '0-0.1')
        .when(col("scores").between(0.1, 0.2), '0.1-0.2')
        .when(col("scores").between(0.2, 0.3), '0.2-0.3')
        .when(col("scores").between(0.3, 0.4), '0.3-0.4')
        .when(col("scores").between(0.4, 0.5), '0.4-0.5')
        .when(col("scores").between(0.5, 0.6), '0.5-0.6')
        .when(col("scores").between(0.7, 0.8), '0.7-0.8')
        .when(col("scores").between(0.8, 0.9), '0.8-0.9')
        .when(col("scores").between(0.9, 1), '0.9-1')
        .otherwise('overRange')
    )

    result11 = xhs***ment_range_category.groupby("scoreCategory").count()

    result11.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "emoRange"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result11.write.mode('overwrite').saveAsTable("emoRange", "parquet")
    spark.sql("select * from emoRange").show()

    ##需求十一 积极消极
    xhs***ment_emo_category = xhs***ment.withColumn(
        "emoCategory",
        when(col("scores").between(0, 0.45), '消极')
        .when(col("scores").between(0.45, 0.55), '中性')
        .when(col("scores").between(0.55, 1), '积极')
        .otherwise('未知')
    )

    result12 = xhs***ment_emo_category.groupby("emoCategory").count()

    result12.write.mode("overwrite"). \
        format("jdbc"). \
        option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
        option("dbtable", "emoSeparate"). \
        option("user", "root"). \
        option("password", "root"). \
        option("encoding", "utf-8"). \
        save()

    result12.write.mode('overwrite').saveAsTable("emoSeparate", "parquet")
    spark.sql("select * from emoSeparate").show()

🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

转载请说明出处内容投诉
CSS教程网 » 基于spark小红书舆情分析可视化预测系统 大数据技术 社交平台数据分析 爬虫技术 深度学习Fnn前馈神经网络 snownlp情感分析 毕业设计(源码+文档)✅

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买