数据爬取、清洗到分析,如何徒手研究上海二手房房价

本文由作者:孙培培 原创投稿

声明:本文所公布代码及数据仅作学习用,若别有用途则后果自行承担。

提到上海,不得不提上海的高房价,最近一篇上海各市辖区均价的文章引起了我的注意,6月上海各辖区甚至各小区的房价到底处于一个什么样的水平呢?

我打算自己动手研究一下(本文主要研究2016年6月上海二手房房价水平,读者如果有研究房价变动的兴趣可以等到7月末的时候再研究下,然后对比看看上海房价在这一个月的变动情况),数据来源为6月30日的安居客二手房信息。

首先要进行的数据的收集,然后进行数据的清洗、整理以及最后的分析。选用python作为爬虫、数据清洗分析的工具,数据库选用MySQL数据库,很多读者会选择Nosql系列的Mongodb数据库,这个就是仁者见仁智者见智了。

打开安居客网站的二手房首页,房源信息中的房价、小区地址、市辖区、村/镇名称是分析所需数据,通过认真观察网站页面结构,爬虫思路定为从安居客二手房首页(http://shanghai.anjuke.com/sale/)进入到各市辖区网页,再进入村/镇结构网页(滨江、长桥等我称之为村/镇名称),然后依次爬取各村/镇房源信息中的房价、地址相关信息。

首先导入python爬虫所需的三方包,bs4中的BeautifulSoup, requests用于网络爬虫,pandas用于科学计算,MySQLdb用于MySQL数据库操作(如果读者使用的是Mongodb数据库需要导入pymongo),time用于时间模块相关的操作。

导入三方包后,需要获取村/镇结构对应的网址,通过认真观察我们发现各村、镇结构的网址只是在首页网址(http://shanghai.anjuke.com/sale/)的基础上多加了一截,例如闵行区的古美罗阳就是在后面拼接上gumeiluoyang变成http://shanghai.anjuke.com/sale/gumeiluoyang/,只要获取到所有村/镇结构的名称就可以获取他们的网址。

url_qx用于获取上海各市辖区的名称以便拼接出各市辖区对应的网址(这个网址规律和村/镇结构网址的规律一样),url_qx3在市辖区网址的基础之上进一步获取所有村/镇结构对应的信息(包含名称),url_qx4对url_qx3进行加工最终得到类似[hanghua, jinhongqiao, longbaijinhui, shibobinjianga……]的列表,查询一下,len(url_qx4)=197,url_qx4共有197个村/镇结构。

然后连接MySQL数据库,简单介绍下相关命令,host后面应该填写MySQL的数据库地址,如果数据库就在本机上,可以写成127.0.0.1或者localhost, user是登录数据库的用户名,passwd是账户登录MySQL数据库的登录密码,db指向具体的数据库,这里是我之前建立的名为2.2的数据库,port指访问端口,MySQL的默认端口是3306,charset指编码格式utf8编码允许存入汉字无乱码,这里注意在python文件开头或其他地方设置编码格式的时候,要写成utf-8,中间有道横线。(注:这里只是简单解释,有兴趣的读者可以自己查阅MySQLdb官方文档(http://mysql-python.sourceforge.net/MySQLdb.html)或其他资料(推荐:http://www.runoob.com/python/python-mysql.html))

数据库连接完毕,通过def创建一个调用数据库的函数,下面两句exeSQL的含义是如果2.2数据库中存在`安居客20160630`表就将其删除,然后再从新建表,表中包含房价和地址两个字段

准备工作完毕后是爬取数据入库,观察安居客网页,一共有197个村/镇结构的名称,每个村镇网址下大约有50页房源信息,每一页上大约有60条,总量约为60万条信息,爬取这个数据量需要一定的时长,如果软硬件允许读者可以开启多进程、多线程,再找个优质稳定的网络环境,如果条件不允许,读者可以晚上睡觉前启动程序,等一觉睡醒,数据就收集完毕了。简单提一句,循环时让程序停顿1s(time.sleep(1))是为了应对网站的反爬虫措施(当然这是较简单的方式,如果读者想详细了解爬虫和反爬虫,可以自行Google,百度就不要用了),代码中的if语句使得在网页不存在、数据不存在等特殊情况下代码可以继续执行而不会停止。

数据入库后,下一步就是从数据库中取数到ershoufang_1,ershoufang_1的数据类型是DataFrame, python的DataFrame数据结构相当于R中的data.frame结构或SAS中的表结构,是数据分析、挖掘的常用数据结构之一

打开ershoufang_1,未处理的原始数据不能满足分析要求,需要删除房价变量中的缺失值、不符合分析要求的特殊值(如地铁房),还要统一把后面的‘元/m2’剔除,地址变量也需要拆分生成市辖区、村/镇名称、小区名称

为此进行数据清洗、整理,删除在房价变量中未出现‘元’的观测,然后截取‘元’前面的数字生成price1(例如第一条观测的price1=16935,谨记最后要转化为数字类型),xiaoqu用于存放小区名称(第一条观测中xiaoqu=碧云东一栋),quxian用于存放市辖区名(第一条观测中quxian=浦东),xiangzhen用于存放村/镇名称(第一条观测中xiangzhen=碧云),经过加工生成ershoufang_2表

展示下ershoufang_2中的变量值

数据清洗整理完毕,开始进行数据分析

1、清洗后大约有41万条房源信息,均价为45441.07元/平,比我的预期还要高一些,怪不得大家要喊着要逃离魔都。

2、通过6月各区均价条形图得到以下几点认识:

Ø 黄浦、静安的房价并没有像宣传的已经超过10万/平

Ø 各区均价都比所宣传的要低一些

Ø 最令人诧异的是崇明岛,某些文章宣称:崇明岛因2020年左右会开通地铁,6月均价已经接近2.5万/平。我查了下上海地铁规划线路,崇明线还在规划中,这就是崇明的实际房价还没有那么贵的原因吧。

3、说完了市辖区的均价,我很好奇单价最贵的小区top10谁会上榜(在处理过程中为防止商家造假、错误值或极端值,删除只出现过一次的小区),发现徐汇区湖南路是土豪小区集中地,黄浦区出现了一次,静安区一次都没出现

4、看了最贵的小区,再来看看单价最便宜小区top10(同样删除只出现过一次的小区),总算看到了均价5000以下的房子,出于好奇,查了下跃进农场,位于崇明岛的东北角,和海门市隔江相望。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

2018-05-17 架构师技能图谱,搞懂这些找工作无敌数据结构常用算法并发操作系统设计模式运维 & 统计 & 技术支持中间件网络数据库搜索引擎性能大数据安全常用开源框架分布式设计设计思想 & 开发模

6754
来自专栏数据和云

DBA生存警示:系统级误删除案例及防范建议

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中“幸存”,这源于无数血泪的教训,我曾经在《数据安全警示录》...

2854
来自专栏云计算D1net

如何应对Heartbleed安全漏洞

? 本周早些时候,一个名为Heartbleed的大型安全漏洞浮出水面。该漏洞可让入侵者诱使服务器泄漏你的个人数据。 Heartbleed漏洞的危险性...

2715
来自专栏Albert陈凯

理解zookeeper选举机制

zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点...

5235
来自专栏Cloud Native - 产品级敏捷

微服务架构 (五): 获取微服务数据, 生成报表

2016.8.17, 深圳, Ken Fang 架构师在设计从多个微服务取数据, 而生成报表的架构设计方案时, 往往面临著需在边界上下文 (Bounded Co...

20110
来自专栏信安之路

我是如何通关信安之路巅峰挑战赛的

我滴个天啊。。。。。弱密码随意登陆。。。。。不好意思,这题我真是非预期解法,具体的预期解法,之前信安之路文章已发,就不仔细讲述啦!

1406
来自专栏小白课代表

犀牛Rhino3.0安装教程

1523
来自专栏我是攻城师

图形数据库之Neo4j学习(一)

3685
来自专栏Crossin的编程教室

【Python 第3课】IDE

昨天的课发出去之后,有不少同学发来了反馈,有完成截屏的,也有遇到问题的。一些问题突然让我意识到,很多地方自己描述得不是很到位,会产生歧义,或者干脆就很难听懂。比...

2726
来自专栏java一日一条

Python爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

1422

扫码关注云+社区