北京房租大涨?6个维度,数万条数据帮你揭穿(附详情代码)

640?wx_fmt=jpeg


作者|丁彦军

来源|恋习Python


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


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


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


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


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


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


640?wx_fmt=jpeg

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


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


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


一、数据获取


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

640?wx_fmt=png

整体思路是:


  • 先爬取每个区域的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("([一-龥]+)租房", content.xpath("//div[@class='other']/div/a/text()")[i])[0]

            except Exception as e:

            detail_place = ""

            floor =re.findall("([一-龥]+)(", 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+' ')

            

            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()


二、数据清洗预览


640?wx_fmt=jpeg

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


三、数据分析可视化


四维度-北京房租均价


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


640?wx_fmt=png

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


640?wx_fmt=png


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


640?wx_fmt=png

可以看出,不同楼盘的均价浮动很大,但都在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')


640?wx_fmt=png

由上图可以看出,均价在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')


面积&租金分布呈阶梯性


640?wx_fmt=png

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


640?wx_fmt=png

面积&租金分布呈阶梯性,比较符合常理。租房主力军就是上班族了,一般对房子面积要求较低,基本集中在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年以上


640?wx_fmt=png

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


640?wx_fmt=jpeg


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


四、后记


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


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


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


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

640?wx_fmt=png

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


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


1.微信群:

添加小编微信:tangguoyemeng,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


2.征稿:

投稿邮箱:lijy@csdn.net;微信号:tangguoyemeng。请备注投稿+姓名+公司职位。


推荐阅读


  • 面趣 | 据说这道烧脑的微软面试题很奇葩,你来试试?

  • 干货 | 18个Python爬虫实战案例(已开源)

  • 关于这道填空题,你会如何回答?(附带学习链接)

  • 如何打造程序员专属聊天室?

  • 发生了这4件事,我给Python跪了!

  • 《深度学习500问》,川大优秀毕业生的诚意之作

  • 十年币圈尘归土,七神论剑无兴衰

  • 程序员的江湖 务必掌握这些黑话!


640?wx_fmt=jpeg


扫描以下二维码即可参与“2018 年 CSDN 软件开发者大调查活动”!我们还为你准备了精美的礼品,华为 nova3 智能手机、小爱智能音箱、CSDN 背包、CSDN 定制T恤、数百本技术图书等你来拿!参与即有机会获赠,还等什么,快来试试吧!

640?wx_fmt=jpeg


↓↓↓  点击【阅读原文】查看「CSDN云计算」往期精彩内容

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

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

相关文章

BugkuCTF-WEB题eval

基础知识: var_dump() 函数用于输出变量的相关信息。 var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。 此题考察php相关 include是将flag.php文件包含进页面代码 $request…

Cloud一分钟 | 微软Azure云服务宣布又一重磅应用落地;微软云计算转型迅猛,或助其市值短期达到1万亿美元...

Hello,everyone:10月26日早,星期五,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

BugkuCTF-Reverse题Easy_Re多方法解决

下载附件 首先打开程序: 方法一: 第一步PEID,发现为cpp文件,32位程序 根据flag格式:DUTCTF{} 扔进IDA里,直接在16进制编辑器里AltT搜索CTF字符串 Flag:DUTCTF{We1c0met0DUTCTF} 或者在010editor里查…

云漫圈 | 我觉得我的手机被监听了。。。

参加 2018 AI开发者大会,请点击 ↑↑↑完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!2.征稿:投…

BugkuCTF-Reverse题Easy_vb多方法解决

先查壳: 我们可以看到这个是Visual Basic 编写的程序,因此,这个是没有加壳的VB程序。 方法一: MCTF{N3t_Rev_1s_E4ay}改为flag{N3t_Rev_1s_E4ay} 方法二: IDA,F5 方法三: OD打开文件 智能…

【有奖倒计时】带你走进AI应用创新大赛十强背后的故事!

时光如梭,截至今日距离?DigiX极客AI应用创新大赛十强争霸投票阶段只剩最后2天联盟君想问下你领到奖品了吗虽然战场无声无息,形势却如火如荼。13天来,我们感受到了众多花粉的热情,也感受到了用户们对高质量AI作品的喜爱。为投票准…

BugkuCTF-PWN题pwn1-瑞士军刀

注意: nc ip 端口 敲完回车没有回显,直接输入ls命令然后cat 文件即可 得到flag

Cloud一分钟 | 加码云计算!IBM斥340亿美元收购Red Hat

Hello,everyone:10月29日早,星期一,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

Python 线程队列 Queue – FIFO - Python零基础入门教程

目录 一.Python 线程队列分类二.Python 线程先进先出队列 Queue 简介三.Python 线程先进先出队列 Queue 常用函数四.Python 线程先进先出队列 Queue 使用五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 之前的文章中讲解很多关于线程间通…

BugkuCTF-WEB题网站被黑

利用御剑扫描后台或者通过dirsearch扫描一下目录看看 得到http://1147.67.246.176:15607/shell.php 打开这个网址 发现需要登录密码 通过Burp添加字典爆破密码为hack 输入得到flag

IBM 收购 RedHat(红帽)!340 亿美元

IBM今天宣布了以高达340亿美元的价格收购Red Hat,这笔交易在开源软件行业和云计算行业势必都会引起地震。Red Hat是将开源软件商业化的先驱之一,其采用的模式是,代码免费提供给其他公司使用,以便重新分发和修改。开源软件已逐渐成…

Python 线程队列 LifoQueue – LIFO - Python零基础入门教程

目录 一.Python 线程队列 Queue 分类二.Python 线程先进后出队列 LifoQueue 简介三.Python 线程先进后出队列 LifoQueue 函数介绍四.Python 线程先进后出队列 LifoQueue 使用五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python 线…

BugkuCTF-WEB题本地管理员

基础知识: base64: 是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一类基于64个可打印字符来表示二进制数据的方法。 XFF伪造请求头: X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的…

你最关心的马蜂窝事件舆论全景图在这里,用文本挖掘一挖到底

原创作者:谭婧,苏格兰折耳喵企业作为社会基本的细胞,在守法盈利的同时,担负着服务消费者、社区、社会等利益相关方的重要责任。互联网企业是互联网时代的宠儿,举手投足备受关注。所谓成也萧何,败也萧何。大…

Kafka日志

位置 server.properties配置文件中通过log.dir指定日志存储目录 log.dir/{topic}-{partition} 核心文件 .log 存储消息的日志文件,固定大小为1G,写满后会新增一个文件,文件名表示当前日志文件记录的第一条消息的偏移量。 .index 以偏移…

BugkuCTF-WEB题源码

根据提示 查看源码 有URL编码 解码并将其拼接 有一个假flag提交 得到真flag

Cloud一分钟 | 14万中国人基因大数据是否外泄?运营商发展大数据优势何在?

Hello,everyone:10月30日早,星期二,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

BugkuCTF-Reverse题easy-100(LCTF)

下载附件,得到apk文件 一道安卓逆向题,JEB反编译,查看 MainActivity 分析可得,主函数会先执行 p 函数,创建了一个按钮监听事件在 classs d 里,class d 里的 onclick 函数,当我们点击安卓的按钮…

Cloud一分钟 | 成本大增致谷歌财报蒙尘;Gartner发数据库魔力象限:阿里云成为黑马...

Hello,everyone:10月31日早,星期三,祝大家万圣节快乐!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学…

Python实现AES加密进行PKCS5Padding的填充

Python实现AES加密进行PKCS5Padding的填充 (1)Python 需要导入的模块 (2)AES加密代码 (3)AES解密代码 (4)测试代码 (5)测试结果