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

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

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

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

相关文章

来自专栏杨建荣的学习笔记

关于闪回区溢出导致的数据hang(r11笔记第12天)

对于Oracle数据库的闪回区的设置,之前和一个同事和讨论过,总体来说有一些不同的意见。 首先这个闪回区是一个逻辑的概念,闪回区的大小不会严格依赖于磁盘空间的情...

34413
来自专栏CSDN技术头条

通过Temboo实现从Arduino获取雅虎天气信息

如果问我未来的科技行业发展有哪些亮点的话,我必须说物联网一定是其中之一。物联网技术发展迅速,现在我们已经看到非常多的设备通过互联网互相通信了。物联网技术的发展背...

1888
来自专栏恒思考

软件必备模块-如何看懂代码

为什么写这一篇?因为上班了以后写代码是一个技能,不过大多数时候也时常是现用现差,这个说出来也是丢人。不过生活就是这样吧,不过积累的很重要的一个东西是什么呢,就是...

813
来自专栏跨界架构师

记一次通过c#运用GraphQL调用Github api

  最近在折腾使用Github api做个微信小程序练练手,本篇文章就是在这个过程中记录。

692
来自专栏互联网杂技

20个为前端开发者准备的文档和指南8

1.Meteor: The Official Guide(Meteor官方指南) Meteor介绍的链接地址: http://www.geekpark.net/...

3385
来自专栏QQ空间开发团队的专栏

Android相机开发那些坑

这篇文章总结了Android相机开发的相关知识、流程,以及容易遇到的坑,希望能帮助今后可能会接触Android相机开发的朋友快速上手,节省时间,少走弯路。

23K5
来自专栏IMWeb前端团队

如何选一个心仪的腾讯大王卡手机号

本文作者:IMWeb yisbug 原文出处:IMWeb社区 未经同意,禁止转载 最近淘了一个支持4G的iPad Pro,考虑买一个什么类型的流量卡比...

25610
来自专栏木头编程 - moTzxx

PHP QRCode 生成二维码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1034
来自专栏zaking's

真正“搞”懂http协议01—背景故事

1083
来自专栏数据小魔方

一言不合就爬虫系列之——爬取小姐姐的秒拍MV

大连的盛夏实在是热的让人心烦(对于我这种既怕热又怕冷的真的没地呆了)。 再加上令人头疼的毕业论文,这种日子怎能缺少MV来解暑呢。 既然要听,怎么只听一首呢,既然...

3055

扫码关注云+社区