首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据爬取、清洗到分析,如何徒手研究上海二手房房价

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

作者头像
机器学习AI算法工程
发布2018-03-14 11:53:59
1.3K0
发布2018-03-14 11:53:59
举报

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

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

提到上海,不得不提上海的高房价,最近一篇上海各市辖区均价的文章引起了我的注意,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以下的房子,出于好奇,查了下跃进农场,位于崇明岛的东北角,和海门市隔江相望。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档