相信很多小伙伴们已经提前规划五一去哪儿?你是选择去人最少的单位加班呢?还是选择人山人海的景点观光?

如果去人最少的单位加班,一定要记得告知老板,以望升职加薪走上人生巅峰;

如果选择人山人海的景点,一定要提前查看攻略,比如下文中使用 Python 技术抓取热门景点的热力图。

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

如果你对python爬虫感兴趣,欢迎加入群526929231

那么问题来了,去哪儿玩呢?

百度输了个“国庆”,出来的第一条居然是“国庆去哪里旅游人少”。

于是我想到可否通过旅游网站的景点销量来判断近期各景点流量情况呢?本文按去哪儿网景点页面,得到景点的信息。

1.百度的地图API和echarts

本次主要抓取的内容是数据,因此我决定用图表来输出抓取的数据,也就意味着我要用爬取的景点销量以及景点的具体位置来生成一些可视化数据。

在这里使用的是百度的地图API和echarts,前者是专门提供地图API的工具,后者是数据处理居家旅行的好伙伴。

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

引入数据后的百度热力图引入数据后的百度热力图

而具体流程如下,好比出书的过程,想要将完结的小说出书,首先要通过出版社的出版服务,提供正文内容和封面设计图,将保存好的 word 文本和封面图发给出版社,由此得到一本书。在此过程中,并不需要了解出版社印刷、装订的过程。

2.确定输出文件

百度地图提供了很多API使用示例,有HTML基础,有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匹配。

def getList():

place = raw_input(‘请输入想搜索的区域、类型(如北京、热门景点等):’)

url = ‘http://piao.qunar.com/ticket/list.htm?keyword=’+ str(place)

def getList():

place = raw_input(‘请输入想搜索的区域、类型(如北京、热门景点等):’)

url = ‘http://piao.qunar.com/ticket/list.htm?keyword=’+ str(place) +’&region=&from=mpl_search_suggest&page={}’

i = 1

sightlist = []

while i:

page = getPage(url.format(i))

selector = etree.HTML(page)

print ‘正在爬取第’ + str(i) + ‘页景点信息’

i+=1

informations = selector.xpath(’//div[@class=“result_list”]/div’)

for inf in informations: #获取必要信息

sight_name = inf.xpath(’./div/div/h3/a/text()’)[0]

sight_level = inf.xpath(’.//span[@class=“level”]/text()’)

if len(sight_level):

sight_level = sight_level[0].replace(‘景区’,’’)

else:

sight_level = 0

sight_area = inf.xpath(’.//span[@class=“area”]/a/text()’)[0]

sight_hot = inf.xpath(’.//span[@class=“product_star_level”]//span/text()’)[0].replace(‘热度 ‘,’’)

sight_add = inf.xpath(’.//p[@class=“address color999”]/span/text()’)[0]

sight_add = re.sub(‘地址:|(.?)|(.?)|,.*?KaTeX parse error: Undefined control sequence: \/ at position 2: |\̲/̲.*?’,’’,str(sight_add))

sight_slogen = inf.xpath(’.//div[@class=“intro color999”]/text()’)[0]

sight_price = inf.xpath(’.//span[@class=“sight_item_price”]/em/text()’)

if len(sight_price):

sight_price = sight_price[0]

else:

i = 0

break

sight_soldnum = inf.xpath(’.//span[@class=“hot_num”]/text()’)[0]

sight_url = inf.xpath(’.//h3/a[@class=“name”]/@href’)[0]

sightlist.append([sight_name,sight_level,sight_area,float(sight_price),int(sight_soldnum),float(sight_hot),sight_add.replace(‘地址:’,’’),sight_slogen,sight_url])

time.sleep(3)

return sightlist,place

  1. 这里把每个景点的所有信息都抓取下来。

  2. 使用了while循环,for循环的break的方式是发现无销量时给i值赋零,这样while循环也会同时结束。

  3. 地址的匹配使用re.sub()函数去除了n多复杂信息,这点后面解释。

4.输出本地文本

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

def listToExcel(list,name):

df = pd.DataFrame(list,columns=[‘景点名称’,‘级别’,‘所在区域’,‘起步价’,‘销售量’,‘热度’,‘地址’,‘标语’,‘详情网址’])

df.to_excel(name + ‘景点信息.xlsx’)

5.百度经纬度API

百度经纬度API网址:http://api.map.baidu.com/geocoder/v2/?address=地址&output=json&ak=百度密钥,修改网址里的“地址”和“百度密钥”,在浏览器打开,就可以看到经纬度的json信息。

#上海市东方明珠的经纬度信息

{“status”:0,“result”:{“location”:{“lng”:121.5064701060957,“lat”:31.245341811634675},“precise”:1,“confidence”:70,“level”:“UNKNOWN”}}

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

def getBaiduGeo(sightlist,name):

ak = ‘密钥’

headers = {

‘User-Agent’ :‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36’

}

address = 地址

url = ‘http://api.map.baidu.com/geocoder/v2/?address=’ + address + ‘&output=json&ak=’ + ak

json_data = requests.get(url = url).json()

json_geo = json_data[‘result’][‘location’]

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

def getBaiduGeo(sightlist,name):

ak = ‘密钥’

headers = {

‘User-Agent’ :‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36’

}

list = sightlist

bjsonlist = []

ejsonlist1 = []

ejsonlist2 = []

num = 1

for l in list:

try:

try:

try:

address = l[6]

url = ‘http://api.map.baidu.com/geocoder/v2/?address=’ + address + ‘&output=json&ak=’ + ak

json_data = requests.get(url = url).json()

json_geo = json_data[‘result’][‘location’]

except KeyError,e:

address = l[0]

url = ‘http://api.map.baidu.com/geocoder/v2/?address=’ + address + ‘&output=json&ak=’ + ak

json_data = requests.get(url = url).json()

json_geo = json_data[‘result’][‘location’]

except KeyError,e:

address = l[2]

url = ‘http://api.map.baidu.com/geocoder/v2/?address=’ + address + ‘&output=json&ak=’ + ak

json_data = requests.get(url = url).json()

json_geo = json_data[‘result’][‘location’]

except KeyError,e:

continue

json_geo[‘count’] = l[4]/100

bjsonlist.append(json_geo)

ejson1 = {l[0] : [json_geo[‘lng’],json_geo[‘lat’]]}

ejsonlist1 = dict(ejsonlist1,**ejson1)

ejson2 = {‘name’ : l[0],‘value’ : l[4]/100}

ejsonlist2.append(ejson2)

print ‘正在生成第’ + str(num) + ‘个景点的经纬度’

num +=1

bjsonlist =json.dumps(bjsonlist)

ejsonlist1 = json.dumps(ejsonlist1,ensure_ascii=False)

ejsonlist2 = json.dumps(ejsonlist2,ensure_ascii=False)

with open(’./points.json’,“w”) as f:

f.write(bjsonlist)

with open(’./geoCoordMap.json’,“w”) as f:

f.write(ejsonlist1)

with open(’./data.json’,“w”) as f:

f.write(ejsonlist2)

在设置获取经纬度的地址时,为了匹配到更准确的经纬度,我选择了匹配景点地址,然而,景点地址里有各种神奇的地址,因此有了第三部门中去除复杂的信息。

然而,就算去掉了复杂信息,还有一些匹配不到的景点地址,于是我使用了嵌套try,如果景点地址匹配不到;就匹配景点名称,如果景点名称匹配不到;就匹配景点所在区域,如果依然匹配不到,那就跳过。

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

6.网页读取json文件

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

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

#百度地图api示例代码中各位置修改部分

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

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

7.总结

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

热门景点热力图

热门景点示意图

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

这样的

还有这样的

将地图上热门景点的销量Top20提取出来,大多数都是耳熟能详的地点,帝都的故宫排在了第一位,四川则占据了Top5中的三位,而排在Top20中四川省就占了6位,如果不是因为地震,我想还会有更多的火爆的景点进入排行榜的。这样看来如果你这次国庆打算去四川的话,可以脑补到的场景就是:人人人人人人人人人……

热门景点销量top20

于是我又做了一个各城市包含热门景点数目的排行,没想到在4千多个热门景点中,数目最多的竟是浙江,是第二个城市的1.5倍,而北京作为首都位居第二。

主要城市热门景点数

这些城市有那么多热门景点,都是些什么级别的景点呢?由下图看来,各城市的各级别景点基本与城市总热门景点呈正相关,而且主要由4A景区贡献而来。

主要城市热门景点级别

既然去哪些地方人多,去哪里景多都已经知道了,那再看看去哪些地方烧得钱最多吧?下图是由各城市景点销售起步价的最大值-最小值扇形组成的圆,其中湖北以单景点销售起步价600占据首位,但也可以看到,湖北的景点销售均价并不高(在红色扇形中的藏蓝色线条)。而如果国庆去香港玩,请做好钱包减肥的心理和生理准备。

各省旅游景点销售起步价

到这里已经分析完啦,最后提前祝大家五一快乐
如果你符合下面的情况中的任意一条,那我十分建议你加入跟着一起学习

1.准备从事编程工作,但是不知道选择什么语言好

2.只掌握了Python基础,缺乏系统性的学习以及企业级项目实战,达不到求职的能力

3.有一定Python基础,但是求职屡屡碰壁,各种问题频繁暴露,甚至怀疑自己不适合做开发

4.准备转行从事开发的同学

5.年满18即可

6.想利用Python副业月入3000-80000

****扫码二维码领取Python学习试学课程+课程咨询!

领取福利加小姐姐微信:SX77661

免费领取学习+课程规划

五一去哪里人最多?用 Python 抓取的热力图告诉你!相关推荐

  1. python城市热力图_国庆去哪里人最多?用 Python 抓取的热力图告诉你!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 国庆倒计时1天,我们即将迎来8天的小长假,相信很多小伙伴们已经提前规划国庆去哪儿?你是选择去 ...

  2. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

  3. pythonallowpos_利用Python抓取并分析京东商品评论数据

    2.1 内容简介 本章主要介绍如何利用Python抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色等颜色, 70B到90D ...

  4. 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)

    本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过Beautifu ...

  5. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  6. python新闻评论分析_使用 python 抓取并分析京东商品评论数据

    本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...

  7. 真小白|一步步教你用Python抓取微信好友分析

    前言 前段时间公司里有个同事发了张图片在群上,是他所有微信好友头像拼成的一张大图,我看着挺有意思,就想自己也搞一下,然后百度了下怎么抓取微信好友之类的--一搜全是用Python抓取的,之前就听说过Py ...

  8. python数据分析实例:python抓取课工厂网站数据和分析

    在线教育网站学习,是很多人利于闲余时间进行充电的一种选择.本篇文章利用python抓取在线教育网站课工场课程页面的数据,进行简要分析. 通过使用requests库对课工场课程列表页进行抓取. 通过Be ...

  9. 《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?

    视频课程链接:https://edu.csdn.net/course/detail/9348 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演阵容强大,相信许多 ...

最新文章

  1. vue 引入的方法 用在template_?【有手就行】轻松打造属于自己的Vue工程化脚手架工具...
  2. Aspose.Cells设置单元格格式
  3. 编写字符串比较函数strcmp .
  4. mysql教程详解之多表联合查询,MYSQL教程mysql多表联合查询返回一张表的内容实现代码...
  5. Codeforces Round #691 (Div. 1)
  6. aws spark_使用Spark构建AWS数据湖时的一些问题以及如何处理这些问题
  7. 用计算机算小学题目,小学计算机入编考试考试试题.doc
  8. 【转】Go Micro(2)——微服务工具箱
  9. struts 进不了action方法
  10. 8.1.4 CSS3文字(1)( 文字阴影和描边、文字排版、自定义文字 )
  11. 计算机一级报名照片是几寸的,法考报名照片要求几寸
  12. 多线程-生产者消费者模式-CopyOnWriteArrayList索引越界问题
  13. 洛谷-明明的随机数(C语言实现)
  14. 无线网络服务器网络异常,无线网络连接上但上不了网怎么解决
  15. nowcoder16638 carpet
  16. 华为深圳数据分析外包
  17. 2019考研 | 天津大学计算机专硕初试394分考研经历与经验总结(初试)
  18. 如何网页中嵌入谷歌地图
  19. 容易被误解的inline
  20. 全世界最好听的钢琴曲

热门文章

  1. 不独立 ≠ 不相关 (Independent ≠ Uncorrelated)
  2. kafka HA ISR机制
  3. 金蝶EAS客户端批量执行sql代码
  4. 拼题 L2-001 紧急救援 最短路计数+记录路径
  5. Android 获取内部存储中音乐文件的正确姿势
  6. DaVinci Resolve Studio达芬奇调色v17.0.0.39安装说明
  7. 阿里云ECS共享型n4服务器1核2G怎么样?
  8. 音视频系列3:编解码技术
  9. Jenkins 构建CI/CD(一看就会)
  10. 深度剖析 | 团贷网之死,高利贷团灭简史