计算机毕设 大数据房价数据分析及可视化 - python 房价分析

news2024/12/27 13:31:14

文章目录

  • 1 课题背景
  • 2 数据爬取
    • 2.1 爬虫简介
    • 2.2 房价爬取
  • 3 数据可视化分析
    • 3.1 ECharts
    • 3.2 相关可视化图表
  • 4 最后


1 课题背景

房地产是促进我国经济持续增长的基础性、主导性产业。如何了解一个城市的房价的区域分布,或者不同的城市房价的区域差异。如何获取一个城市不同板块的房价数据?
本项目利用Python实现某一城市房价相关信息的爬取,并对爬取的原始数据进行数据清洗,存储到数据库中,利用pyechart库等工具进行可视化展示。

2 数据爬取

2.1 爬虫简介

网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫对某一站点访问,如果可以访问就下载其中的网页内容,并且通过爬虫解析模块解析得到的网页链接,把这些链接作为之后的抓取目标,并且在整个过程中完全不依赖用户,自动运行。若不能访问则根据爬虫预先设定的策略进行下一个 URL的访问。在整个过程中爬虫会自动进行异步处理数据请求,返回网页的抓取数据。在整个的爬虫运行之前,用户都可以自定义的添加代理,伪 装 请求头以便更好地获取网页数据。
爬虫流程图如下:
在这里插入图片描述
实例代码

# get方法实例

import requests #先导入爬虫的库,不然调用不了爬虫的函数
response = requests.get("http://httpbin.org/get")  #get方法
print( response.status_code ) #状态码
print( response.text )

2.2 房价爬取

累计爬取链家深圳二手房源信息累计18906条

  • 爬取各个行政区房源信息;
  • 数据保存为DataFrame;

相关代码

from bs4 import BeautifulSoup  
import pandas as pd
from tqdm import tqdm
import math
import requests  
import lxml
import re
import time


area_dic = {'罗湖区':'luohuqu',
            '福田区':'futianqu',
            '南山区':'nanshanqu',
            '盐田区':'yantianqu',
            '宝安区':'baoanqu',
            '龙岗区':'longgangqu',
            '龙华区':'longhuaqu',
            '坪山区':'pingshanqu'}


# 加个header以示尊敬
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36',
           'Referer': 'https://sz.lianjia.com/ershoufang/'}

# 新建一个会话
sess = requests.session()
sess.get('https://sz.lianjia.com/ershoufang/', headers=headers)

# url示例:https://sz.lianjia.com/ershoufang/luohuqu/pg2/
url = 'https://sz.lianjia.com/ershoufang/{}/pg{}/'

# 当正则表达式匹配失败时,返回默认值(errif)
def re_match(re_pattern, string, errif=None):
    try:
        return re.findall(re_pattern, string)[0].strip()
    except IndexError:
        return errif

# 新建一个DataFrame存储信息
data = pd.DataFrame()

for key_, value_ in area_dic.items():
    # 获取该行政区下房源记录数
    start_url = 'https://sz.lianjia.com/ershoufang/{}/'.format(value_)
    html = sess.get(start_url).text
    house_num = re.findall('共找到<span> (.*?) </span>套.*二手房', html)[0].strip()
    print('💚{}: 二手房源共计「{}」套'.format(key_, house_num))
    time.sleep(1)
    # 页面限制🚫 每个行政区只能获取最多100页共计3000条房源信息
    total_page = int(math.ceil(min(3000, int(house_num)) / 30.0))
    for i in tqdm(range(total_page), desc=key_):
        html = sess.get(url.format(value_, i+1)).text
        soup = BeautifulSoup(html, 'lxml')
        info_collect = soup.find_all(class_="info clear")
        
        for info in info_collect:
            info_dic = {}
            # 行政区
            info_dic['area'] = key_
            # 房源的标题
            info_dic['title'] = re_match('target="_blank">(.*?)</a><!--', str(info))
            # 小区名
            info_dic['community'] = re_match('xiaoqu.*?target="_blank">(.*?)</a>', str(info))
            # 位置
            info_dic['position'] = re_match('<a href.*?target="_blank">(.*?)</a>.*?class="address">', str(info))
            # 税相关,如房本满5年
            info_dic['tax'] = re_match('class="taxfree">(.*?)</span>', str(info))
            # 总价
            info_dic['total_price'] = float(re_match('class="totalPrice"><span>(.*?)</span>万', str(info)))
            # 单价
            info_dic['unit_price'] = float(re_match('data-price="(.*?)"', str(info)))
            
            # 匹配房源标签信息,通过|切割
            # 包括面积,朝向,装修等信息
            icons = re.findall('class="houseIcon"></span>(.*?)</div>', str(info))[0].strip().split('|')
            info_dic['hourseType'] = icons[0].strip()
            info_dic['hourseSize'] = float(icons[1].replace('平米', ''))
            info_dic['direction'] = icons[2].strip()
            info_dic['fitment'] = icons[3].strip()
            
            # 存入DataFrame
            if data.empty:
                data = pd.DataFrame(info_dic,index=[0])
            else:
                data = data.append(info_dic,ignore_index=True)
            
                

爬取过程

在这里插入图片描述

3 数据可视化分析

3.1 ECharts

ECharts(Enterprise Charts)是百度开源的数据可视化工具,底层依赖轻量级Canvas库ZRender。兼容了几乎全部常用浏览器的特点,使它可广泛用于PC客户端和手机客户端。ECharts能辅助开发者整合用户数据,创新性的完成个性化设置可视化图表。支持折线图(区域图)、柱状图(条状图)、散点图(气泡图)、K线图、饼图(环形图)等,通过导入 js 库在 Java Web 项目上运行。

python安装

pip install pyecharts

3.2 相关可视化图表

房源面积-总价散点图

scatter = (Scatter(init_opts=opts.InitOpts(theme='dark'))
           .add_xaxis(data['hourseSize'])
           .add_yaxis("房价", data['total_price'])
           .set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                           markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),]))
           .set_global_opts(
               legend_opts=opts.LegendOpts(is_show=False),
               title_opts=opts.TitleOpts(title="深圳二手房 总价-面积 散点图"),
               xaxis_opts=opts.AxisOpts(
                   name='面积',
                   # 设置坐标轴为数值类型
                   type_="value", 
                   # 不显示分割线
                   splitline_opts=opts.SplitLineOpts(is_show=False)),
               yaxis_opts=opts.AxisOpts(
                   name='总价',
                   name_location='middle',
                   # 设置坐标轴为数值类型
                   type_="value",
                   # 默认为False表示起始为0
                   is_scale=True,
                   splitline_opts=opts.SplitLineOpts(is_show=False),),
               visualmap_opts=opts.VisualMapOpts(is_show=True, type_='color', min_=100, max_=1000)
    ))

scatter.render_notebook() 

在这里插入图片描述各行政区均价

temp = data.groupby(['area'])['unit_price'].mean().reset_index()
data_pair = [(row['area'], round(row['unit_price']/10000, 1)) for _, row in temp.iterrows()]

map_ = (Map(init_opts=opts.InitOpts(theme='dark'))
        .add("二手房均价", data_pair, '深圳', is_roam=False)
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="深圳各行政区二手房均价"),
            legend_opts=opts.LegendOpts(is_show=False),
            tooltip_opts=opts.TooltipOpts(formatter='{b}:{c}万元'),
            visualmap_opts=opts.VisualMapOpts(min_=3, max_=10)
        )
       )

        
map_.render_notebook()

在这里插入图片描述

均价最高的10个地段

temp = data.groupby(['position'])['unit_price'].mean().reset_index()
data_pair = sorted([(row['position'], round(row['unit_price']/10000, 1))
                    for _, row in temp.iterrows()], key=lambda x: x[1], reverse=True)[:10]

bar = (Bar(init_opts=opts.InitOpts(theme='dark'))
       .add_xaxis([x[0] for x in data_pair])
       .add_yaxis('二手房均价', [x[1] for x in data_pair])
       .set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 1, 0, 0, 
                                             [{
                                                 offset: 0,
                                                 color: 'rgb(0,206,209)'
                                             }, {
                                                 offset: 1,
                                                 color: 'rgb(218,165,32)'
                                             }])"""))
                            )
       .set_global_opts(
           title_opts=opts.TitleOpts(title="深圳二手房均价TOP 10地段"),
           legend_opts=opts.LegendOpts(is_show=False),
           tooltip_opts=opts.TooltipOpts(formatter='{b}:{c}万元'))
      )

bar.render_notebook()

在这里插入图片描述

户型分布

temp = data.groupby(['hourseType'])['area'].count().reset_index()
data_pair = sorted([(row['hourseType'], row['area'])
                    for _, row in temp.iterrows()], key=lambda x: x[1], reverse=True)[:10]

pie = (Pie(init_opts=opts.InitOpts(theme='dark'))
       .add('', data_pair,
            radius=["30%", "75%"],
            rosetype="radius")
       .set_global_opts(title_opts=opts.TitleOpts(title="深圳二手房 户型分布"),
                       legend_opts=opts.LegendOpts(is_show=False),)
       .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
      )

pie.render_notebook()

在这里插入图片描述
词云图

word_list = []
stop_words = ['花园','业主','出售']
string =  str(''.join([i for i in data['title'] if isinstance(i, str)]))

words = psg.cut(string)
for x in words:
    if len(x.word)==1:
        pass
    elif x.flag in ('m', 'x'):
        pass
    elif x.word in stop_words:
        pass
    else:
        word_list.append(x.word)
   
data_pair = collections.Counter(word_list).most_common(100)


wc = (WordCloud()
      .add("", data_pair, word_size_range=[20, 100], shape='triangle')
      .set_global_opts(title_opts=opts.TitleOpts(title="房源描述词云图"))
    )

wc.render_notebook()

在这里插入图片描述

4 最后

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

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

相关文章

声音生成项目(6)——在矢量量化变分编码器上使用自回归模型PixelCNN模型生成新的样本

文章目录 介绍PixelCNN论文简读模型介绍自回归模型PixelCNN模型结构 基础知识回顾参考连接 代码实现PixelConvLayer具体运行过程卷积模块整体网络结构 模型执行效果 Colab代码本子介绍Introduction介绍获取数据创建模型需要两个类 介绍 在上一篇就是介绍了矢量量化变分模型的具…

Stable Diffusion生成图片参数查看与抹除

前几天分享了几张Stable Diffusion生成的艺术二维码&#xff0c;有同学反映不知道怎么查看图片的参数信息&#xff0c;还有的同学问怎么保护自己的图片生成参数不会泄露&#xff0c;这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…

LDAP Tool Box Self Service Password

手册地址&#xff1a;https://self-service-password.readthedocs.io/en/latest/安装要求&#xff1a; Apache or another web server php (>7.4) php-curl (haveibeenpwned api) php-filter php-gd (captcha) php-ldap php-mbstring (reset mail) php-openssl (token cryp…

管理类联考——数学——记忆篇——二、代数——5.不等式

文章目录 不等式均值不等式均值不等式定义一般情况下扩展 推导加深记忆 有公式就要用绝对值不等式一元二次不等式 不等式 不等式在初中、高中甚至竞赛中都是比较相对综合、有难度的一块内容&#xff0c;经常会与方程、函数等其它知识点一起考察&#xff0c;一般的题型有&#…

查看Elasticsearch集群状态

Elastic查询 使用elastic自带的开发工具查询 查询集群健康状态 #查询集群健康状态 GET /_cluster/health集群名字使我们创建容器的时候设置的参数,状态绿色 查询节点状态 #查询节点状态 GET /_cat/nodes?v我们是使用docker容器创建的,这里显示的ip是容器内部ip 查询索…

前端做excel的录入解析,将excel的数据传给后端,显示在页面上。

具体的流程如图所示&#xff1a; 1.点击excel录入按钮 2.打开弹框 3.点击上传按钮&#xff0c;会自动打开计算机本地文件&#xff0c;选择想上传的文件&#xff0c;点击打开 4.会将excel的数据解析成一个表格&#xff0c;可以在表格中做删除操作&#xff0c;点击确定 5.将exc…

DeFi新篇章 | Sui上原生订单簿DeepBook正式上线

随着原生去中心化中央限价订单簿&#xff08; Central Limit Order Book&#xff0c;CLOB&#xff09;DeepBook的推出&#xff0c;Sui上的DeFi开启了新篇章。DeepBook由一群Sui贡献者共同构建&#xff0c;为新一代DeFi应用提供了一个稳定的流动性层。 通过DeepBook&#xff0c…

Oracle select语法

SQL 语言介绍 SQL(Structured Query Language)为数据库的语言&#xff0c;在 1974 年由Boyce【博伊斯】和Chamberlin【钱伯林】提 出的一种介于关系代数与关系演算之间的结构化查询语言&#xff0c;是一个通用的、功能极强的关系型数据库语言。包含三部分 DDL(Data Definitio…

Spring Boot配置文件与日志

目录 配置文件配置文件格式.propertiesyml 读取配置文件内容根据不同环境配置不同属性 日志自定义日志的打印更简单的日志打印日志级别日志级别的设置 日志的持久化 配置文件 Spring Boot项目的重要数据都是在配置文件中设置的。配置文件可以包含各种属性和值&#xff0c;用于…

LeetCode_面试题 01.01. 判定字符是否唯一

题目描述 面试题 01.01. 判定字符是否唯一https://leetcode.cn/problems/is-unique-lcci/ 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc"…

中国黄金品牌怎么代理

想选择一个项目创业其实不难&#xff0c;中国黄金这个品牌相信大家都已经相当的熟悉&#xff0c;它成立于1979年&#xff0c;是业界中的佼佼者&#xff0c;一直致力于为消费者提供黄金、白银、珠宝等的产品&#xff0c;无论是产品质量还是服务&#xff0c;都在行业中处于领先地…

数据备份、还原、视图、索引 操作练习

目录 备份与还原&#xff1a; 题目要求&#xff1a; 索引和视图 题目要求&#xff1a; 备份与还原&#xff1a; 在数据库booksDB中创建表books、authorbook、authorbook&#xff1a; 题目要求&#xff1a; 1、mysqldump -uroot -pRyh201314% booksDB > /backup/db/boo…

jsonschema networknt json-schema-validator 高级能力json 数字很大时, 变成什么类型

入参校验产品化 schema_个人渣记录仅为自己搜索用的博客-CSDN博客 自动变成了bigInteger类型. 哪怕你的jsonSchema 配置的是integer , 不冲突.

Redis深入——管道、发布订阅、主从复制、哨兵监控和集群

前言 在前面的学习中&#xff0c;我们已经了解了Redis的基本语法以及Redis持久化和事务的概念。而在这篇文章中我们继续来梳理管道、发布订阅、主从复制、哨兵监控和集群的知识&#xff0c;理解Redis主从复制到集群分片的演进过程&#xff0c;希望对正在学习的小伙伴有一定的帮…

1039家校通SQL注入获取管理员权限

我们承认伟人在历史过程中的贡献。可人类生活的大厦从本质上说&#xff0c;是由无数普通人的血汗乃至生命所建造的。伟人们常常企图用纪念碑或纪念堂来使自己永世流芳。真正万古长青的却是普通人的无人纪念碑——生生不息的人类生活自身。是的&#xff0c;生活之树常青。 漏洞…

Signal-iOS 5.9.0编译问题

1.当我们使用pod管理 pod SDWebImage/WebP , 执行 pod install 时,发生报错.先看具体报错 : 截屏2020-07-06 上午11.12.15.png 2.报错产生原因是由于git clone 的地址是 https://chromium.googlesource.com/webm/libwebp,需要FQ 3.不想FQ,可以使用github上的地址https://githu…

Python实现word简历中图片模糊

Python实现word简历中照片模糊——保护个人隐私的有效方法 一、引言背景 在现代招聘流程中&#xff0c;电子简历成为了主要的招聘方式之一。然而&#xff0c;简历中包含的个人信息往往涉及隐私问题&#xff0c;特别是照片。为了保护求职者的个人隐私和数据安全&#xff0c;许多…

MySQL数据备份与恢复,索引,视图的简单练习

目录 一. 数据备份与恢复 &#xff08;1&#xff09;素材如下&#xff1a; 创建表格如下&#xff1a; &#xff08;2&#xff09; 1、使用mysqldump命令备份数据库中的所有表 2、备份booksDB数据库中的books表 3、使用mysqldump备份booksDB和test数据库&#xff08;test数…

2023最新版本Activiti7系列-身份服务

身份服务 在流程定义中在任务结点的 assignee 固定设置任务负责人&#xff0c;在流程定义时将参与者固定设置在.bpmn 文件中&#xff0c;如果临时任务负责人变更则需要修改流程定义&#xff0c;系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组&#xff0c;可…

面试题更新之-HTML5的新特性

文章目录 导文新特性有哪些&#xff1f;HTML5的新特性带来了许多好处 导文 面试题更新之-HTML5的新特性 新特性有哪些&#xff1f; HTML5引入了许多新特性和改进&#xff0c;以下是一些HTML5的新特性&#xff1a; 语义化标签&#xff1a;HTML5引入了一系列的语义化标签&#…