前言
最近在自学python语言的过程中,接触了多种爬虫的手段,我本爱挑剔私以为Requests
+Xpath
是用起来最优雅的,可惜一直没有找到称手的可视化工具。前两天在读知乎的高赞回答有哪些值得推荐的数据可视化工具?时发现了Echarts
,非常惊艳,遂决定爬取链家二手房数据进行可视化,在测试自己爬虫实力的同时检验下Echarts的实际效果。
策略
- 采用
Requests
+Xpath
工具采集链家网北京二手房前100页信息,数据标签:名称
、地址
、每平米单价
、网址
、总价
,并保存为CSV
(表格)
- 调用百度地图API :实现具体地址到地图经纬度换算,并提取
名称
、每平米单价
、地址经纬度
三个标签保存为json
格式(Echarts的数据导入只识别json
格式)
将数据导入
Echarts
,设置图标样式,导入第三方地图脚本,完成!(这步虽然写得最短,但是我爬最多坑的地方,主要原因是这货是纯
Javascript
写的,还好官网提供了大量案例,这才摸着石头过了河)来看下最终结果:
3D图表:点此预览
2D图表:点此预览
环境
- Python 3.6.1
- Windows 7 64位
- PyCharm 2017.1.4
爬取数据
检查目标网页
我们先来看看目标网页的情况
发现:
- 链家不需要登录即可查阅二手房信息
- 用chrome检查网页请求,也没有
cookie
和token
等一类变态的反爬手段
至此,放心了一大半,说明我们不需要做太多的伪装即可直接获取到我们的目标数据
定位目标数据
下面我们来看下目标数据的页面格式
翻页逻辑
链家二手房第一页的URL是这样的:
1 | https://bj.lianjia.com/ershoufang/ |
这个url中并没有带有明显的页面标识,别急,我们来看看第二页的url:
1 | https://bj.lianjia.com/ershoufang/pg2/ |
这下翻页逻辑就暴露了,这个pg
后面的数字可能指代的就是页数,我们再看看后面的页数加以验证:
1 | https://bj.lianjia.com/ershoufang/pg3/ |
看来我们判断的没错,按照这个逻辑我们来看看/pg1/能不能打开第一页:
1 | https://bj.lianjia.com/ershoufang/pg1/ |
打开没有问题!看来依次增加pg
后面的数字即可实现翻页。
数据定位
用chrome右击的检查
(Ctrl+shift+I)功能,我们可以方便地查看和定位网页元素:
名称
地址
每平米单价
网址
查看网页代码发现详情页面的网址就藏在之前存放名称的<a>
标签下的 <herf>
标签内。
总价
编写爬虫代码
1 | # coding:utf-8 |
注:
.join()
函数作用:Python ‘’.JOIN()的作用- Xpath教程(W3C)
查看数据
爬取完成后会在指定目录下生成一个.csv
文件,我们可以打开它来查看爬取的数据。
链家100页的爬取我们得到了3000个房源数据,实际上看链家的年销售数据,它的房源数据肯定是3W+的,也许我们可以通过在100页上继续叠加爬取实现,而事实也是这样的。
只不过我们目前的3000个样本数据已经很能说明问题了,在这里我就不全部爬完了。
调用百度地图API实现经纬度换算
百度API的调用方法可看这篇文章,写得很好。
获取密匙(AK)
经纬度换算前,需要注册百度地图api(你要用百度的账号)以获取免费的密钥,才能完全使用该api。登录网址:百度开放平台
首页点击申请密钥按钮,经过填写个人信息、邮箱注册等,成功之后在开放平台上点击“创建应用”,填写相关信息,在这里特别说明的是,在IP白名单框里,如果不清楚自己的IP地址,最好设置为:0.0.0.0/0,虽然百度提醒它会有泄露使用的风险,但是有时候你把你自己的IP地址输进去可能也不行。提交后,在你创建应用的访问应用(AK)那一栏就是你的密钥。
经纬度换算
注册密钥后就可以在百度Web服务API下的Geocoding API接口来获取你所需要地址的经纬度坐标并转化为json结构的数据。
官方API文档:点这里
多的不说,直接上代码,每一步注释都写在后面:
1 | # coding:utf-8 |
注:百度开发平台的经纬度转换对于免费账户来说每天是有上限的,如果你的转换出现了连续的报错,有可能就是这个原因。
最终保存出来的是json
文档。
使用Echarts实现可视化
ECharts
是一个免费的,功能强大的图表和可视化库,为您的提供了一种简单的方法,即添加直观,交互式和高度可定制的图表。它是用纯JavaScript
编写的,基于zrender,这是一个全新的轻量图表库。
使用前请看:
当你发现看不进去(和我一样),趁早看这个:
ECharts 提供了常规的折线图,柱状图,散点图,饼图,K线图,用于统计的盒形图,用于地理数据可视化的地图,热力图,线图,用于关系数据可视化的关系图,treemap,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘。
但这都不是其最强大之处,ECharts最让人惊艳之处在于其图表的超高交互性和可定制性,以及最新的多维可视化图表(GL图表)。
感受一下:
来自pissang的 Bar3D - Global Population图表(我也是参考了他的GL图表)
ECharts图表的制作过程分为以下几步:
- 首先我们需注册ECharts账号(百度账号)
- 创建一个新的图表
- 导入数据
- 编写图表设置代码(JavaScript)
- 添加第三方脚本
- 保存分享
制作2D图表
新建图表后,点击导入数据
将我们之前保存的json
数据导入
然后编写图表设置代码
这里我直接上代码:
1 | var uploadedDataURL = "/asset/get/s/data-1503645606962-ryy3JIad-.json"; # 导入的数据 |
在这个图表中我们引入了两个第三方脚本url:
1 | http://api.map.baidu.com/api?v=2.0&ak=ZUONbpqGBsYGXNIYHicvbAbM |
1 | /dep/echarts/latest/extension/bmap.min.js |
在脚本
选项中将他们依次添加
点击刷新
即可生成图表:
制作3D图表
新建图表后,点击导入数据
将我们之前保存的json
数据导入
然后编写图表设置代码
我的图表代码:
1 | var uploadedDataURL = "/asset/get/s/data-1503645606962-ryy3JIad-.json"; #导入数据 |
在这个图表中我们引入了三个第三方脚本url:
1 | https://api.mapbox.com/mapbox-gl-js/v0.38.0/mapbox-gl.js |
1 | http://echarts.baidu.com/resource/echarts-gl-latest/dist/echarts-gl.min.js |
1 | http://echarts.baidu.com/resource/echarts-gl-latest/mapboxgl-token.js |
在脚本
选项中将他们依次添加
点击刷新
即可生成图表:
在这里,我本来在考虑看能不能有方法将3D图表的三维数据导出,这样我就能利用3D打印将这个图表实体化了打印出来了,可惜Echarts并没有给出这样的接口,如果你们有好的建议请告诉我,不胜感激。