前往小程序,Get更优阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 >爬了链家二手房数据来告诉你深圳房价到底多恐怖!

爬了链家二手房数据来告诉你深圳房价到底多恐怖!

作者头像
Awesome_Tang
发布2018-10-08 17:13:27
2.3K1
发布2018-10-08 17:13:27
举报
文章被收录于专栏: FSociety FSociety

使用Pyecharts对链家上的深圳二手房信息进行可视化分析,内容包括:

  • 房屋面积与房屋总价散点图分布;
  • 各行政区二手房均价;
  • 均价最贵的10个地段;
  • 户型分布;
  • 标题中最常出现的词;

数据背景

  • 数据来源:链家二手房上深圳的房源信息「后附爬虫代码」;
  • 数量:共采集数据总量18841条,数据清洗后18811条;

字段名称

解释

area

房屋面积

area_positon

所属行政区「南山/福田等」

community

所属小区

direction

房屋朝向

elevator

有无电梯

fitment

装修情况「精装/简装/其他」

floorInfo

楼层信息「高层/中层」

hourseType

户型「三室两厅等」

position

位置「科技园/香蜜湖等」

price

房屋总价

title

房源信息标题

unit-price

每平米单价

项目内容

准备工作
  • 导入项目所需第三方库以及数据:
代码语言:javascript
复制
import pandas as pd
import pyecharts

data['area'] = data['area'].str.replace(u'平米','')
data['area'] = data['area'].astype('float')
#去掉房屋面积中「平米」并保存为浮点型
data['unit-price'] = data['price']/data['area']
#生成每平方米房屋单价
data = data.round(1)
data.head()
房价整体分布

我们借助散点图来看目前深圳二手房价格的整体分布情况:

代码语言:javascript
复制
scatter = pyecharts.Scatter("总价-面积散点图",'统计时间:2018-9-22')
scatter.add('?总价(单位:万元)',data['area'],data['price'],is_legend_show = False, visual_pos = 'right',
            is_visualmap = True,visual_type="color",visual_range=[100, 1000],mark_point=['max'],
           xaxis_name = '面积' , yaxis_name = '总价')
scatter
  • 目前标价最高的一套房子位于深圳湾,面积600平米,价格9800W❗️❗️❗️
  • 红色的点是房屋总价超过1000W的,当然可能这个散点图会存在一点误导,因为1000W以上的房源价格浮动比较大,导致红色部分视觉上占了大部分,实际上我们获取到的1.8W房源信息中,1000W以上的共1994条记录,占比11%,绝大部分的还是集中在500W左右。
  • 所获取到的1.8W条房源信息中整体均价6.4W每平米。
各行政区均价

需要说明一点,我们采集的数据中未包含大鹏新区/光明新区,因为这两个新区房源信息较少,加上pyecharts里面深圳的行政区也未包含这两个新区,所以没将这两个区的数据统计在内:

代码语言:javascript
复制
temp = data.groupby(['area_positon'])['unit-price'].mean().reset_index()
temp = temp.round(1)
attr = list(temp['area_positon'])
value = list(temp['unit-price'])

map = pyecharts.Map("深圳各行政区二手房均价", "统计时间:2018-09-22", width=800, height=600)
map.add(
    "二手房均价(单位:万元)", attr, value, maptype= u"深圳",is_legend_show = False,is_label_show = True,
    is_visualmap=True, visual_text_color="#000",visual_range=[3, 8]
)
map
  • 本来pyecharts的交互优势到了文章页面却反而有点鸡肋了 ,具体均价如下:

行政区

二手房均价

南山区

8.1万元/平米

坪山区

3.6万元/平米

宝安区

6.0万元/平米

盐田区

4.7万元/平米

福田区

7.0万元/平米

罗湖区

5.5万元/平米

龙华区

5.5万元/平米

龙岗区

4.4万元/平米

  • 目前最贵的还是南山区,整体均价8.1W每平米,最便宜的坪山区,均价3.6W每平米;
  • 关内来说,最便宜的是盐田区,均价4.7W每平,不过房源较少;
  • 关外最贵的是宝安区,均价6W,不过宝安区辖区面积大,价格跨度也比较广。
最贵的10个地段

看完了各行政区的均价,我们来看下更具体的,目前深圳房价最贵的10各地段都是什么位置:

代码语言:javascript
复制
temp = data.groupby(['position'])['unit-price'].mean().reset_index()
temp = temp.round(1)
temp = temp.nlargest(10,'unit-price').reset_index()
attr = list(temp['position'])
value = list(temp['unit-price'])

Bar = pyecharts.Bar("深圳房价最高的10个地段", "统计时间:2018-09-22")
Bar.add("每平米均价(单位:万元)", attr, value,mark_point=['max'],is_legend_show = False,is_label_show = True)
Bar
  • 深圳湾共计43套房源,整体均价15.2W每平米,甩开其他地段好几个身位;
  • 唯一属于的关外地段宝安中心,排名第10,均价8.2W
户型分布

户型里面有点凌乱,一些比较奇怪的户型(如8室0厅)就没算在里面,只取了数量前10的户型。

代码语言:javascript
复制
temp = data.groupby(['hourseType'])['unit-price'].count().reset_index()
temp.columns = ['hourseType','counter']
temp = temp.nlargest(10,'counter')


Pie = pyecharts.Pie('户型占比','统计时间:2018-9-22')
Pie.add("??", temp['hourseType'], temp['counter'],
             radius=[20, 75], rosetype='radius',
             is_legend_show=False, is_label_show=True)
Pie
  • 三室两厅是在出售的房源中占比最多,为25.9%,这也应该是目前最符合中国家庭的户型分布了;
  • 在深圳如此高昂的房价压迫下,小户型也挺受欢迎,一室一厅,两室一厅也有不小的占比;
词频统计

获取到的标题是房屋中介或者业主在链家上发布房源时填写的标题信息,想要获得关注,一个抓人眼球的标题肯定不能少,透过标题我们也能发现目前买家都会关注哪些信息,我们来看看,标题中最常出现的都是什么词语:

代码语言:javascript
复制
from jieba import posseg as psg
import collections
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

'''
分词部分
'''
word_list = []
stop_words = ['花园','业主','出售']
string =  str(''.join(data['title']))

words = psg.cut(string)
for x in words:
    if len(x.word)==1:
        pass
    elif x.flag == 'x':
        pass
    elif x.word in stop_words:
        pass
    else:
        word_list.append(x.word)

c = collections.Counter(word_list)
attr = []
value = []
for x in c.most_common(10):
    attr.append(x[0])
    value.append(x[1])

'''
柱形图
'''
Bar = pyecharts.Bar("标题中出现频率最高的10个词", "统计时间:2018-09-22")
Bar.add("出现次数", attr, value,mark_point=['max'],is_legend_show = False)
Bar.render
Bar
  • 生成词云
代码语言:javascript
复制
import imageio
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt

back_color = imageio.imread('house.jpeg') 
words = ' '.join(word_list)
wc = WordCloud(background_color='white', 
               max_words=5000,  
               mask=back_color, 
               max_font_size=200, 
               font_path="/Users/~/Documents/fonts/SimHei.ttf",  
               random_state=None
               )

wc.generate(words)
image_colors = ImageColorGenerator(back_color)
plt.figure(figsize = (15,8))
plt.imshow(wc.recolor(color_func=image_colors))
plt.axis('off')
plt.show()
wc.to_file('comment.png')

效果如下:

最后

太TM贵了!


附爬虫代码:

代码语言:javascript
复制
# -*- coding: utf-8 -*-

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

class lianjia():
    def __init__(self):
        print '*******lianjia_spider******'
        print 'Author :     Awesome_Tang'
        print 'Date   :       2018-09-16'
        print 'Version:        Python2.7'
        print '**************************\n'
        self.pattern = re.compile('<div class="info clear">.*?target="_blank">(.*?)</a>.*?class="houseInfo"><span class="houseIcon">.*?target="_blank">(.*?)</a>(.*?)</div>.*?class="positionIcon"></span>(.*?)<a href=.*?target="_blank">(.*?)</a>.*?class="totalPrice"><span>(.*?)</span>万')
        self.house_num_pattern = re.compile(u'共找到<span> (.*?) </span>套深圳二手房')
        self.area_dic = {'罗湖区':'luohuqu',
                        '福田区':'futianqu',
                        '南山区':'nanshanqu',
                        '盐田区':'yantianqu',
                        '宝安区':'baoanqu',
                        '龙岗区':'longgangqu',
                        '龙华区':'longhuaqu',
                        '坪山区':'pingshanqu'}

    def get_info(self,url):
        html = requests.get(url).text
        html = html.encode('utf-8')
        soup=BeautifulSoup(html,'lxml')
        infos=soup.find_all(class_="info clear")
        return infos

    def get_content(self,info,area):
        info_dic = {}
        info = re.findall(self.pattern,str(info))
        info = list(info[0])
        info_dic['title'] = info[0].strip()
        info_dic['community'] = info[1].strip()
        house_list = info[2].split('|')
        if len(house_list) == 6:
            info_dic['hourseType'] = house_list[1].strip()
            info_dic['area'] = house_list[2].strip()
            info_dic['direction'] = house_list[3].strip()
            info_dic['fitment'] = house_list[4].strip()
            info_dic['elevator'] = house_list[5].strip()
        else:
            info_dic['hourseType'] = house_list[1].strip()
            info_dic['area'] = house_list[2].strip()
            info_dic['direction'] = house_list[3].strip()
            info_dic['fitment'] = '其他'
            info_dic['elevator'] = house_list[4].strip()           
        info_dic['floorInfo'] = info[3].strip(' -  ')
        info_dic['position'] = info[4].strip()
        info_dic['price'] = info[5].strip()
        info_dic['area_positon'] = area
        return info_dic

    def run(self):
        data = pd.DataFrame()
        for area in self.area_dic.keys():
            print '>>>> 正在保存%s的二手房信息>>>\n'%area
            url = 'https://sz.lianjia.com/ershoufang/%s/'%self.area_dic[area]
            r = requests.get(url).text
            house_num = re.findall(self.house_num_pattern,r)[0].strip()
            total_page = int(math.ceil(int(house_num)/30.0))
            if total_page >= 100:
                total_page = 100
            else:
                pass
            for page in tqdm(range(total_page)):
                url = 'https://sz.lianjia.com/ershoufang/%s/pg%s/'%(self.area_dic[area],str(page+1))
                infos = self.get_info(url)
                for info in infos:
                    info_dic = self.get_content(info,area)
                    if data.empty:
                        data = pd.DataFrame(info_dic,index=[0])
                    else:
                        data = data.append(info_dic,ignore_index = True)
        data.to_csv('lianjia.csv',encoding = 'utf-8-sig')
        print '>>>> 链家二手房数据已保存❗️❗️❗️'



    

if __name__ == '__main__':
    x = lianjia()
    x.run()
本文参与  腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与  腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
目录
  • 数据背景
  • 项目内容
    • 准备工作
      • 房价整体分布
        • 各行政区均价
          • 最贵的10个地段
            • 户型分布
              • 词频统计
              • 最后
              领券
              问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

              哆哆女性网2019属猪的男宝贝起名好赞起名数码宝贝剧场版饺子馆起名大全集用鸡起名开饭店宝宝网上免费起名聚合物防水砂浆水暖安装公司的起名店铺起名网免费柏奚是什么意思零售微信群起名起名三个字给姓于的男孩起名字好北京卫视节目表心动的信号第四季免费观看完整版姓顾男生起名宝宝现代起名店铺起名大全测试混在抗战盼盼防盗门价格表爱之漩涡女性起名名字大全免费人成视频19674不收费从小抓起孩子教育的名言警句网购哪里最好新生女宝宝起名字免费韩姓起名韩姓男宝宝起名梅艳芳电影在线播放闪存卡是什么水产批发起什么店名好淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

              哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化