首页
学习
活动
专区
工具
TVP
发布

python爬取全国房价并简单分析

目录

使用方法

程序原理

mac下mysql安装&使用&创建库和表

网站爬取分析

网站数据抓取代码基础

数据来源

数据爬取

数据分析

死了十几天的公众号今天又来诈尸了,上周忙碌得没有周天,这周天搬家也忙碌得没时间,所以就只能合在一起来做一个小需求了。另外微信的排版功能真是太差了~如果阅读体验不好请直接到原文地址或者源码地址阅读。

我相信国内房价一直都是苦逼程序员比较关注的事情,我也非常关注全国部分地区的房价,因此我最原始的需求就是想看看全国都哪些地方房价比较高,以及几个我比较关注的城市房价都是怎么个涨势。关于这两个功能,我并没有打算做很漂亮的应用,所以实现的思路也很简单粗暴,但它可以满足我的基本的需求。如果你也有需要,我们可以一起来完善这个应用,让他更通用。

使用方法

我说了我并没有打算做很漂亮的应用,目前这个项目也只是可以满足我的基本需求,因此本项目稍微需要一点编程基础和mysql操作基础。至少要入门水平,然后就可以照着下面的步骤操作了:

安装依赖:

安装mysql并设置密码然后进入后执行下面命令:

createdatabasehouseDEFAULTCHARACTERSETutf8COLLATEutf8_general_ci;usehouse;CREATETABLEresidential(record_idINTNOTNULLAUTO_INCREMENT,provinceVARCHAR(100)NOTNULL,cityVARCHAR(100)NOTNULL,yearYEARNOTNULL,monthTINYINTUNSIGNED,#DEFAULT1priceDOUBLE,#NOTNULL,单位:元/m^2urlVARCHAR(100),PRIMARYKEY(record_id));

爬取房价数据到数据库(方便后期分析):

房价数据分析: 简单阅读修改 文件的内容后运行 即可。

程序原理

数据来源

最初有这个需求的时候我就百度搜了一下有没有现成的房价数据可以直接分析,很可惜并没有找到,但是发现了下面这个网站:

简单的分析了一下网站的结构,发现它的数据非常好爬!于是马上决定就是它了。

ps. 代码见光后应该很快就不能这么轻易爬了,如果爬的人多的话…该网站的反爬机制及将上线,到时候再…嗯,道高一尺魔高一丈/笑脸。

数据爬取

房价相关数据抓取下来怎么存呢?鉴于网站的房价数据现在可以轻易爬下来并不代表将来也可以轻易爬,为了保险起见还是决定先保存到数据库方便后期深入分析了。数据库需要什么结构呢?说实话我只是关心 在哪个省的哪个城市什么时候房价是多少,于是很自然的我的数据表包含了如下列: 省市/城市/年/月/房价 等几个关键数据。

下面首先介绍数据库的操作基本流程(windows用户需要自己适配用法了,关键步骤请看代码注释),然后介绍如何爬取该网站的房价信息,其实都很简单。

mac下mysql安装&使用&创建库和表

安装mysql:

brew install mysqlmysql.server start# 手动启动mysql.server stop# 手动停止mysql -uroot# 默认没有密码, 登录后设置SET PASSWORD FOR'root'@'localhost'=PASSWORD('xyz123');mysql -u root -p'xyz123'# 登录

mysql基本操作:

mysql-uroot-p#xyz123#showdatabases;createdatabasehouseDEFAULTCHARACTERSETutf8COLLATEutf8_general_ci;#dropdatabasehouseusehouse;#创建和删除CREATETABLEresidential(record_idINTNOTNULLAUTO_INCREMENT,provinceVARCHAR(100)NOTNULL,cityVARCHAR(100)NOTNULL,yearYEARNOTNULL,monthTINYINTUNSIGNED,#DEFAULT1priceDOUBLE,#NOTNULL,单位:元/m^2PRIMARYKEY(record_id));#droptableresidential;#表查看showtables;describeresidential;#表修改ALTERTABLEresidentialALTERCOLUMNmonthSETDEFAULT1;#修改字段默认值,COLUMN可省ALTERTABLEresidentialMODIFYpriceDOUBLENOTNULL;#设置字段非空ALTERTABLEresidentialADDdesc_infoVARCHAR(100);#增加字段ALTERTABLEresidentialCHANGEdesc_infodrop_colVARCHAR(100)NOTNULL;#修改列名ALTERTABLEresidentialDROPdrop_col;#删除字段ALTERTABLEresidentialADDurlVARCHAR(100);CREATETABLEtest(record_idINTNOTNULLAUTO_INCREMENT,provinceVARCHAR(100)NOTNULL,cityVARCHAR(100)NOTNULL,yearYEARNOTNULL,monthTINYINTUNSIGNED,#DEFAULT1priceDOUBLE,#NOTNULL,单位:元/m^2urlVARCHAR(100),PRIMARYKEY(record_id));#数据增改查删INSERTINTOresidential(province,city,year,price)VALUES('guizhou','guiyang',1992,45000);UPDATEresidentialSETprovince='GZ'WHEREprovince='guizhou';SELECT*FROMresidential;DELETEFROMresidentialWHEREprovince='GZ';DELETEFROMresidential;#删除全部数据

网站爬取分析

手动查看房价信息的操作流程分析:

打开 http://www.creprice.cn/naprice/funation.html 网站(可以注册登录:手机号+简单密码)

点击任意省份,然后右边的查看更多,发现地址很有规律:http://www.creprice.cn/proprice/pcguangxi.html 前面都相似,后面就是, 可以以此来爬取全国各省数据(几个直辖市略有区别,具体参考项目的代码实现)。

任何一个地址又分为住宅/办公/商铺相关的页面,地址分别也只是最后不一样: pcguangxi.html/pcguangxi-ty21.html/pcguangxi-ty22.html。我当前只关注住宅的所以就只实现了爬取住宅的代码,其他的有需求时再说吧。

任何一个页面都包含时间选择和展开更多选项,但是展开的通常都没有实际数据。而其中时间对应的也是静态页面后缀,在上面的前加上日期即可,例如 遍历以上一些地方应该可以获取比较合理的数据结构了。

由此得到爬取流程:获取中国各省的汉字,然后生成各个省市的拼音,组合生成的年月相关字串,组装成网址;然后到该网址中找到城市名字和对应的房价,保存到数据库。

网站数据抓取代码基础

其实我也是边百度边尝试的,有些库我也没用过,都是百度后从库的基本使用去了解如何满足自己的需求,比如百度 才知道还有pinyin这种库可以用。

全国各省的汉字数据: https://github.com/baixuexiyang/geocoord

汉字转拼音:

frompinyin>>>print(pinyin.get('你 好'))nǐhǎo>>>print(pinyin.get('你好',format="strip",delimiter=" "))nihao>>>print(pinyin.get('你好',format="numerical"))ni3hao3>>>print(pinyin.get_initial('你好'))nh

省份网址生成器:

defgen_all_url():forprinPROVINCE_NAME:foryearinrange(NOW.year,2007,-1):formonthinrange(12,,-1):pr['url']="%s/proprice/pc%s-ti%d%02d.html"%(BASE_URL,pr['pinyin'],year,month)pr['year']=yearpr['month']=monthyieldpr

网页下载器:

importrequestsres=requests.get('http://www.creprice.cn/proprice/pcguizhou-ti201803.html')withopen('test.html','w')asf:f.write(res.text)

其实我也没想到这个网站的爬取这么简单,连基本的反爬机制都没有,那我就只能不客气了!

5. 异步爬虫:没想到猴子补丁支持了requests但是对于mysql的支持并不好,而且这个网站动不动就被爬爆了。所以最后没有采用异步的方式。

最后爬取的过程大概是下面这样(看起来比较慢,爬完全部数据大概要3小时吧):

数据分析

数据读取: 数据库读取操作,获取数据后就直接查询数据库就好了,没什么技术含量。

绘制房价的温度图: 参考代码,效果如下,是全国2018年房价的温度图。

可以看出来除了北上广深杭以外,国内还有重庆/辽宁/吉林的房价都挺高的。更多信息大家就自己感受一下吧…

绘制趋势线型图: 参考代码,效果如下,是几个城市的房价上涨趋势。

这个图也说明了国内大部分省市的房价都是在上涨的,就我看的几个城市而言,从2017年1月开始都普遍大幅度上涨(当时到底发生了什么?),从上涨的趋势来看这几个城市都应该还有一定的上涨空间。如果要买房的话,可以考虑在那儿呢?—fuck…当然时看看在哪儿才买得起啊!

上面的两个图也只是举个例子啦,分析结果也就是我个人的简单直观的看法,相信大家看到的比我看到的多,期待听到大家深入浅出的分析结论。

源代码地址: https://github.com/HeLiangHIT/house_price

最后在这个过程中我也发现了一个关于租房数据自动爬取的项目,感兴趣的可以围观下。

ps. 这个项目看起来比我这个麻烦多了,毕竟要适配多家中介机构的网站,维护起来应该也比较辛苦。

如果本文对你有所帮助,可以点赞以支持作者的持续更新哦

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180604G08RFW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券