此次项目使用Scrapy-Redis
分布式爬取,请自备代理ip
仪表板显示
项目背景
我在上海工作的时候有朋友就发信息问我上海一些二手房的价格情况,作为一个二愣子我只知道上海哪个区贵,但是不知道具体是什么价格,所以我就想着爬取一下上海的二手房。
从政策上来看,自从2016
年国家喊出了“ 房主不炒 ”的口号之后中国的放假就出现了明显的降温。
2019
年国家为了“救市”又宣布了几条政策:
1,政府不再垄断住房供应,缓解了开发商的资金压力,新房销售价格降低,导致新房市场火热而二手房市场冷清。
2,调整公积金贷款利率,提高了二房的房贷利率,打击市场投机需求。
3,鼓励租售并举,鼓励以住房租赁为主营业务的企业买房。
4,居住证降低申请门槛新政,让落户买房更加容易。
5,农民购房有补助,帮助农民工朋友们省去一部分买房成本。
从经济上来看,2020
年上半年上海人均可支配收入以 36577
元笑傲全国,同比增长3.64%
。看似美丽的数值背后,隐藏着多少被平均的普通老百姓。
从社会上来看,2019
年我国人口出生率创下1949
年以来的最低值,即使在2016
年开放二胎政策以来,人口出生率也没有大幅提高。
从技术上来看,中国造楼能力世界第一!“基建狂魔”岂是浪得虚名!
分析目的
1,2020
年上半年上海二手房整体挂牌量及均价走势如何?
2,目前上海二手房价位、房源有何特点?
3,上海各区县的挂牌情况,找出抛压最大的区域
数据清洗
首先我们看一下爬取的数据。维度不是太多,但是有些列我们可以拆分,例如地区、所在楼层、抵押信息等。
在对数据进行清洗前我们可以使用pandas_profiling
进行快速的统计分析。
import pandas_profiling
pandas_profiling.ProfileReport(data).to_file("./report/html")
根据报告内容我们可以看到本次数据总共有 37491
行,20
列,存在 7
行重复,重复占比小于 0.1%
,报告继续下拉可以看到每一列的统计情况。
我们需要清洗的几点:
1,把重复的去掉
2,替换空(None
)值
3,将地区,房屋户型,所在楼层,抵押信息进行切分合并
4,转换数据类型
5,删除多余字符
6,由于爬取时出现的错误,对价格列进行重新赋值
7,去掉异常数据
#如果有重复值,则保留第一个
data.drop_duplicates(keep='first', inplace=True)
# 替换None
data = data.applymap(lambda x: '暂无数据' if x == 'None' else x)
# 切分地区、房屋户型、所在楼层、抵押信息后删除原列,将拆分出的新列合并至原data
data = pd.concat([data, data['地区'].str.extract(pat='(?P<区>.*?)\s(?P<镇>.*?)\s(?P<环>.*)'),
data['房屋户型'].str.extract(
pat='(?P<室>\d+)室(?P<厅>\d+)厅(?P<厨>\d+)厨(?P<卫>\d+)卫'),
data['所在楼层'].str.extract(
pat='(?P<所处楼层>.+)\(共(?P<总层数>\d+)层\)'),
data['抵押信息'].map(lambda x:x.strip()).str.extract(pat='(?P<有无抵押>.{1})抵押(?P<抵押情况>.*)?')], axis=1)
data.drop(['地区', '所在楼层', '抵押信息'], axis=1, inplace=True)
data['区'] = data['区']+'区'
# 去除建筑面积后面的平米单位,并转为float
data['建筑面积'] = data['建筑面积'].map(lambda x: float