国庆不去哪儿:用python爬虫爬取热门景点并生成热力图

前言:本文建议有一定Python基础和前端(html,js)基础的盆友阅读,零基础可以去看我之前的文。(咳咳,不能总更小白文,这样显得我不(mei)够(you)专(xue)业(xi))。

金秋九月,丹桂飘香,在这秋高气爽,阳光灿烂的收获季节里,我们送走了一个个暑假余额耗尽哭着走向校园的孩籽们,又即将迎来一年一度伟大祖国母亲的生日趴体(无心上班,迫不及待想为祖国母亲庆生!)。

那么问题来了,去哪儿玩呢?百度输了个“国庆”,出来的第一条居然是“去哪里旅游人少”……emmmmmmm,因缺思厅。

于是我萌生了通过旅游网站的景点销量来判断近期各景点流量情况的想法(这个想法很危险啊)。

所以这次的目标呢,是爬去哪儿网景点页面,并得到景点的信息,大家可以先思考下大概需要几步。

1

百度的地图API和echarts

因为前几次爬虫都是爬一些文本信息,做一下词云之类的,中二の我觉得:没!意!思!了!这次正好爬的是数据,我决定用数据的好基友——图表来输出我爬取的数据,也就是说我要用爬取的景点销量以及景点的具体位置来生成一些可视化数据。

安利一下百度的地图API和echarts,前者是专门提供地图API的工具,听说好多APP都在用它,后者是数据处理居家旅行的好伙伴,用了之后,它好,我也好(隐约觉得哪里不对)。

API是什么,API是应用程序的编程接口,就好像插头与插座一样,我们的程序需要电(这是什么程序?),插座中提供了电,我们只需要在程序中写一个与插座匹配的插头接口,就可以使用电来做我们想做的事情,而不需要知道电是如何产生的。

引入数据后的百度热力图

再按照我上一篇文的套路来讲,米酱的小说写完啦!但她还想把小说出成书,可是怎么出书捏?米酱不会呀,这时候米酱发现某出版社提供了出版服务,出版社表示只需要提供小说的正文、以及一个设计的封面就可以啦,于是米酱将小说保存成了word格式,又画了个封面jpg图,发给了出版社,没过多久米酱就拿到了一本装订好的书啦(此段纯属虚构,专业出版人士尽管打我,我不会承认的)。

在米酱出书的过程中,米酱并不需要知道出版社是怎么印刷这个书的,也不需要知道是怎么装订这个书的,米酱只需要提供出版社所要求的东西即可。

通过api对♂接的开发者与服务商

2

确定输出文件

有人可能说,我已经懂了api是啥意思了,可是咋个用呢。关于这一点,米酱很负责任的告诉你:我也不会

但是!

百度地图提供了很多API使用示例,有html基础,大致可以看懂,有js基础就可以尝试改函数了(不会jsの我默默地复制源代码),仔细观察源代码,可以知道热力图的生成主要的数据都存放在points这个变量中。

这种[{x:x,x:x},{x:x,x:x}]格式的数据,是一种json格式的数据,由于具有自我描述性,所以比较通俗易懂,大概可以知道这里的三个值,前俩个是经纬度,最后一个应该是权重(我猜的)。

也就是说,如果我希望将景点的热门程度生成为热力图,我需要得到景点的经纬度,以及它的权重,景点的销量可以作为权重,并且这个数据应该是json格式的呈现方式。

echarts也是一样滴(*^__^*)。

3

爬取数据

其实这次的爬虫部分是比较简单的(如果你有跟着我的文爬过网站的话)。

分析网址(去哪儿景点)→爬取分页中信息(景点经纬度、销量)→转为json文件。

分析去哪儿景点页的网址可得出结构:http://piao.qunar.com/ticket/list.htm?keyword=搜索地点&region=&from=mpl_search_suggest&page=页数

这次没有用正则来匹配内容,而使用了xpath匹配,肥肠好用。

1.这里把每个景点的所有信息都爬下来了(其实是为了练习使用xpath……)。 2.使用了while循环,for循环的break的方式是发现无销量时给i值赋零,这样while循环也会同时结束。 3.地址的匹配使用re.sub()函数去除了n多复杂信息,这点后面解释。

4

输出本地文本

为了防止代码运行错误,为了维护代码运行的和平,将输出的信息列表存入到excel文件中了,方便日后查阅,很简单的代码,需要了解pandas的用法。

5

百度经纬度api

肥肠悲伤的,(ಥ﹏ಥ)我没找到去哪儿景点的经纬度,以为这次学(zhuang)习(bi)计划要就此流产了。(如果有人知道景点经纬度在哪里请告诉我)

但是,enhahhahahaha,我怎么会放弃呢,我又找到了百度经纬度api,网址:http://api.map.baidu.com/geocoder/v2/?address=地址&output=json&ak=百度密钥,修改网址里的“地址”和“百度密钥”,在浏览器打开,就可以看到经纬度的json信息。

百度密钥申请方法

这样我就可以根据爬到的景点地址,查到对应的经纬度辣!python获取经纬度json数据的代码如下。

观察获取的json文件,location中的数据和百度api所需要的json格式基本是一样,还需要将景点销量加入到json文件中,这里可以了解一下json的浅拷贝和深拷贝知识,最后将整理好的json文件输出到本地文件中。

(╯' - ')╯┻━┻

在设置获取经纬度的地址时,为了匹配到更准确的经纬度,我选择了匹配景点地址,然鹅,景点地址里有各种神奇的地址,带括号解释在XX对面的,说一堆你应该左拐右拐各种拐就能到的,还有英文的……于是就有了第三章中复杂的去除信息(我终于圆回来了!)。

然鹅,就算去掉了复杂信息,还有一些匹配不到的景点地址,于是我使用了嵌套try,如果景点地址匹配不到;就匹配景点名称,如果景点名称匹配不到;就匹配景点所在区域,如果依然匹配不到,那我……那我就……那我就跳过ㄒ_ㄒ……身为一个景点,你怎么能,这么难找呢!不要你了!

这里生成的三个json文件,一个是给百度地图api引入用的,另俩个是给echarts引入用的。

6

网页读取json文件

将第二章中所述的百度地图api示例中的源代码复制到解释器中,添加密钥,保存为html文件,打开就可以看到和官网上一样的显示效果。echarts需要在实例页面,点击页面右上角的EN切换到英文版,然后点击download demo下载完整源代码。

根据html导入json文件修改网页源码,导入json文件。

这里使用了jQuery之后,即使网页调试成功了,在本地打开也无法显示网页了,在chrome中右键检查,发现报错提示是需要在服务器上显示,可是,服务器是什么呢?

百度了一下,可以在本地创建一个服务器,在终端进入到html文件所在文件夹,输入python -m SimpleHTTPServer,再在浏览器中打开http://127.0.0.1:8000/,记得要将html文件名设置成index.html哦~

7

后记

因为注册但没有认证开发者账号,所以每天只能获取6K个经纬度api(这是一个很好的偷懒理由),所以我选择了热门景点中前400页(每页15个)的景点,结果可想而知,(ಥ﹏ಥ)为了调试因为数据增多出现的额外bug,最终的获取的景点数据大概在4k5条左右(爬取时间为2017年09月10日,爬取关键词:热门景点,仅代表当时销量)。

热门景点热力图

热门景点排行榜

这些地图上很火爆的区域,我想在国庆大概是这样的

这样的

还有这样的

ヾ(*ΦωΦ)ツ大家可要好好玩呀。

PS:写了个网页,展示百度地图的热力图效果和echarts的景点排行榜,方便大家查看。http://easyinfo.online 源码已经上传到gayhub啦~写完这篇文的时候发现echarts有针对python的模块可以引入,所以打算去学一下Django、Flask之类的web框架,最近会更一些纯理论的意识流文,大家一起进步吧~

最后,怀着敬畏又惋惜的心情纪念一下WePhone创始人苏享茂,在发生自杀事件之前我不认识他,我也不希望以这种方式认识他,希望程序员的世界永远单纯、没有欺诈。

作者:大吉大利小米酱 來源:http://www.jianshu.com/p/b7627e67b6b9


原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2017-09-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏日志易的专栏

法规解读:什么样的日志审计产品才能达到合规要求?

按照新法规的要求,传统的运维做法及日志分析方式很难满足合规要求,存在众多的弊端与难题,如何高效、高性价比的解决此问题?

46300
来自专栏运维技术迷

将域名从Godaddy转Namesilo

Godaddy,国人称之为狗大爹,世界最大的域名注册商,中国好多个人站长的域名均在此注册。可如今,高昂的费用已经让多少的个人站长和米农伤心欲绝。曾经的曾经已经过...

671130
来自专栏安恒信息

史上最严重Struts2 0day漏洞再度来袭!安恒玄武盾免费提供防护!

近日,安恒信息安全研究院发现著名J2EE框架——Struts2存在远程代码执行的漏洞目前Struts官方已经确认漏洞(漏洞编号S2-045,CVE编号 :CVE...

30980
来自专栏云端架构

【云端架构】网站运维之基础攻击防护

本周二 腾讯云微信公众号 放出 当月8号晚19点13分至50分 某游戏行业用户37分钟内遭7轮DDOS流量攻击,据不完全统计当月10号二十四小时内陆续出现两起 ...

1.4K200
来自专栏FreeBuf

你的CAD图纸被盗了吗?

本次分析的样本是CAD脚本动态生产的一种VBS蠕虫病毒,大概10多年前就已经开始通过E-Mail传播此样本,而如今这类病毒依旧活跃着,浮浮沉沉,生生不息。 蠕虫...

22180
来自专栏FreeBuf

.Chm格式帮助文件作盾,CryptoWall勒索软件卷土重来

网络诈骗软件近年来层出不穷,而且每当研究人员找到检测方法和防护技术时,它都能快速的找到躲避检测的方法或者进行变种。近日,Bitdefender的安全专家又披露了...

22070
来自专栏安恒信息

干货分享 | 几种典型勒索病毒事件应对与处置案例

自5月12日“永恒之蓝”勒索病毒大面积扩散以来,安恒信息为保障客户资产安全,对所有客户第一时间提供安全预警;同时加班加点生产200多台明御APT攻击(网络战)预...

38660
来自专栏安恒信息

新型恶意勒索软件VirLock

近日,研究人员发现勒索软件家族又添新成员,一个可自我复制的版本VirLock(又称VirRansom)。 VirLock的攻击范围很大,多种类型的文件都受到影响...

30740
来自专栏黑白安全

用WiFi时如何避免被黑客攻击

开个玩笑。确实,日常生活中大家已经离不开WiFi了吧?WiFi的好处无需赘言,但是相应的,它的危险性也值得我们商榷。那么,该如何保证自己的安全呢?

14320
来自专栏FreeBuf

2015年,基于宏的恶意软件数量再次飙升

今年年初以来,微软观察到使用宏的恶意软件数量迅速增加。宏病毒在多年前曾经非常流行,之后便销声匿迹。如今这种“古老”的攻击方式结合钓鱼邮件、社会工程学进行传播,大...

214100

扫码关注云+社区

领取腾讯云代金券