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

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

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

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

相关文章

来自专栏Python爬虫与算法进阶

大佬,我代码哪错了?

问题无处不在 我: “大佬,帮我看看这个问题错在哪了?” 大佬: “你的代码呢、你的错误提示呢?” 我: “好的,我发给你” 大佬: “。。。 再见” 留下一脸...

3278
来自专栏编程

可移植的 C+标准库 Boost 发布 1.66.0,新增 HTTP 库

来自:开源中国社区 链接:oschina.net/news/91666/boost-1-66-0-released 可移植的 C++ 标准库 Boost 发布了...

2318
来自专栏SEO

Google新动作:处理重复内容

28510
来自专栏嵌入式程序猿

不按标准引发的bug

我们曾经在初级和中级培训中给大家详细讲解了Modbus通讯的开发,并多次强调了一定要按照标准协议的要求编写Modbus驱动程序,可是现实中仍然有很多工程师不按照...

2618
来自专栏Python入门

爬取B站10万数据,看看都有哪些热门的UP主!

说起热门的B站相信很多喜欢玩动漫的,看最有创意的Up主的同学一定非常熟悉。我突发奇想学Python这么久了,为啥不用Python爬取B站中我关注的人,已经关注的...

1803
来自专栏互联网开发者交流社区

SEO-发信息注意的问题

1123
来自专栏FreeBuf

浅谈拒绝服务攻击的原理与防御(4):新型DDOS攻击 – Websocket和临时透镜

0×01 前言 前几天我已经分别发了三篇关于DDOS攻击相关的文章,我也是第一次在freebuf上发表这种文章,没想到有那么多人点击我真的很开心,前几天我为大家...

1755
来自专栏知晓程序

什么?微信也可以听文章!看公众号再也不怕伤眼睛

春节假期刚刚结束,很多人(被迫)回到自己的工作岗位。双眼长时间盯着电脑屏幕,你是否也感觉到,眼睛越来越干涩,越来越酸?

754
来自专栏互联网杂技

区区省略号竟有大作为...

每当我告诉身边的人省略号(…)是我见过的最为牛逼的字符时,绝大部分人都以为我疯了。 在你也这样认为我之前,请容我认真解释一番: ? 在过去的数十年间,用户界...

32713
来自专栏极客慕白的成长之路

如何在一个月内学会Python爬取大规模数据

1144

扫描关注云+社区