北京房租大涨?6个维度,数万条数据帮你揭穿

简介:

昨天还幻想海边别墅的年轻人,今天可能开始对房租绝望了。

8月初,有网友在“水木论坛”发帖控诉长租公寓加价抢房引起关注。据说,一名业主打算出租自己位于天通苑的三居室,预期租金7500元/月,结果被二方中介互相抬价,硬生生抬到了10800。

过去一个月,全国热点城市的房租如脱缰野马。一线的房租同比涨了近20%。一夜醒来,无产青年连一块立锥之地都悬了。

从2018下半年开始,租金海啸汹汹来袭,资本狂欢,官方默然,房东纠结,租客尖叫。

这不是一方的过错,而更像是一场全社会的“集体谋杀作品”。最令人不安的是,过去房地产的那套玩法和上涨逻辑,今天正在转移到房租上。

房租暴涨的不只是北京。有数据显示,7月份北京、上海、广州、深圳、天津、武汉、重庆、南京、杭州和成都十大城市租金环比均有所上涨。其中北京、上海、深圳的租金涨幅最猛,北京7月份房租同比上涨3.1%,有小区甚至涨幅超过30%。

b8e2abe9e81b6e19ec83679b57d84f6fecc9db91

图自“21世纪经济报道”《最新房租数据出炉,你一个月要交多少钱?(附房租地图)》一文

接下来,恋习Python通过Python大法通过获取某网数万条北京租房数据,给大家说说真实的房租情况。

还是老规矩,老套路(是不是有股熟悉的味道),恋习Python常用的三部曲:数据获取、数据清洗预览、数据分析可视化,与你一起探究最近房租的状况。

一、数据获取

恋习Python今日就把目前市场占有率最高的房屋中介公司为目标,来获取北京、上海两大城市的租房信息。(目标链接:https://bj.lianjia.com/zufang/)

2d7596a2e10e2d8500bae7002aabdb5b2321ff44

整体思路是:

● 先爬取每个区域的url和名称,跟主url拼接成一个完整的url,循环url列表,依次爬取每个区域的租房信息。
● 在爬每个区域的租房信息时,找到最大的页码,遍历页码,依次爬取每一页的二手房信息。

post代码之前简单讲一下这里用到的几个爬虫Python包:

● requests: 就是用来请求对链家网进行访问的包
● lxml: 解析网页,用xpath表达式与正则表达式一起来获取网页信息,相比bs4速度更快

详细代码如下:

 
 

import requests

import time

import re

from lxml import etree


# 获取某市区域的所有链接

def get_areas(url):

print('start grabing areas')

headers = {

'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}

resposne = requests.get(url, headers=headers)

content = etree.HTML(resposne.text)

areas = content.xpath("//dd[@data-index = '0']//div[@class='option-list']/a/text()")

areas_link = content.xpath("//dd[@data-index = '0']//div[@class='option-list']/a/@href")

for i in range(1,len(areas)):

area = areas[i]

area_link = areas_link[i]

link = 'https://bj.lianjia.com' + area_link

print("开始抓取页面")

get_pages(area, link)


#通过获取某一区域的页数,来拼接某一页的链接

def get_pages(area,area_link):

headers = {

'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}

resposne = requests.get(area_link, headers=headers)

pages = int(re.findall("page-data=\'{\"totalPage\":(\d+),\"curPage\"", resposne.text)[0])

print("这个区域有" + str(pages) + "页")

for page in range(1,pages+1):

url = 'https://bj.lianjia.com/zufang/dongcheng/pg' + str(page)

print("开始抓取" + str(page) +"的信息")

get_house_info(area,url)


#获取某一区域某一页的详细房租信息

def get_house_info(area, url):

headers = {

'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}

time.sleep(2)

try:

resposne = requests.get(url, headers=headers)

content = etree.HTML(resposne.text)

info=[]

for i in range(30):

title = content.xpath("//div[@class='where']/a/span/text()")[i]

room_type = content.xpath("//div[@class='where']/span[1]/span/text()")[i]

square = re.findall("(\d+)",content.xpath("//div[@class='where']/span[2]/text()")[i])[0]

position = content.xpath("//div[@class='where']/span[3]/text()")[i].replace(" ", "")

try:

detail_place = re.findall("([\u4E00-\u9FA5]+)租房", content.xpath("//div[@class='other']/div/a/text()")[i])[0]

except Exception as e:

detail_place = ""

floor =re.findall("([\u4E00-\u9FA5]+)\(", content.xpath("//div[@class='other']/div/text()[1]")[i])[0]

total_floor = re.findall("(\d+)",content.xpath("//div[@class='other']/div/text()[1]")[i])[0]

try:

house_year = re.findall("(\d+)",content.xpath("//div[@class='other']/div/text()[2]")[i])[0]

except Exception as e:

house_year = ""

price = content.xpath("//div[@class='col-3']/div/span/text()")[i]

with open('链家北京租房.txt','a',encoding='utf-8') as f:

f.write(area + ',' + title + ',' + room_type + ',' + square + ',' +position+

','+ detail_place+','+floor+','+total_floor+','+price+','+house_year+'\n')

print('writing work has done!continue the next page')


except Exception as e:

print( 'ooops! connecting error, retrying.....')

time.sleep(20)

return get_house_info(area, url)



def main():

print('start!')

url = 'https://bj.lianjia.com/zufang'

get_areas(url)



if __name__ == '__main__':

main()

二、数据清洗预览

5d1649bae785213aaca0c6175b668b496c2f1570

数据共14038条,10个维度,由上图可看出北京房源均价为9590元/月,中位数为7000。一半的房源价格在7000以下,所有房源的价格区间为[1000,250000],价格极差过大。

三、数据分析可视化

四维度-北京房租均价

接下来,恋习Python将北京各区域、各路段、各楼盘房屋数量、均价分布放在同一张图上,更直观地来看待房租

ad411e7d0856ca0edbbd25ea0bcb55c2aaa30752

从图中可看出,最近,北京市各区域的房租均在6000元/月以上,其中最高区域为东城,均价达12463元/月。不过,由于房源信息过多过杂,房屋位置、面积、楼层、朝向等对价格均有较大影响,因此,价格这个维度需要进一步分析。

4d7801fecb93a68c3701140b268afa6c9ae2a7c7

由上图可得,各路段的均价基本都在6000以上,其中海淀北部新区的房源数最多,但均价最低,为3308元/月,这或许与海淀北部生态科技新区作为高新技术产业的承载区、原始创新策源地的研发基地,以及科技园集聚区,目前已入驻华为、联想、百度、腾讯、IBM、Oracle等近2000家国内外知名的科技创新型企业有关。另一方面,海淀紫竹桥的房价竟一起冲天,其附近以博物馆、体育场馆为特色,交通便利,配套设施完善,均价较高也是情理之中。

8abff7665be51e1f07432011cf7dcb85ec864f6b

可以看出,不同楼盘的均价浮动很大,但都在6000/月以上。最高的甚至达到17516/月。由于每个楼盘户型差别较大,地理位置也较为分散,因此均价波动很大。每个楼盘具体情况还需具体分析。

附详情代码:

 
 

#北京路段_房屋均价分布图


detail_place = df.groupby(['detail_place'])

house_com = detail_place['price'].agg(['mean','count'])

house_com.reset_index(inplace=True)

detail_place_main = house_com.sort_values('count',ascending=False)[0:20]


attr = detail_place_main['detail_place']

v1 = detail_place_main['count']

v2 = detail_place_main['mean']


line = Line("北京主要路段房租均价")

line.add("路段",attr,v2,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,

mark_point=['min','max'],xaxis_interval=0,line_color='lightblue',

line_width=4,mark_point_textcolor='black',mark_point_color='lightblue',

is_splitline_show=False)


bar = Bar("北京主要路段房屋数量")

bar.add("路段",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,

xaxis_interval=0,is_splitline_show=False)


overlap = Overlap()

overlap.add(bar)

overlap.add(line,yaxis_index=1,is_add_yaxis=True)

overlap.render('北京路段_房屋均价分布图.html')

a6234ef59e5758690c443bb26754ad304afd7012

由上图可以看出,均价在8000-10000之间的房屋数量最多,同时1500-2000这个价位之间房屋数少的可怜。

据北京市统计局的数据,2017年全市居民月人均可支配收入为4769元。另据58同城和赶集网发布的报告,2017年北京人均月租金为2795元。

北京租房者的房租收入比,惊人地接近60%。很多人一半的收入,都花在了租房上,人生就这样被锁定在贫困线上。

统计数据也表明,北京租房人群收入整体偏低。47%的租房人,年薪在10万以下。在北京,能够负担得起每月5000元左右房租的群体,就算得上是中高收入人群。就这样,第一批90后扛过了离婚、秃头、出家和生育,终于还是倒在了房租面前。

附详情代码:

 
 

#房源价格区间分布图

price_info = df[['area', 'price']]


#对价格分区

bins = [0,1000,1500,2000,2500,3000,4000,5000,6000,8000,10000]

level = ['0-1000','1000-1500', '1500-2000', '2000-3000', '3000-4000', '4000-5000', '5000-6000', '6000-8000', '8000-1000','10000以上']

price_stage = pd.cut(price_info['price'], bins = bins,labels = level).value_counts().sort_index()


attr = price_stage.index

v1 = price_stage.values


bar = Bar("价格区间&房源数量分布")

bar.add("",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,

xaxis_interval=0,is_splitline_show=False)


overlap = Overlap()

overlap.add(bar)

overlap.render('价格区间&房源数量分布.html')

面积&租金分布呈阶梯性
0606794fdd6bbdc7041c261772056c3ee8cbaeb2

上图可以看出,80%的房源面积集中在0-90平方米之间,也符合租客单租与合租情况,大面积的房屋很少。

5080841e5d8377ca6762c741c0fea4835d2db15e

面积&租金分布呈阶梯性,比较符合常理。租房主力军就是上班族了,一般对房子面积要求较低,基本集中在30平。

附详情代码:

 
 

#房屋面积分布

bins =[0,30,60,90,120,150,200,300,400,700]

level = ['0-30', '30-60', '60-90', '90-120', '120-150', '150-200', '200-300','300-400','400+']

df['square_level'] = pd.cut(df['square'],bins = bins,labels = level)


df_digit= df[['area', 'room_type', 'square', 'position', 'total_floor', 'floor', 'house_year', 'price', 'square_level']]

s = df_digit['square_level'].value_counts()


attr = s.index

v1 = s.values


pie = Pie("房屋面积分布",title_pos='center')


pie.add(

"",

attr,

v1,

radius=[40, 75],

label_text_color=None,

is_label_show=True,

legend_orient="vertical",

legend_pos="left",

)


overlap = Overlap()

overlap.add(pie)

overlap.render('房屋面积分布.html')


#房屋面积&价位分布

bins =[0,30,60,90,120,150,200,300,400,700]

level = ['0-30', '30-60', '60-90', '90-120', '120-150', '150-200', '200-300','300-400','400+']

df['square_level'] = pd.cut(df['square'],bins = bins,labels = level)


df_digit= df[['area', 'room_type', 'square', 'position', 'total_floor', 'floor', 'house_year', 'price', 'square_level']]


square = df_digit[['square_level','price']]

prices = square.groupby('square_level').mean().reset_index()

amount = square.groupby('square_level').count().reset_index()


attr = prices['square_level']

v1 = prices['price']


pie = Bar("房屋面积&价位分布布")

pie.add("", attr, v1, is_label_show=True)

pie.render()

bar = Bar("房屋面积&价位分布")

bar.add("",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,

xaxis_interval=0,is_splitline_show=False)


overlap = Overlap()

overlap.add(bar)

overlap.render('房屋面积&价位分布.html')


大多数房屋年龄在10年以上

3605c729072388e1ca0384d5eb91afb31472b921

由上图看出,房屋年龄大多集中在10-20年、25年以上,而5年以下的不到2%;不过,别看这些都是老房子,最近房租变得这么猖狂?原因其中之一就是资本圈地。

3c18992909cb0f0861815c4743aa54c6dc2488a5

这条网贴立马点燃了大众的情绪:“好啊,原来是这些长租平台烧钱圈地,一心只想要垄断市场房源,哄抬租金,企图赚取暴利差价!”

四、后记

拿自如举例,表面上看跟中介公司没啥两样,收了各种散盘,然后集中装修、出租、管理,因为运营成本和住房质量提高,房租肯定有所上涨。

但更关键的事情在背后。自如把项目打包起来搞起了资产证券化,以租金收益权为基础资产做担保,投放到金融市场上发行国内首单租房市场消费分期类ABS,让各路资金来认购,每年给大家搞点分红。

大量资本都在赌租房这个风口,而前期谁的规模越大、资源越多,以后的定价权就越大,利润空间就越不可想象。

这次恋习Python一共从链家网上爬取14038条数据,而那就是大概一周前,8月17日北京住建委约谈了几家中介公司。最终的结果是自如、相寓和蛋壳承诺将拿出12万间房子投入市场其中,自如将拿出8万间(链家、自如、贝壳找房,他们的实际控制人是同一个人--链家老板左晖。

05325d4639e37fb30b323617115e62d89da73a66

也就是说,平常的时候,链家网+自如一共在网上待租的也就是1万多套房子,但是一被约谈他们就一口气拿出了8万套房子增援??怎么增?继续收房,让房源更加供不应求?

昨天买不起房,今天租不起房,如果连这样的生活也要因为市场的不规范而被逼迫、被夺走,真的会让人对一个城市失去希望。


原文发布时间为:2018-08-25

本文作者:懂你们的

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

相关文章
|
3月前
|
弹性计算 人工智能 机器人
Moltbot部署又出新玩法!阿里云计算巢全流程方案上线
昨日,阿里云推出「轻量服务器×Moltbot」全流程部署方案,已打通千问、钉钉、imessage。今天,阿里云继续迭代,为用户带来更多便捷的部署方式——【计算巢×Moltbot全流程部署方案】也火速上线!相较于轻量应用服务器,计算巢部署有以下区别,用户可以根据自己的需求进行选择。
|
2月前
|
网络协议 安全 Linux
Rocky Linux 9:Samba服务安装配置全攻略
本文手把手教你用Rocky Linux 9从零搭建Samba文件共享服务:详解防火墙/SELinux配置、smb.conf核心参数(global与共享段)、目录权限与SELinux上下文设置、Samba用户创建及Win/Linux双端访问,新手也能轻松实现跨系统无缝传文件!
|
4月前
|
传感器 算法 物联网
室内定位无线技术的分类和原理全解析(一)
室内定位无线技术通过射频、声波、光信号等解决卫星信号无法覆盖的盲区,实现人员、物资精准定位。主流技术分射频、声波、光学及新兴四大类,涵盖蓝牙、UWB、Wi-Fi、红外、可见光、毫米波等,适用于工业、医疗、园区等多场景,各具精度、成本与部署优势。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:六十一、信息论完全指南:从基础概念到在大模型中的实际应用
摘要: 信息论是人工智能尤其是大语言模型的核心数学工具。本文系统介绍了八大核心概念: 信息量:衡量事件意外程度,公式为I(x)=-log₂P(x) 信息熵:评估系统不确定性,H(X)=-ΣP(x)log₂P(x) 联合熵/条件熵:分析多变量关系及条件不确定性 互信息:量化变量间共享信息量 KL散度:衡量概率分布差异 交叉熵:模型训练的核心损失函数 在大语言模型中,这些概念被广泛应用于: 训练阶段:交叉熵优化预测,KL散度防止过拟合 推理阶段:温度参数调节生成文本的创造性(高熵增加多样性)
555 2
|
4月前
|
人工智能 自然语言处理 Java
AI工具选择困难症?Spring AI帮你省掉64%的令牌费用
你的AI助手有50+个工具但每次对话前就烧掉55000个令牌?就像带着全套工具箱去拧个螺丝一样浪费!Spring AI的工具搜索模式让AI按需发现工具,实现34-64%的令牌节省,告别工具选择困难症和账单焦虑。#Spring AI #工具优化 #令牌节省 #AI开发
549 2
|
18天前
|
前端开发
前端开发 之 15个页面加载特效上【附完整源码】
本篇文章内容展示了彩球环绕加载、音乐波动加载、跷跷板加载等页面炫酷加载特效,并给出了完整的代码及注释
202 4
前端开发 之 15个页面加载特效上【附完整源码】
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:六十七、超参数如何影响大模型?通俗讲解原理、作用与实战示例
超参数是机器学习模型训练前需要人工设定的参数,它们控制着模型的学习过程而非直接通过学习获得。文章通过生动的类比(如自行车调整、烹饪配方)解释了超参数的概念,并详细介绍了其调优流程、常见类型(学习率、批量大小等)及对模型的影响。通过实际代码示例,展示了不同超参数设置如何影响模型训练效果,强调合理调优对提升模型性能、防止过拟合和优化资源使用的重要性。文章指出,超参数调优是模型成功的关键,初学者可从默认值开始逐步实验,借助网格搜索等工具实现高效调参。
549 105
|
6月前
|
人工智能 算法 UED
从"AI投毒者"到"信息营养师":GEO运营的价值观革命
与“AI投毒”的短视做法截然不同,真正的GEO运营应当致力于成为AI系统的“信息共建者”。对AI深层知识掌握足够多的朋友都知道,人工智能的三要素:数据、算法和算力。数据是人工智能的一切构建的基础,而训练AI的初期数据多来自互联网,但这些是早起的网络数据,它也会存在着如不完整、不正确和不客观等情况。
|
4月前
|
JSON 监控 数据可视化
云监控 UModel Explorer:用“图形化”重新定义可观测数据建模
阿里云 UModel Explorer 正式发布:告别复杂配置,拖拽即建模,点击即洞察,实现建模、探索、分析一体化,让可观测真正高效协同,开启可视化运维新时代!
418 74
|
4月前
|
Prometheus 监控 Cloud Native
从系统监控到业务洞察:ARMS 自定义指标采集功能全解析
阿里云应用实时监控服务 ARMS 推出自定义指标采集功能,让 APM 真正深入业务核心,订单、库存、转化率等核心数据尽在掌控!
415 41

热门文章

最新文章