大数据毕业设计:租房推荐系统 python 租房大数据 爬虫+可视化大屏 计算机毕业设计(附源码+文档)✅

news2024/11/29 4:35:09

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总

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

1、项目介绍

技术栈:
租房大数据分析可视化平台 毕业设计 python 爬虫 推荐系统

Django框架、vue前端框架、scrapy爬虫、贝壳租房网
租房大数据分析可视化平台是一个基于Django框架和vue前端框架开发的系统,使用scrapy爬虫技术从贝壳租房网上获取租房数据,并通过数据分析和可视化技术展示给用户。

该系统的主要功能包括:

  1. 数据爬取:使用scrapy爬虫技术从贝壳租房网上获取租房数据,包括房源信息、租金、位置等。

  2. 数据存储:将爬取到的租房数据存储到数据库中,方便后续的数据分析和展示。

  3. 数据分析:对爬取到的租房数据进行分析,包括租金分布、地理位置分布、房屋面积分布等。

  4. 可视化展示:将数据分析的结果通过图表、地图等形式展示给用户,方便用户了解租房市场的情况。

  5. 推荐系统:根据用户的需求和偏好,通过数据分析和机器学习算法为用户推荐符合其需求的租房信息。

通过该系统,用户可以方便地了解租房市场的情况,包括租金水平、地理位置分布等,同时还可以根据自己的需求和偏好获取个性化的租房推荐。

2、项目界面

(1)租房数据可视化大屏

在这里插入图片描述

(2)租房推荐

在这里插入图片描述

(3)租房数据详情页
在这里插入图片描述

(4)房屋数据

在这里插入图片描述

(5)注册登录界面

在这里插入图片描述

(6)数据爬取页面

在这里插入图片描述

3、项目说明

租房大数据分析可视化平台是一个基于Django框架和vue前端框架开发的系统,使用scrapy爬虫技术从贝壳租房网上获取租房数据,并通过数据分析和可视化技术展示给用户。

该系统的主要功能包括:

  1. 数据爬取:使用scrapy爬虫技术从贝壳租房网上获取租房数据,包括房源信息、租金、位置等。

  2. 数据存储:将爬取到的租房数据存储到数据库中,方便后续的数据分析和展示。

  3. 数据分析:对爬取到的租房数据进行分析,包括租金分布、地理位置分布、房屋面积分布等。

  4. 可视化展示:将数据分析的结果通过图表、地图等形式展示给用户,方便用户了解租房市场的情况。

  5. 推荐系统:根据用户的需求和偏好,通过数据分析和机器学习算法为用户推荐符合其需求的租房信息。

通过该系统,用户可以方便地了解租房市场的情况,包括租金水平、地理位置分布等,同时还可以根据自己的需求和偏好获取个性化的租房推荐。

4、核心代码


from .models import *
import json
from django.http.response import HttpResponse
from django.shortcuts import render
from django.http import JsonResponse
from datetime import datetime, time
from django.core.paginator import Paginator
from django.db.models import Q
import simplejson
from collections import Counter
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Map, Grid, Bar, Line, Pie, TreeMap
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from pyecharts.options.charts_options import MapItem
from django.db.models import Q, Count, Avg, Min, Max


def to_dict(l, exclude=tuple()):
    # 将数据库模型 变为 字典数据 的工具类函数
    def transform(v):
        if isinstance(v, datetime):
            return v.strftime("%Y-%m-%d %H:%M:%S")
        return v

    def _todict(obj):
        j = {
            k: transform(v)
            for k, v in obj.__dict__.items()
            if not k.startswith("_") and k not in exclude
        }
        return j

    return [_todict(i) for i in l]


def unique_fields(request):
    body = request.json
    field = body.get("field")
    data = [i[0] for i in Rental.objects.values_list(field).distinct()]
    return JsonResponse(data, safe=False)


def get_list(request):
    # 列表
    body = request.json
    pagesize = body.get("pagesize", 10)
    page = body.get("page", 1)
    orderby = body.get("orderby", "-id")
    notin = ["pagesize", "page", "total", "orderby"]
    query = {
        k: v for k, v in body.items() if k not in notin and (v != "" and v is not None)
    }
    q = Q(**query)
    objs = Rental.objects.filter(q).order_by(orderby)
    paginator = Paginator(objs, pagesize)
    pg = paginator.page(page)
    result = to_dict(pg.object_list)
    return JsonResponse(
        {
            "total": paginator.count,
            "result": result,
        }
    )


def get_detail(request):
    # 详情
    body = request.json
    id = body.get("id")
    o = Rental.objects.get(pk=id)
    his = History.objects.filter(userId=request.user.id).order_by("-createTime").first()
    if not (his and his.rentalId == o.id):
        History(userId=request.user.id, rentalId=o.id).save()
    return JsonResponse(to_dict([o])[0])


def history_recommand(request):
    rentalIds = (
        History.objects.filter(userId=request.user.id)
        .values_list("rentalId")
        .distinct()
    )
    rentals = []
    # 根据历史查看记录推荐
    if rentalIds:
        rentalIds = [i[0] for i in rentalIds]
        location = [
            i[0]
            for i in Rental.objects.filter(id__in=rentalIds).values_list("location")
        ]
        locations = ["-".join(i.split("-")[:2]) for i in location]
        most_common_cates = list(dict(Counter(locations).most_common(2)).keys())
        q = Q()
        for i in most_common_cates:
            q |= Q(location__icontains=i)
        rentals = Rental.objects.filter(q).order_by("?")[:5]
    # 没有记录则随机推荐
    else:
        rentals = Rental.objects.order_by("?")[:5]
    return JsonResponse(to_dict(rentals), safe=False)


def type_pie(request):
    data = {
        i["type"]: i["count"]
        for i in Rental.objects.values("type").annotate(count=Count("id"))
        if "租" in i["type"]
    }
    # 用饼图展示数据
    c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
        .add(
            "",
            list(data.items()),
            label_opts=opts.LabelOpts(is_show=False),
            radius=["40%", "75%"],
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="租房类型统计", pos_left="40%"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_right="80%", orient="vertical"
            ),
        )
    )
    # 返回数据
    return HttpResponse(c.dump_options(), content_type="application/json")


def orientation_map(request):
    data = [
        {"name": i["orientation"], "value": i["count"]}
        for i in Rental.objects.values("orientation").annotate(count=Count("id"))
    ]

    # 用饼图展示数据
    c = (
        TreeMap(init_opts=opts.InitOpts(width="1280px", height="720px"))
        .add(
            series_name="option",
            data=data,
            visual_min=300,
            leaf_depth=1,
            # 标签居中为 position = "inside"
            label_opts=opts.LabelOpts(position="inside"),
        )
        .set_global_opts(
            legend_opts=opts.LegendOpts(is_show=False),
            title_opts=opts.TitleOpts(title="房屋朝向分析", pos_left="leafDepth"),
        )
    )
    # 返回数据
    return HttpResponse(c.dump_options(), content_type="application/json")


def level_bar(request):
    data = {
        i["level"]: i["count"]
        for i in Rental.objects.values("level").annotate(count=Count("id"))
        if i["level"]
    }

    # 用柱状图展示统计数据
    c = (
        Bar()
        .add_xaxis([i[0] for i in data.items()])
        .add_yaxis(
            "",
            [i[1] for i in data.items()],
            label_opts=opts.LabelOpts(is_show=False),
            bar_max_width=50,
        )
        .reversal_axis()
        .set_global_opts(
            title_opts=opts.TitleOpts(title="楼层类型分析"),
            # datazoom_opts=opts.DataZoomOpts(orient="vertical"),
            yaxis_opts=opts.AxisOpts(
                type_="category",
                axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
            ),
        )
    )
    # 返回数据
    return HttpResponse(c.dump_options(), content_type="application/json")


def price_bar(request):
    data = {}
    data["1000以下"] = Rental.objects.filter(price__lte=1000).count()
    data["1000-2000"] = Rental.objects.filter(price__gte=1000, price__lte=2000).count()
    data["2000-3000"] = Rental.objects.filter(price__gte=2000, price__lte=3000).count()
    data["3000-4000"] = Rental.objects.filter(price__gte=3000, price__lte=4000).count()
    data["4000-5000"] = Rental.objects.filter(price__gte=4000, price__lte=5000).count()
    data["5000-6000"] = Rental.objects.filter(price__gte=5000, price__lte=6000).count()
    data["6000-7000"] = Rental.objects.filter(price__gte=6000, price__lte=7000).count()
    data["7000以上"] = Rental.objects.filter(price__gte=7000).count()

    # 用柱状图展示统计数据
    c = (
        Bar()
        .add_xaxis([i[0] for i in data.items()])
        .add_yaxis(
            "",
            [i[1] for i in data.items()],
            label_opts=opts.LabelOpts(is_show=False),
            bar_max_width=50,
            color="#5689ff",
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="房源价格分布"),
            # datazoom_opts=opts.DataZoomOpts(orient="vertical"),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
            ),
        )
    )
    # 返回数据
    return HttpResponse(c.dump_options(), content_type="application/json")


def province_map(request):
    data = {
        i["province"] + "省": i["count"]
        for i in Rental.objects.values("province").annotate(count=Count("id"))
    }
    dd = [MapItem(name=i[0], value=i[1]) for i in data.items()]
    m = (
        Map()
        .add("房源数量", dd, "china", is_roam=False, is_map_symbol_show=False)
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="房源数量分布",
            ),
            visualmap_opts=opts.VisualMapOpts(
                max_=1000,
                is_piecewise=False,
            ),
            legend_opts=opts.LegendOpts(
                is_show=False, textstyle_opts=opts.TextStyleOpts(color="white")
            ),
        )
    )
    return HttpResponse(m.dump_options(), content_type="aplication/text")



5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

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

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

相关文章

年度征文|回顾2023我的CSDN

一年转眼而逝,回顾这一年在csdn的创作,学习,记录历程。回顾过去,才能展望未来,首先看图说话。 今年在csdn的访问量已由年初的2万到年末的50w。粉丝有年初的300个左右,增加到4000个左右。我年初的目标是粉丝…

Dockerfile语法和简单镜像构建

Dockerfile是一个用于定义Docker镜像的文本文件,包含了一系列的指令和参数,用于指示Docker在构建镜像时应该执行哪些操作,例如基于哪个基础镜像、复制哪些文件到镜像中、运行哪些命令等。 Dockerfile文件的内容主要有几个部分组成&#xff0c…

算法——BFS解决FloodFill算法

什么是FloodFill算法 中文:洪水灌溉。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。绿色圈起来的属于一块区域(…

caj转换成pdf有哪些方法?

caj转换成pdf有哪些方法?PDF是一个被广泛支持的文件格式,这种格式基本上在所有的操作系统和设备上都是支持使用的,也能够将PDF文件打开和查看的,相比于caj文件,它就只能通过一下特定的软件或者是插件才能够将caj打开或…

3.2.1CURRENT 、3.2.2-SNAPSHOT、3.1.7GA 这三者的springboot版本之前有什么区别

在Spring Boot中,版本号通常遵循主要版本.次要版本.修补版本的格式,有时后面会跟着一个额外的标签来表示版本的特殊性质。根据您提供的版本号 “3.2.1CURRENT”、“3.2.2-SNAPSHOT” 和 “3.1.7GA”,我们可以解释这些版本的含义和它们之间的区…

用贪心算法编程求解任务安排问题

题目:用贪心算法编程求解以下任务安排问题 一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束,第2 个任务从时…

react-router-dom5升级到6

前言 升级前版本为5.1.2 下载与运行 下载 npm install react-router-dom6运行 运行发现报错: 将node_modules删除,重新执行npm i即可 运行发现如下报错 这是因为之前有引用react-router-dom.min,v6中取消了该文件,所以未找到文件导致报错。…

鸿蒙4.0开发实战(ArkTS)-闹钟制作

闹钟功能要求 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表,并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 闹钟主界面 闹钟界面包括当前时间、闹钟列表、添加闹钟子组件,具体包括以下…

游戏缺少emp.dll详细修复教程,快速解决游戏无法启动问题

在现代游戏中,我们经常会遇到一些错误提示,其中之一就是“emp.dll丢失”。emp.dll是一个动态链接库文件,它包含了许多程序运行所需的函数和数据。当一个程序需要调用这些函数时,系统会从emp.dll文件中加载相应的内容。因此&#x…

智邦国际ERP系统 SQL注入漏洞复现

0x01 产品简介 北京智邦国际软件技术有限公司的ERP系统是一种集成化的企业资源计划(Enterprise Resource Planning,简称ERP)解决方案,旨在帮助企业实现高效的运营管理和资源优化。 0x02 漏洞概述 智邦国际ERP系统 GetPersonalS…

Spring中基于注解的IOC配置项目举例详解

文章目录 Spring中基于注解的IOC配置项目举例详解1、创建如下结构的Spring项目pom.xmldao层service层application.xmllog4j.properties 2、用于创建对象的常用注解2.1、Controller或Controller("user")声明bean,且id"user"2.2、Service或用Service("u…

关键字:instanceof关键字

在 Java 中,instanceof关键字用于检查一个对象是否是某个特定类或其子类的实例。它的语法如下: 其中,Object是要检查的对象,Class是要检查的类或接口。 instanceof关键字的返回值是一个布尔值,如果对象Object是类Cla…

【MySQL】数据库之MHA高可用

目录 一、MHA 1、什么是MHA 2、MHA 的组成 3、MHA的特点 4、MHA的工作原理 二、有哪些数据库集群高可用方案 三、实操:一主两从部署MHA 1、完成主从复制 步骤一:完成所有MySQL的配置文件修改 步骤二:完成所有MySQL的主从授权&#x…

技术学习|CDA level I 多维数据透视分析

对基于多源表的结构数据进行商业智能分析,可以帮助决策者从多个不同业务角度对业务行为结果进行观测,进而帮助决策者全面、精确地定位业务问题,实现商业洞察的相关内容。通过商业智能分析产出的分析成果被统称为商业智能报表,简称…

Java利用反射动态设置对象字段值

项目场景: 桥梁信息维护需要做到字段级别的权限控制(包括增删改查),设计包含字段权限配置、字段权限级别管理维护接口两大部分。 1)字段权限配置可参考常见的用户角色管理设计; 2)对于增删改…

【elfboard linux开发板】4. 文件点灯与创建多进程

ps:提升效率的小tips: 灵活运用vim操作命令,gg快速跳转到文件开头,G跳转到结尾 多行操作 ctrl V shift i 插入修改内容 esc退出编辑 sudo vi /etc/vim/vimrc 在文件中添加如下内容省略重复工作: autocmd BufNewFile …

大模型应用实践:AIGC探索之旅

随着OpenAI推出ChatGPT,AIGC迎来了前所未有的发展机遇。大模型技术已经不仅仅是技术趋势,而是深刻地塑造着我们交流、工作和思考的方式。 本文介绍了笔者理解的大模型和AIGC的密切联系,从历史沿革到实际应用案例,再到面临的技术挑…

正定矩阵在格密码中的应用(知识铺垫)

目录 一. 写在前面 二. 最小值点 三. 二次型结构 四. 正定与非正定讨论 4.1 对参数a的要求 4.2 对参数c的要求 4.3 对参数b的要求 五. 最小值,最大值与奇异值 5.1 正定型(positive definite) 5.2 负定型(negative defin…

P10 RV1126推流项目——ffmpeg输出参数初始化

前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…

Kubernetes-网络

一. 前言 flannel两种容器跨主机通信的方案,其中UDP模式是IP in UDP,即三层报文封装在UDP数据包中通信;而vxlan模式则是MAC in UDP,即二层报文封装在UDP数据包中通信 flannel UDP模式和vxlan模式都对数据包做了封解包&#xff0c…