基于Python+Hadoop的热点新闻大数据分析可视化系统设计与实现

发布于:2024-05-07 ⋅ 阅读:(25) ⋅ 点赞:(0)

💗博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计精品项目案例-200套
🌟文末获取源码+数据库+文档🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多的人

一.前言

在这里插入图片描述

近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,热点新闻分析系统利用计算机网络实现信息化管理,使整个热点新闻分析的发展和服务水平有显著提升。
本文拟采用PyCharm开发工具, django框架、Python语言、Hadoop大数据处理技术进行开发,后台使用MySQL数据库进行信息管理,设计开发的热点新闻分析系统。通过调研和分析,系统拥有管理员和用户两个模块,主要具备有系统首页、个人中心、用户管理、新闻类型管理、主题标签管理、热点新闻管理、新闻评分管理、新闻资讯管理、系统管理等功能模块。将纸质管理有效实现为在线管理,极大提高工作效率。


二.技术环境

开发语言:Python
python框架:django
软件版本:python3.7/python3.8
数据库:mysql 5.7或更高版本
数据库工具:Navicat11
爬虫框架:Scrapy
大数据框架:Hadoop
开发软件:PyCharm/vs code
前端框架:vue.js


三.功能设计

在设计系统的过程中,用例图也是系统设计过程中必不可少的模型,如果说系统的结构图可以简洁明了的表示出系统的有关功能模块,那么用例图则可以更为细致的,结合系统中人员的有关分配,能够从细节上描绘出系统中有关功能所完成的具体事件,确切的反映出某个操作以及它们相互之间的内部联系。
其中参与者就是和系统能够发生交互的外在实体,一般可以指系统的某个用户。一个用例图就能对应出系统中的一个功能过程,系统中完整的功能都是由许多不同的用例图所组成的。
系统用例图如图3-1、图3-2、图3-3所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

系统功能结构图是系统设计阶段,系统功能结构图只是这个阶段一个基础,整个系统的架构决定了系统的整体模式,是系统的根据。热点新闻分析可视化系统的整个设计结构如图所示。
在这里插入图片描述

四.数据设计

概念模型的设计是为了抽象真实世界的信息,并对信息世界进行建模。它是数据库设计的强大工具。数据库概念模型设计可以通过E-R图描述现实世界的概念模型。系统的E-R图显示了系统中实体之间的链接。而且Mysql数据库是自我保护能力比较强的数据库,下图主要是对数据库实体的E-R图:
在这里插入图片描述

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

五.部分效果展示

系统前台功能实现效果

当游客打开系统的网址后,首先看到的就是首页界面。在这里,游客能够看到热点新闻分析系统的导航栏显示首页、热点新闻、新闻资讯、后台管理、个人中心。系统首页界面如图所示:

在这里插入图片描述

在系统首页点击中间的注册/登录按钮,然后页面跳转到注册登录界面,后来输入信息完成后,单击注册或者登录操作,如图所示:

在这里插入图片描述

用户点击热点新闻,在热点新闻页面的搜索栏输入新闻标题、主题标签、新闻内容,进行查询,然后可以查看新闻标题、封面、新闻类型、主题标签、新闻评分、新闻视频、新闻来源 、发布日期、点击次数,还可以对评分、赞、踩、收藏或者评论操作;如图所示:

在这里插入图片描述

在个人中心页面可以输入个人详细信息,进行信息更新操作,还可以对我的收藏进行详细操作,如图所示:
在这里插入图片描述
用户击后台管理,然后页面跳转到系统主页面,主要功能包括对系统首页、个人中心、新闻评分管理等进行操作。用户主页面如图所示:
在这里插入图片描述

系统后台功能实现效果

管理员登录,在登录页面正确输入用户名和密码后,选择角色点击登录操作;如图所示。
在这里插入图片描述

管理员进入系统后,主要功能包括对系统首页、个人中心、用户管理、新闻类型管理、主题标签管理、热点新闻管理、新闻评分管理、新闻资讯管理、系统管理等进行操作。管理员主页面如图所示:
在这里插入图片描述

管理员点击用户管理:在用户管理页面,可以对用户账号、用户姓名、头像、性别、联系方式等信息,进行查询、新增或者删除用户信息等操作,如图所示:
在这里插入图片描述

管理员点击主题标签管理:在主题标签管理页面,可以对主题标签等信息,进行查询或者新增、删除主题标签等操作,如图所示:
在这里插入图片描述

管理员点击热点新闻管理:在热点新闻管理页面,可以对新闻标题、封面、新闻类型、主题标签、新闻评分、新闻视频、新闻来源 、发布日期、点击次数等信息,进行查询或者新增、删除热点新闻等操作,如图所示:
在这里插入图片描述

管理员点击新闻评分管理:在新闻评分管理页面,可以对新闻标题、封面、新闻类型、评分、点评时间、用户账号、用户姓名等信息,进行查询或者删除新闻评分等操作,如图所示:
在这里插入图片描述

数据可视化分析大屏展示实现效果

热点新闻分析系统展示图,如图所示。
在这里插入图片描述

下面展示是用户人数统计,对于用户人数统计大数据,数据获取之后,开始对这些数据进行可视化分析,首先是用户人数统计的基本情况,其中根据爬取的数据以柱状图的形式来展示,如图所示。
在这里插入图片描述

下面展示是新闻类型统计,对于新闻类型统计大数据获取之后,开始对这些数据进行可视化分析,首先通过页面查看新闻类型统计详情以饼状图分析进行来展示,如图所示。
在这里插入图片描述

在日发布数量页面以波浪线图进行展示所示。
在这里插入图片描述

下图是主题标签,通过python爬取清洗后的数据以饼状图的形式展示如图所示:
在这里插入图片描述

下图是热点新闻(新闻评分TOP10),通过python爬取清洗后的数据以信息表的形式展示如图所示:

在这里插入图片描述

六.部分功能代码

# 数据爬取文件

import scrapy
import pymysql
import pymssql
from ..items import XinwenzixunItem
import time
import re
import random
import platform
import json
import os
from urllib.parse import urlparse
import requests
import emoji

# 新闻资讯
class XinwenzixunSpider(scrapy.Spider):
    name = 'xinwenzixunSpider'
    spiderUrl = 'https://i.news.qq.com/trpc.qqnews_web.kv_srv.kv_srv_http_proxy/list?sub_srv_id=24hours&srv_id=pc&offset=0&limit=199&strategy=1&ext={%22pool%22:[%22top%22,%22hot%22],%22is_filter%22:7,%22check_type%22:true}'
    start_urls = spiderUrl.split(";")
    protocol = ''
    hostname = ''

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


    # 列表解析
    def parse(self, response):
        
        _url = urlparse(self.spiderUrl)
        self.protocol = _url.scheme
        self.hostname = _url.netloc
        plat = platform.system().lower()
        if plat == 'windows_bak':
            pass
        elif plat == 'linux' or plat == 'windows':
            connect = self.db_connect()
            cursor = connect.cursor()
            if self.table_exists(cursor, 'dc9ci_xinwenzixun') == 1:
                cursor.close()
                connect.close()
                self.temp_data()
                return

        data = json.loads(response.body)
        list = data['data']['list']
        
        for item in list:

            fields = XinwenzixunItem()




            fields["biaoti"] = item['title']
            fields["laiyuan"] = item['url']
            fields["fabushijian"] = item['update_time']
            fields["fenlei"] = item['media_name']
            fields["fengmian"] = item['img']


            detailUrlRule = item['url']

            if detailUrlRule.startswith('http') or self.hostname in detailUrlRule:
                pass
            else:
                detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
                fields["laiyuan"] = detailUrlRule

            yield scrapy.Request(url=detailUrlRule, meta={'fields': fields}, callback=self.detail_parse)

    # 详情解析
    def detail_parse(self, response):
        fields = response.meta['fields']

        try:
            if '(.*?)' in '''div.content-article''':
                fields["xiangqing"] = re.findall(r'''div.content-article''', response.text, re.S)[0].strip()
            else:
                if 'xiangqing' != 'xiangqing' and 'xiangqing' != 'detail' and 'xiangqing' != 'pinglun' and 'xiangqing' != 'zuofa':
                    fields["xiangqing"] = self.remove_html(response.css('''div.content-article''').extract_first())
                else:
                    fields["xiangqing"] = emoji.demojize(response.css('''div.content-article''').extract_first())
        except:
            pass




        return fields

    # 去除多余html标签
    def remove_html(self, html):
        if html == None:
            return ''
        pattern = re.compile(r'<[^>]+>', re.S)
        return pattern.sub('', html).strip()

    # 数据库连接
    def db_connect(self):
        type = self.settings.get('TYPE', 'mysql')
        host = self.settings.get('HOST', 'localhost')
        port = int(self.settings.get('PORT', 3306))
        user = self.settings.get('USER', 'root')
        password = self.settings.get('PASSWORD', '123456')

        try:
            database = self.databaseName
        except:
            database = self.settings.get('DATABASE', '')

        if type == 'mysql':
            connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')
        else:
            connect = pymssql.connect(host=host, user=user, password=password, database=database)

        return connect

    # 断表是否存在
    def table_exists(self, cursor, table_name):
        cursor.execute("show tables;")
        tables = [cursor.fetchall()]
        table_list = re.findall('(\'.*?\')',str(tables))
        table_list = [re.sub("'",'',each) for each in table_list]

        if table_name in table_list:
            return 1
        else:
            return 0

    # 数据缓存源
    def temp_data(self):

        connect = self.db_connect()
        cursor = connect.cursor()
        sql = '''
            insert into xinwenzixun(
                biaoti
                ,laiyuan
                ,fabushijian
                ,fenlei
                ,fengmian
                ,xiangqing
            )
            select
                biaoti
                ,laiyuan
                ,fabushijian
                ,fenlei
                ,fengmian
                ,xiangqing
            from dc9ci_xinwenzixun
            where(not exists (select
                biaoti
                ,laiyuan
                ,fabushijian
                ,fenlei
                ,fengmian
                ,xiangqing
            from xinwenzixun where
             xinwenzixun.biaoti=dc9ci_xinwenzixun.biaoti
            and xinwenzixun.laiyuan=dc9ci_xinwenzixun.laiyuan
            and xinwenzixun.fabushijian=dc9ci_xinwenzixun.fabushijian
            and xinwenzixun.fenlei=dc9ci_xinwenzixun.fenlei
            and xinwenzixun.fengmian=dc9ci_xinwenzixun.fengmian
            and xinwenzixun.xiangqing=dc9ci_xinwenzixun.xiangqing
            ))
            limit {0}
        '''.format(random.randint(20,30))

        cursor.execute(sql)
        connect.commit()

        connect.close()

最后

最新计算机毕业设计选题篇-选题推荐(值得收藏)
计算机毕业设计精品项目案例-200套(值得订阅)