基于Python+爬虫+协同过滤算法的校园食堂点餐可视化分析系统设计与实现

💗博主介绍:✌全网粉丝15W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者,计算机毕设实战导师。目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌
💗主要服务内容免费功能设计、选题定题、开题报告、任务书、程序开发、论文编写和辅导、论文降重、程序讲解、答辩辅导等,欢迎咨询~
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计精品项目案例(持续更新)
🌟文末获取源码+数据库+文档🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多的人

一.前言

本文研究了一种基于Python+爬虫+协同过滤算法的校园食堂点餐可视化分析系统。当前校园食堂订餐系统面临着订餐效率低、推荐准确度低等问题,为此,该研究提出了一种新的解决方案。

本论文介绍了协同过滤算法的原理和应用。该算法通过寻找相似用户或物品进行推荐。协同过滤算法已经在电子商务和社交媒体等领域取得了较好的效果,本研究将其引入到校园食堂订餐系统中。论文详细描述了校园食堂订餐系统的架构和设计。系统主要分为三个部分:用户信息管理、商品信息管理和推荐算法模块。用户信息管理模块包括用户注册、登录和个人信息管理等功能;商品信息管理模块包括商品分类、添加、删除和修改等功能;推荐算法模块则基于协同过滤算法,根据用户的历史订餐记录和其他用户的行为数据,给用户推荐合适的菜品。实验结果表明,基于Python+爬虫+协同过滤算法的校园食堂点餐可视化分析系统在推荐准确度和用户满意度上较传统系统有显著提升。该系统可以提高校园食堂的订餐效率和推荐准确度,为校园食堂提供了一种全新的订餐模式。


二.技术环境

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


三.功能设计

基于Python+爬虫+协同过滤算法的校园食堂点餐可视化分析系统主要有管理员、用户和商家三大功能模块。以下将对这三大模块的作用进行详细的剖析。
管理员模块:管理员是系统中的核心用户,管理员登录后,可以对后台系统进行管理。主要功能有美食管理、用户管理、商家管理、菜品类型管理、菜品信息管理、用户反馈管理、系统管理及订单管理等功能。管理员用例如图所示。

在这里插入图片描述
商家模块:商家进入系统在我的页面可以对菜品信息、订单管理、用户信息等进行管理。商家用例如图所示。
在这里插入图片描述
用户模块:用户进入系统在我的页面可以对菜品信息、订单管理、用户信息等进行管理。用户用例如图所示。
在这里插入图片描述
在推荐功能中,热门菜品的出现频率过高,将导致推荐的结果较为单一,用户将更多的看到热门的菜品,而这样并不能很好的体现用户需求,比如说,有两个用户都点过红烧肉,这并不能说明这两人的爱好相同,因为在国内这是大部分人都喜欢的菜品,但假如两个人都喜欢吃某一地区的小众美食,那么就可以在一定程度上认为这两人的饮食偏好较为相同。为了提高精准性,本文在余弦相似度的计算中加入惩罚项,降低热门菜品对用户相似度计算的影响。
在这里插入图片描述

四.数据设计

系统需要数据库存储系统中的信息,MySQL数据库能够处理系统的信息,当考研信息爬虫与分析需要数据的时候,MySQL数据库能够取得数据交给服务端处理。MySQL数据库能够使用可视化软件操作,管理员可以在可视化软件对数据库的信息管理。
系统数据层设计包括了E-R设计,系统数据实体的设计依赖于E-R的分析和设计,通过E-R能够得到数据库表的设计,E-R能够描述系统所涉及到的实体,还能够描述系统中不同实体的联系和关系。本系统设计的数据表主要包含:用户信息表、商家信息表、管理员信息表、订单表等。系统总体E-R图如下所示:
在这里插入图片描述

五.部分效果展示

5.1前台用户功能实现效果

进入前台首页页面点击美食,该模块显示美食的店铺名称、价格及上架时间,如图所示。
在这里插入图片描述
进入前台首页页面点击菜品信息,该模块显示菜品的店铺名称、价格及上架时间,如图所示。

在这里插入图片描述

在菜品信息推荐栏内,会根据用户的购买量以及点击次数对菜品进行排序,如图所示。
在这里插入图片描述

在菜品名称框可以搜索指定的菜品信息及最小和最大价格,结果展示如图所示。
在这里插入图片描述

进入前台首页页面点击公告栏,该模块显示系统的发布的通知,以便及时的做出调整,如图所示。
在这里插入图片描述

点击公告详情可以看到发布人,访问数,点赞数及公告详情,如图所示。
在这里插入图片描述

5.2后台管理员功能实现效果

管理员登录时,根据提示填写信息,信息正确,进入系统,如图所示。
在这里插入图片描述

管理员登录成功后,可以查看首页、美食、用户、商家、菜品类型、菜品信息、用户反馈、系统管理、订单管理等各种信息进行相应操作。

用户信息模块:在用户信息页面中,管理员可以对用户名、昵称、图片等信息进行搜索、增加或删除等操作,如图所示。
在这里插入图片描述

美食模块:包括店名、图片、地址、评分,人均、点评数等操作,如图所示。
在这里插入图片描述

商家信息模块:在商家信息页面中,管理员可以对用商家名、昵称、图片等信息进行搜索、增加或删除等操作,如图所示。
在这里插入图片描述

菜品信息:在菜品信息页面中可以查看菜品名称、菜品类型、菜品内容、菜品食材、店铺账号、店铺地址、联系方式等内容,并进行增加或删除等操作,如图所示。
在这里插入图片描述

用户反馈:在用户反馈页面中可以用户名、留言内容、留言图片、回复内容、回复图片等内容,并进行增加或删除等操作,如图所示。
在这里插入图片描述

订单管理:在订单管理页面中可以查看订单编号、商品名称、食谱图片、购买数量、价格、总价格、支付类型等内容,并进行增加或删除等操作,订单管理包括已取消订单、已退款订单、已发货订单、未支付订单、已完成订单。如图所示。

在这里插入图片描述

5.3可视化大屏展示功能实现效果

可视化大屏:在可视化大屏页面中可以查看菜系、点评、评分、公告、人均消费、美食总数、点评数、美食信息等内容,如图所示。
在这里插入图片描述

六.部分功能代码


import scrapy
import pymysql
import pymssql
from ..items import xiangmuItem
import time
import re
import random
import platform
import json
import os
from urllib.parse import urlparse
import requests
import emoji
class xiangmuSpider(scrapy.Spider):
    name = 'xiangmuSpider'
    spiderUrl = 'https://url网址'
    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, 'xiangmu') == 1:
                cursor.close()
                connect.close()
                self.temp_data()
                return

        list = response.css('ul.subject-list li.subject-item')
        
        for item in list:

            fields = xiangmuItem()



            fields["laiyuan"] = self.remove_html(item.css('div.pic a.nbg::attr(href)').extract_first())
            if fields["laiyuan"].startswith('//'):
                fields["laiyuan"] = self.protocol + ':' + fields["laiyuan"]
            elif fields["laiyuan"].startswith('/'):
                fields["laiyuan"] = self.protocol + '://' + self.hostname + fields["laiyuan"]
            fields["fengmian"] = self.remove_html(item.css('div.pic a.nbg img::attr(src)').extract_first())
            fields["xiaoshuoming"] = self.remove_html(item.css('div.info h2 a::attr(title)').extract_first())

            detailUrlRule = item.css('div.pic a.nbg::attr(href)').extract_first()
            if self.protocol in detailUrlRule:
                pass
            elif detailUrlRule.startswith('//'):
                detailUrlRule = self.protocol + ':' + detailUrlRule
            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#info span a::text''':
                fields["zuozhe"] = re.findall(r'''div#info span a::text''', response.text, re.S)[0].strip()
            else:
                if 'zuozhe' != 'xiangqing' and 'zuozhe' != 'detail' and 'zuozhe' != 'pinglun' and 'zuozhe' != 'zuofa':
                    fields["zuozhe"] = self.remove_html(response.css('''div#info span a::text''').extract_first())
                else:
                    fields["zuozhe"] = emoji.demojize(response.css('''div#info span a::text''').extract_first())
        except:
            pass
 # 去除多余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


为什么选择我们

大学毕业那年,曾经有幸协助指导老师做过毕业设计课题分类、论文初选(查看论文的格式)、代码刻录等打杂的事情,也帮助过同界N多同学完成过毕业设计工作,毕业后在一家互联网大厂工作8年,先后从事Java前后端开发、系统架构设计等方面的工作,有丰富的编程能力和水平,也在工作之余指导过别人完成过一些毕业设计的工作。2016年至今,团队已指导上万名学生顺利通过毕业答辩,目前是csdn特邀作者、CSDN全栈领域优质创作者,博客之星、掘金/华为云/B站/知乎等平台优质作者,计算机毕设实战导师,专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎咨询~✌

最后

💕💕
最新计算机毕业设计选题篇-选题推荐
小程序毕业设计精品项目案例-200套
Java毕业设计精品项目案例-200套
Python毕业设计精品项目案例-200套
大数据毕业设计精品项目案例-200套
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一点毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值