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

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

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

提到上海,不得不提上海的高房价,最近一篇上海各市辖区均价的文章引起了我的注意,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 条评论
登录 后参与评论

相关文章

来自专栏漏斗社区

黑客游戏| Owasp juice shop (一)

0x01 前言 最近看到一篇关于owasp juice shop的文章,觉的很有意思,斗哥就自己撸了个环境,上手后深深觉的这是一个很棒的漏洞靶场,所以就把该...

5068
来自专栏木子昭的博客

往"某度文库"上传资源之前,请先做好这些...想到一句好玩的话:知道是你干的,只是懒得抓你!如果你喜欢python,喜欢故事,请点赞或关注我!您的支持是对作者最大的鼓励!

先讲个相关的故事:匿名黑客的"复仇行动" 2010年12月10日,黑客组织匿名者发布了一条消息,解释了他们发起最近一次代号为”复仇行动”的攻击的大致动机(Pr...

38213
来自专栏小巫技术博客

应用被强杀了怎么办

972
来自专栏FreeBuf

看我利用传真功能漏洞渗透进入企业内网

从远古时代的飞鸽传书到后来的邮政快递,写信人与收信人之间的物理消息传递方式逐渐在演变发展,之后,传真技术的出现从某种程度上说,帮助人们走出了信件传递的黑暗时代。

3091
来自专栏Crossin的编程教室

【Python 第3课】IDE

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

2916
来自专栏塔奇克马敲代码

Windows平台下源码分析工具

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

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

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

21810
来自专栏数据和云

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

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

2894
来自专栏测试开发架构之路

Android软件测试Monkey测试工具

前言: 最近开始研究Android自动化测试方法,对其中的一些工具、方法和框架做了一些简单的整理,其中包括android测试框架、CTS、Monkey、Monk...

1K11
来自专栏云计算D1net

如何应对Heartbleed安全漏洞

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

2835

扫码关注云+社区

领取腾讯云代金券