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

毕业设计: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、源码获取方式

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

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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-05 17:16:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-05 17:16:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-05 17:16:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-05 17:16:02       20 阅读

热门阅读

  1. MySQL运维实战(2.3)MySQL的权限体系

    2024-01-05 17:16:02       37 阅读
  2. Hbase 的三个应用

    2024-01-05 17:16:02       30 阅读
  3. 【React】04-关于React Props的实践

    2024-01-05 17:16:02       35 阅读
  4. 如何有效使用 .gitignore 文件

    2024-01-05 17:16:02       38 阅读
  5. Spring aspect 解析

    2024-01-05 17:16:02       39 阅读
  6. Verilog视频信号图形显示 FPGA(iCE40)

    2024-01-05 17:16:02       44 阅读
  7. 网络安全试题进阶——附答案

    2024-01-05 17:16:02       38 阅读
  8. LeetCode50. Pow(x, n)

    2024-01-05 17:16:02       33 阅读
  9. 小柱的笔记

    2024-01-05 17:16:02       26 阅读