当前位置: 首页 > news >正文

✅ Python租房数据分析系统 Django+requests爬虫+Echarts可视化 贝壳网全国数据 大数据

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

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

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

Python租房数据分析系统:Django+requests爬虫+Echarts可视化,贝壳网全国数据

1、项目介绍

技术栈:Python语言、Django框架、requests爬虫、Echarts可视化、全国租房数据、贝壳租房网
爬取网站:贝壳租房 https://bj.zu.ke.com/zufang/(可爬取全国各城市数据)
功能:租房信息数据展示、租房地址数量分布、租房类型统计、租房价格统计分析、租房面积分析、房屋朝向分析、房屋户型平均价格统计分析、房屋楼层统计分析、房屋楼层与价格统计分析、房屋地址与价格统计分析、房屋相关信息词云展示

2、项目界面

(1)词云图分析
词云图

(2)房屋地址数量分布分析
地址分布

(3)租房数据
租房数据

(4)房屋朝向分析
朝向分析

3、项目说明

项目功能模块介绍

1. 租房信息数据展示
  • 功能描述:系统可以展示爬取到的租房信息,包括房屋标题、租金、面积、户型、楼层、朝向、地址等信息。
  • 技术实现:使用Django框架搭建Web应用,通过requests库爬取贝壳租房网的数据,并存储到数据库中。前端使用HTML、CSS、JavaScript和Bootstrap框架展示数据。
2. 租房地址数量分布
  • 功能描述:系统可以根据爬取到的租房数据,统计各个地址的租房数量,并以地图的形式展示出来。
  • 技术实现:使用Echarts的地理坐标系组件,结合爬取到的地址数据,生成地图可视化展示。
3. 租房类型统计
  • 功能描述:系统可以统计不同类型的租房数量,如整租、合租等,并以柱状图展示。
  • 技术实现:对爬取到的租房类型数据进行分类统计,使用Echarts生成柱状图。
4. 租房价格统计分析
  • 功能描述:系统可以对租房价格进行统计分析,包括平均租金、最高租金、最低租金等,并以柱状图展示。
  • 技术实现:对爬取到的租金数据进行统计分析,计算平均值、最大值、最小值等指标,使用Echarts生成柱状图。
5. 租房面积分析
  • 功能描述:系统可以对租房面积进行统计分析,包括平均面积、最大面积、最小面积等,并以柱状图展示。
  • 技术实现:对爬取到的面积数据进行统计分析,计算平均值、最大值、最小值等指标,使用Echarts生成柱状图。
6. 房屋朝向分析
  • 功能描述:系统可以对房屋朝向进行统计分析,包括南北朝向、东西朝向等,并以饼图展示。
  • 技术实现:对爬取到的朝向数据进行分类统计,使用Echarts生成饼图。
7. 房屋户型平均价格统计分析
  • 功能描述:系统可以统计不同户型的平均租金,并以柱状图展示。
  • 技术实现:对爬取到的户型和租金数据进行分组统计,计算每种户型的平均租金,使用Echarts生成柱状图。
8. 房屋楼层统计分析
  • 功能描述:系统可以统计不同楼层的租房数量,并以柱状图展示。
  • 技术实现:对爬取到的楼层数据进行分类统计,使用Echarts生成柱状图。
9. 房屋楼层与价格统计分析
  • 功能描述:系统可以统计不同楼层的租房平均租金,并以折线图展示。
  • 技术实现:对爬取到的楼层和租金数据进行分组统计,计算每层的平均租金,使用Echarts生成折线图。
10. 房屋地址与价格统计分析
  • 功能描述:系统可以根据地址统计租房平均租金,并以柱状图展示。
  • 技术实现:对爬取到的地址和租金数据进行分组统计,计算每个地址的平均租金,使用Echarts生成柱状图。
11. 房屋相关信息词云展示
  • 功能描述:系统可以对租房相关信息进行分析,生成词云图展示。
  • 技术实现:对爬取到的房屋描述等文本数据进行分词处理,提取关键词,使用Echarts生成词云图。

通过以上功能,用户可以更好地了解全国各城市的租房情况,帮助用户在租房过程中做出更好的决策。同时,系统还提供了数据可视化展示,使用户能够更直观地了解数据分析结果。

4、核心代码


# coding:utf8
import os
import re
import json
from audioop import reverse
from os import path
import sqlite3
from urllib.request import urlretrieve
import jieba
from PIL import Image
from django.contrib.auth import authenticate
from django.http import HttpResponseRedirect
from django.shortcuts import render, HttpResponse, redirect
from django.contrib.auth.decorators import login_required    # 导入登录验证
from django.views.generic import View, ListView   # 视图基类
from datetime import datetime
import hashlib
# 导入模型
from wordcloud import WordCloud, ImageColorGeneratorfrom app00 import models
from django.conf import settings
# 创建模板对象
from django.template import Template, Context
# 导入分页类
from django.core.paginator import Paginator, InvalidPage, EmptyPage, PageNotAnInteger
# 导入数据分析类
import pymysql
import pandas as pd
import numpy as np
from django.urls import reverse,resolve
# 租房类型统计
def rentalType(request):data = obtainData()# 缺失值处理data.dropna(subset=['community'], inplace=True)types = data['community'].valuestype = []for m in types:type.append(m[:2])typeData = pd.DataFrame({"rentalType": type})# print(addData)typeDict = dict(typeData.rentalType.value_counts())for k in [*typeDict.keys()]:if k not in ['整租','合租','独栋']:del typeDict[k]typeList = list(typeDict.keys())typeCount = list(typeDict.values())print(typeDict)# print(typeList)# print(typeCount)pi = []for i in typeCount:pi.append(i / 2850)context = {"rentalType": "active","typeDict":json.dumps({k:int(v) for k,v in typeDict.items()}),}return render(request, 'visualization/rentalType.html', context)# 租房价格统计分析
def rentalPrice(request):data = obtainData()# 缺失值处理data.dropna(subset=['price'], inplace=True)prices = data['price'].valuesprice = []for m in prices:# 有的价格数据是区间形式,需要进行处理, 求平均值if '-' in m:temp = m.split('-')price.append((int(temp[0]) + int(temp[1])) / 2)else:price.append(int(m))# print(price)# 进行数据统计a, b, c, d, e = (0, 0, 0, 0, 0)for t in price:if t < 1000:a += 1elif 1000 <= t < 2000:b += 1elif 2000 <= t < 3000:c += 1elif 3000 <= t < 4000:d += 1else:e += 1priceList = ['1000以下', '1000-2000', '2000-3000', '3000-4000', '4000以上']priceCount = [a, b, c, d, e]print(dict(zip(priceList,priceCount)))context = {"rentalPrice": "active","priceList": priceList,"priceCount": priceCount}return render(request, 'visualization/rentalPrice.html', context)# 租房面积分析
def rentalArea(request):data = obtainData()# 缺失值处理data.dropna(subset=['area'], inplace=True)areas = data['area'].valuesarea = []for m in areas:try:area.append(float(m[:-1]))except:area.append(0)a, b, c, d, e, f = (0, 0, 0, 0, 0, 0)for t in area:if t <= 10:a += 1elif 10 < t <= 50:b += 1elif 50 < t <= 100:c += 1elif 100 < t <= 120:d += 1elif 120 < t <= 150:e += 1else:f += 1areaList = ['10平方以下', '10-50', '50-100', '100-120', '120-150', '150平方以上']areaCount = [a, b, c, d, e, f]context = {"rentalArea": "active","areaList": areaList,"areaCount": areaCount}print(dict(zip(areaList,areaCount)))return render(request, 'visualization/rentalArea.html', context)# 房屋朝向分析
def rentalOrientation(request):data = obtainData()orientationDict = dict(data.orientation.value_counts())orientationList = list(orientationDict.keys())orientationList = orientationList[:15] + orientationList[18:20]orientationCount = list(orientationDict.values())orientationCount = orientationCount[:15] + orientationCount[18:20]# print(orientationDict)# print(orientationList)# print(orientationCount)context = {"rentalOrientation": "active","orientationList": orientationList[:10],"orientationCount": orientationCount[:10]}print(dict(zip(orientationList[:10],orientationCount[:10])))return render(request, 'visualization/rentalOrientation.html', context)# 房屋户型平均价格统计分析
def rentalPattern(request):data = obtainData()data.dropna(how='any', inplace=True)"""print(len(data.price.values))for i in range(len(data.price.values)):if '-' in str(data.price.values[i]):data.drop(data.index[i], inplace=True)"""data['price'] = data['price'].map(lambda x:re.search(r'\d+',x).group()).astype(int)group = data.groupby('pattern').price.mean()patternDict = dict(data.pattern.value_counts())patternList = list(group.index)t = list(group.values)patternCount = []for i in t:patternCount.append(int(i))# print(type(group))# print(group.index)# print(group.values)context = {"rentalPattern": "active","patternList": patternList[:10],"patternCount": patternCount[:10]}print(dict(zip(patternList[:10],patternCount[:10])))return render(request, 'visualization/rentalPattern.html', context)# 房屋楼层统计分析
def rentalFloor(request):data = obtainData()# 缺失值处理data.dropna(subset=['floor'], inplace=True)m = data.floor.valuesdataNew = []for i in m:dataNew.append(i[:3])p = pd.DataFrame({"data": dataNew})rentalFloorDict = dict(p["data"].value_counts())rentalFloorDict=dict(sorted([[k,v] for k,v in rentalFloorDict.items()],key=lambda x:int(x[0])))rentalFloorList = list(rentalFloorDict.keys())rentalFloorCount = list(rentalFloorDict.values())# print(rentalFloorDict)context = {"rentalFloor": 'active',"rentalFloorList": rentalFloorList[:],"rentalFloorCount": rentalFloorCount[:]}print(dict(zip(rentalFloorList[:],rentalFloorCount[:])))return render(request, 'visualization/rentalFloor.html', context)# 房屋楼层与价格统计分析
def floorAndPrice(request):data = obtainData()data.dropna(how='any', inplace=True)data[['price']] = data[['price']].astype(float)m = data.floor.valuesdataNew = []for i in m:dataNew.append(i[:3])p = pd.DataFrame({"floor": dataNew, 'price': list(data.price.values)})level=pd.cut(p['floor'].astype(int),bins=3,right=True,labels=['低楼层','中楼层','高楼层'])p['level'] = levelgroup = p.groupby('level').price.mean()print(group)# print(group)floorAndPriceList = list(group.index)t = list(group.values)floorAndPriceCount = []for i in t:floorAndPriceCount.append(int(i))context = {"floorAndPrice": "active","floorAndPriceDict":json.dumps(dict(zip(floorAndPriceList[:],floorAndPriceCount[:])))# "floorAndPriceList": floorAndPriceList,# "floorAndPriceCount": floorAndPriceCount}print(dict(zip(floorAndPriceList[:],floorAndPriceCount[:])))return render(request, 'visualization/floorAndPrice.html', context)# 房屋地址与价格统计分析
def addressAndPrice(request):data = obtainData()data.dropna(how='any', inplace=True)data[['price']] = data[['price']].astype(float)m = data.address.valuesdataNew = []for i in m:dataNew.append(i.split('-')[0])p = pd.DataFrame({"address": dataNew, 'price': list(data.price.values)})group = p.groupby('address').price.mean()# print(group)addressAndPriceList = list(group.index)t = list(group.values)addressAndPriceCount = []for i in t:addressAndPriceCount.append(int(i))# print(addressAndPriceList)# print(addressAndPriceCount)dd = [{"address":k,"count":v}for k,v in dict(zip(addressAndPriceList[:],addressAndPriceCount[:])).items()]context = {"addressAndPrice": "active","addressAndPriceDict":json.dumps(dd)# "addressAndPriceList": addressAndPriceList[1:],# "addressAndPriceCount": addressAndPriceCount[1:]}print(dict(zip(addressAndPriceList[:],addressAndPriceCount[:])))return render(request, 'visualization/addressAndPrice.html', context)# 房屋相关信息词云展示
def introduction(request):context = {"introduction": "active"}return render(request, 'visualization/introduction.html', context)def introduction_pic(request):data = obtainData()data = data.dropna()m = data['introduction'].valuesresult = []for i in m:result.append(i)txt = ' '.join(result)# join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串cut_text = " ".join(jieba.cut(txt))# mask参数=图片背景,必须要写上,另外有mask参数再设定宽高是无效的wordcloud = WordCloud(font_path="./simhei.ttf", background_color="white",width=1200,height=600).generate(cut_text)wordcloud.to_file("test.jpg")return HttpResponse(open('test.jpg','rb').read(),content_type="image/jpg")

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

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

http://www.dtcms.com/a/394615.html

相关文章:

  • FREERTOS任务TCB与任务链表的关系-重点
  • C++入门(内含命名空间、IO、缺省参数、函数重载、引用、内联函数、auto关键字、新式范围for循环、关键字nullptr的超全详细讲解!)
  • 红黑树的介绍
  • NumPy 系列(六):numpy 数组函数
  • 手写链路追踪-日志追踪性能分析
  • 数据库自增字段归零(id)从1开始累加
  • 轻量级本地化解决方案:实现填空题识别与答案分离的自动化流程
  • P1104 生日-普及-
  • CMake如何添加.C.H文件
  • 实时数据如何实现同步?一文讲清数据同步方式
  • 六、Java框架
  • 施耐德 M340 M580 数据移动指令 EXTRACT
  • 4. 引用的本质
  • 专业历史知识智能体系统设计与实现
  • 算法基础篇(4)枚举
  • 【C++】二叉搜索树及其模拟实现
  • 第二十一讲:C++异常
  • 2025年9月第2周AI资讯
  • 从 UNet 到 UCTransNet:一次分割项目中 BCE Loss 失效的踩坑记录
  • leetcode刷题记录2(java)
  • JAVA八股文——方法区
  • 链表操作与反转
  • AI编程 -- 学习笔记
  • 动态规划问题 -- 子数组模型(乘积最大数组)
  • 【AIGC】大模型面试高频考点18-大模型压力测试指标
  • Cannot find a valid baseurl for repo: base/7/x86_64
  • Lowpoly建模练习集
  • 六、kubernetes 1.29 之 Pod 控制器02
  • OpenCV:人脸检测,Haar 级联分类器原理
  • 类和对象 (上)