基于Python+大数据的外卖配送分析可视化系统设计与实现

本文介绍了如何利用Python和Scrapy构建外卖配送分析及可视化系统,涉及网络爬虫技术、数据抓取、MySQL存储、数据清洗和数据可视化的过程,旨在提升工作效率并解决信息管理难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一.前言

在这里插入图片描述

目前,与传统数据相比,大数据具有数据量大、种类多、成本低的特点。大数据的意义不仅局限于互联网产业的发展,而且对数字信息时代的发展起着重要的作用。从而带动了计算机的发展,在繁忙的时代,紧张的生活节奏中,无疑需要引进先进的信息管理技术,那么在信息化潮流下,卖配送分析及可视化系统应运而生,肩负起历史时期的使命。
大量复杂的美食等信息难于通过传统的方法进行管理;对于管理者来说,繁琐的信息使他们感到迷茫。外卖配送分析及可视化分析可视化设计与实现正是针对上述的问题而开发的,通过计算机系统来管理数据信息,可以解决大量信息的查询和相关管理,同时也为管理者或用户提供便利。这样,使原本独立的外卖配送分析及可视化等信息资料流程化。
本次以外卖配送分析及可视化系统爬取为例,介绍网络爬虫的基本原理,Python环境的搭建,PyCharm scrapy模块的爬虫数据的运用,把获取到的数据进行清洗、整合,储存数据到MySQL,然后进行数据可视化的呈现,简单对呈现的图进行数据分析。


二.技术环境

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


三.功能设计

对比要实现的功能来分析出用户的需求,可以让用户在python爬起外卖配送分析及可视化的大数据有了直观看板,因此,管理员对信息进行添加、修改、删除、查看,可以提高管理员的工作效率。
(1)管理员用例图如图3.1所示;
在这里插入图片描述

(2) 用户用例图如图3.2所示:
在这里插入图片描述

系统功能结构图是系统设计阶段,系统功能结构图只是这个阶段一个基础,整个系统的架构决定了系统的整体模式,是系统的根据。外卖配送分析可视化系统的整个设计结构如图3.3所示。

在这里插入图片描述

四.数据设计

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

在这里插入图片描述

在这里插入图片描述

五.部分效果展示

系统用户功能实现效果

注册界面,第一次使用本系统的使用者,首先是要进行注册,点击“注册”,然后就会进入到注册的页面里面,将用户信息录入注册表,确认信息正确后,系统才会进入登录界面,用户登录成功后可使用本系统所提供的所有功能,如图所示。
在这里插入图片描述

登录界面,首先双击打开系统,连上网络之后会显示出本系统的登录界面,这是进入系统的第初始页面“登录”,能成功进入到该登录界面则代表系统的开启是成功的,接下来就可以操作本系统所带有的其他所有的功能,如图所示。
在这里插入图片描述

用户登录系统后,可以对系统首页、个人中心、广州美食管理、系统管理等功能进行相应操作,如图所示。

在这里插入图片描述

系统管理员功能实现效果

管理员登录进入外卖配送分析及可视化可以查看系统首页、个人中心、用户管理、广州美食管理、系统管理等功能,进行详细操作,如图所示。

在这里插入图片描述

管理员点击用户管理;在用户管理页面输入用户账号、用户姓名、性别、年龄、邮箱、手机号、头像等信息,进行查询,新增或删除用户信息等操作;如图所示。
在这里插入图片描述

管理员点击美食管理;美食管理页面输入标题、评分、评论数、地址、均价、套餐价、封面等信息,进行查询、新增、删除、导入爬取数据等操作;如图所示。在这里插入图片描述

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

外卖配送分析及可视化基本情况展示,如图所示。

在这里插入图片描述

对于外卖配送分析及可视化获取分析数据之后,开始对这些数据进行可视化分析,首先是评分统计的基本情况,如图所示。

在这里插入图片描述

以下展示的是评论数统计,如图所示:

在这里插入图片描述

六.部分功能代码

# 数据爬取文件

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

# 广州美食
class GuangzhoumeishiSpider(scrapy.Spider):
    name = 'guangzhoumeishiSpider'
    spiderUrl = 'https://gz.meituan.com/meishi/api/poi/getPoiList?cityName=%E5%B9%BF%E5%B7%9E&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page={}&userId=这里用客户的用户ID&uuid=b10021bed4924dc28a85.1680007816.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fgz.meituan.com%2Fmeishi%2F&riskLevel=1&optimusCode=10&_token=eJxVjk13qjAURf9LprBMCBDRmRSBYgUVS4tdHRhEQASUDyV0vf%2F%2B0lU76Ojse%2B4enC9QPx%2FAVEJogpAIbnENpkAaoREBImgb%2FiEaQkhDEpGIKoLoTzfGiiQCWgcGmH5IqkzEMcaf382GFz%2BNRpRP8YGYI1bE7wD0mSsgbdtLM4UwGUZFnLXdvhxFVQE5N2kG%2BQbA1WLLVZ75I%2FePbH%2FvJR%2FN3SZLSk6xcz%2BfXs3rfZitN7HgpzvK%2FLkSOUQ32f6y7rpGN61bZrzM82VfBUWzQtb1rS4zKl%2FntZpBqECngFo4CN42Xef9UdPVxSro4WZFVWifhePirC%2FY4hDlA3Mir6tus9p8yxW1Mrxk2bpLEqL3Qx%2Fs2Niu1brzfNOZoLPnvccuu7yS9lgo9hCc9j4%2BNpVLTcaCgRrmtqNy4jHi%2BnjXX1OqYeEmw8hGbV4GfmMdjHAm7e4DTSbYYqEqyFY%2BnGZPd1vDyWkduoUkbPS8zMC%2F%2F49rjxg%3D'
    start_urls = spiderUrl.split(";")
    protocol = ''
    hostname = ''
    headers = {
        "host":"gz.meituan.com",
"connection":"keep-alive",
"accept":"application/json",
"mtgsig":json.dumps('{"a1":"1.0","a2":1680008017244,"a3":"yyz63uw45xz25824yywz41u7yu0uu54v8138x1yy5uz97958v4xw7u52","a4":"1dc5ca5b2d6d77695bcac51d69776d2d073f82356e48ef18","a5":"olnwwPTGpwSPjBXoGqsM3rtykZlXaqGuTcs8bNzz4RBtPQmXEHGtqrhaJ8W1ZNoT+gf250jizwOf1mzgNLlcgzL+rBPanbCigvWhkZ+dJac5g+6diS0IuifYGONkAMbyJBF=","a6":"h1.2HqTo/l6mRd8Wy9Xc7wBlArVyv0r/KpfJewUx1rxKIlBZsg+7vPfgj/1r4uVX9OfqyrFgcx/kzowBX8vFr6XIiVHAI8Pk8nICigX6CzOfl+p+Tv+jFnAsoHGV0jlYpHF6X09PJhPxQ+F/2IxDn+VQyF0iTNznlQT026K7WCB4DpKsugA9FYosLeuX5DmFoqBKl9JMBx/AIWvEtUzET+wrUnrDXG+mh5wuybbUdjucap5LZQFxdN8/sMW4vtsXWwbp4WQQ58eJ5ViuGz2qxFik6RLRDeTcVBO1m1Hx9Xu3AI1u/nVirs2MPH4/9MGdjnyyHeE/EH6/4ylqJNMCy8nOhDW4viMc5nqu2Wwoy32DE/CBQ6cnDfYnVJvQ6OD5gkUcPwEy9bprQFKSbgSauAsJIUZmZI8EPAmqGcTQC9YTPNtNhHPcHbpVdUlbzyfwemRw","a7":"com.sankuai.web.meishife.pcweb","x0":4,"d1":"1ed8069cfcef249d1a9bf96a559bc940"}'),
"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
"sec-fetch-site":"same-origin",
"sec-fetch-mode":"cors",
"referer":"https://gz.meituan.com/meishi/",
"accept-encoding":"gzip, deflate, br",
"accept-language":"zh-CN,zh;q=0.9",
"cookie":"这里用客户的cookie",
"x-postman-captr":"3614111"
    }

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

    def start_requests(self):

        plat = platform.system().lower()
        if plat == 'linux' or plat == 'windows':
            connect = self.db_connect()
            cursor = connect.cursor()
            if self.table_exists(cursor, 'g87hh_guangzhoumeishi') == 1:
                cursor.close()
                connect.close()
                self.temp_data()
                return

        pageNum = 1 + 1
        for url in self.start_urls:
            if '{}' in url:
                for page in range(1, pageNum):
                    next_link = url.format(page)
                    yield scrapy.Request(
                        url=next_link,
                        headers=self.headers,
                        callback=self.parse
                    )
            else:
                yield scrapy.Request(
                    url=url,
                    headers=self.headers,
                    callback=self.parse
                )

    # 列表解析
    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, 'g87hh_guangzhoumeishi') == 1:
                cursor.close()
                connect.close()
                self.temp_data()
                return

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

            fields = GuangzhoumeishiItem()




            fields["fengmian"] = item["frontImg"]
            fields["biaoti"] = item["title"]
            fields["pingfen"] = item["avgScore"]
            fields["pinglunshu"] = item["allCommentNum"]
            fields["dizhi"] = item["address"]
            fields["junjia"] = item["avgPrice"]
            fields["taocan"] = item["dealList"][0]["title"]
            fields["taocanjia"] = item["dealList"][0]["price"]

            yield fields

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



        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 `guangzhoumeishi`(
                id
                ,fengmian
                ,biaoti
                ,pingfen
                ,pinglunshu
                ,dizhi
                ,junjia
                ,taocan
                ,taocanjia
            )
            select
                id
                ,fengmian
                ,biaoti
                ,pingfen
                ,pinglunshu
                ,dizhi
                ,junjia
                ,taocan
                ,taocanjia
            from `g87hh_guangzhoumeishi`
            where(not exists (select
                id
                ,fengmian
                ,biaoti
                ,pingfen
                ,pinglunshu
                ,dizhi
                ,junjia
                ,taocan
                ,taocanjia
            from `guangzhoumeishi` where
                `guangzhoumeishi`.id=`g87hh_guangzhoumeishi`.id
            ))
            limit {0}
        '''.format(random.randint(10,15))

        cursor.execute(sql)
        connect.commit()

        connect.close()



最后

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一点毕设

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

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

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

打赏作者

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

抵扣说明:

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

余额充值