用Python偷偷告诉你国庆8亿人都去哪儿浪?

原创: 崔皓 51CTO技术栈

开题

共和国70周年的华诞一天天临近了,各行各业都在准备为祖国母亲庆祝生日。作为一个IT人,也想贡献一份绵薄之力。左思右想,最后落脚到国庆长假的旅游上,能否用网络爬虫看看,10.1 长假哪些旅游景点比较热门?今天一起来看看,如何利用网络爬虫生成国庆期间的旅游热点图吧。

需求构思

制作一张旅游热点图,我们想要达到的效果是,在一张中国地图上面标注出旅游热点。通过这张图可以知道哪些城市,或者哪些区域是10.1 期间的旅游热点。也就是说哪些地方在国庆期间去玩的人多。

首先,我们要找一个数据源能够获取全国旅游信息。这里有一个思路就是订票信息,哪些景点的订票比较多,那么这些景点所在的城市就越热门。类似的售票网站还比较多,例如:携程,去哪儿,途牛旅游之类的。

然后,需要分析网站上面的票务数据,将我们感兴趣的旅游热点信息爬取下来。分析信息的重点是针对网页HTML信息的解析

之后,将分析完毕的信息按照一定格式保存到本地,由于下载的信息可能和最终展示信息存在偏差,所以需要做一些数据清洗和数据聚合的操作。

最后,将整理好的信息输入到地图上显示出来,这也是最后展示的环节。这里可以对展示的方式,例如:点图,线图,或者热力图做选择。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

构思图

网站分析

全局预览

找了一圈旅游网站以后,发现在"去哪儿"的门票页面中,有一个对旅游景点热度的信息。网页会根据不同类型景点(自然风光,文化古迹等)进行查询,查询的结果会显示景点名称,景点热度和城市信息。如果我们将这些景点对应的区域的热度进行汇总,就可以知道哪些区域对应的景点热度了。先打开去哪儿旅游,搜索"热门景点"。下面列出了各个地方的热门旅游景点。针对景点主题做了分类,在展示的列表中,有景点名称,景点级别,所在省市,以及热度。其中省市和热点是我们关心的数据。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

URL分析

打开Chrome的开发者工具来看看HTML页面的结构。URL的规律很容易能够看明白。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

url分析图

· Keyword就是"热门景点",它是个常量,每次请求填写这个就行了。

· Subject这个是景点分类,例如:自然风光,游乐场,文化古迹等等。这个需要一一罗列出来,是一个变量后面用数组存放。

· Page是页数,如果我们要爬取所有的信息,需要一页一页往下翻,所以这个数字会不断增长。页面滑动到最下方的时候,会看到Next按钮,可以通过这个按钮将所有页面都遍历到。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

URL全景图

页面元素分析

通过Chrome开发者工具中的元素选择器,可以清除地看到元素的HTML标签。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

列表元素图

由于景点信息放在一个列表中,所以找到列表所在的元素,它放在id为"search-list"的div中。也就是说在请求URL并获取HTML之后,我就需要找到"search-list"div 并且获取其中对应的项目信息。

获取了列表元素之后,再来看看每一项旅游纪录中的值如何获取。其内容放在"sight_item"的div中。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

列表中每项的示意图

接下来分别将景点名称,景点级别,所在省市,热度,地址分别做分析。并且纪录他们元素的值在后面解析HTML的时候可以用到。元素的HTML标签获取类似上面两个元素。把上面这些元素的ID或者Class 可以先记录下来,在后面解析HTML的时候会用到。

爬虫准备

构思和分析都完毕了,我们需要编写代码来实现想法。但是,在这之前我们需要把开发环境以及需要的工具准备好。

由于涉及到网络爬虫,以及图形的展示。所以这里计划使用Python作为开发语言,IDE环境使用PyCharm,展示图表用到pyecharts。

普及一下pyecharts。Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。因此,pyecharts可以理解为用Python来实现的echarts程序,可以在Python上面运行,并且提供良好的地理信息展示。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

Pyecharts图标

另外pyecharts 的地理展示功能比较强大,这点也是我们需要利用的。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

Pyecharts展示中国地图

针对HTML的解析我们使用了BeautifulSoup。

它是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

BeautifulSoup官网图片

爬虫编码

万事具备只欠东风,让我们开始写代码吧,为国庆搬砖让我快乐。这里我们把程序分成两个部分来写,一部分是爬取旅游热点信息,另一部分是旅游热点地图展示。

爬取旅游热点信息

这里一下获取旅游热点信息的思路。大约分为四部。

1. 开始准备必要的文件和引入组件包。

2. 组合变量URL并且做网络请求,请求不成功进行重试。

3. 下载HTML以后对其进行解析,找到旅游热点列表,列表项,分析具体旅游信息。

4. 把分析完的信息保存到csv文件中。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

程序流水图

因为,我们需要请求网络,解析HTML,保存文件。所以需要引入一些Python的包。

· 网络请求

· HTML解析

· 读写CSV

· 在请求头中伪装浏览器

· 错误重试,等待时间

用Python偷偷告诉你国庆8亿人都去哪儿浪?

接下来就是创建请求头,请求头中包括了请求的浏览器,语言,请求格式等信息。这里我们是使用fake_useragent 中UserAgent的random方法随机产生浏览器的信息。这样在模拟浏览器访问网站的时候,每次请求都会随机模拟一种浏览器。例如:IE,Firefox,chrome等等。让网站认为是不同的人,用不同的浏览器来访问网站的。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

接下来生成一个csv文件,用utf-8格式保存。这个文件是用来存放爬虫信息。在文件的表头,我们分别定义了,"区域","名称"等和景点相关的字段。在文件生成的时候就准备好这些列,等填入数据以后,可以方便查看。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

定义一个下载景点内容的函数,这个函数接受URL作为参数,然后通过reqeusts对象下载景点内容。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

由于下载信息可能会遇到网络问题,导致下载失败。所以,我们需要做定义一个下载失败函数,在下载不成功的时候重试下载。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

还记得之前分析的URL吗?景点的类型和分页是变量,这里我们定义一个生成URL的函数来处理这些变量。我们会罗列需要搜索的景点类型在其中。Keyword字段已经转换成ACSII码了,如果需要直接输入中文字符,可以使用from urllib.parse import quote 来实现。另外,我们的开始搜索的页面,使用page=1,之后会解析页面中的"next"按钮,完成翻页的功能。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

好了,到此我们定义文件,下载函数,重试下载函数,分类搜集函数,现在要定义最重要的HTML解析函数了。它的输入参数是景点类型和URL地址。依次执行以下工作。

1. 下载HTML,并且转换成SOUP对象。

2. 找到旅游景点的列表。找到div 的id 为'search-list'的元素。用soup的find方法找到它。

3. 针对景点的项目进行遍历。在'search-list'元素下面,通过findAll 方法找到 class是 'sight_item'的项目,并且对其进行遍历。

4. 解析具体景点信息:名称,区域,省市,热度,地址等等。

5. 找到翻页按钮,继续往下载后面的页面,并且再次解析。通过find方法找到class是'next'的a标签。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

最后,执行main函数运行整个python程序。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

用Python偷偷告诉你国庆8亿人都去哪儿浪?

下载完成的csv图

Csv看上去比较凌乱,把文件通过xls打开,看看格式化以后的热点信息。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

整理以后的旅游热点图

旅游热点地图展示

好了旅游热点的信息已经抓到了,现在开始分析。这里建立将抓去和分析工作分成两块来进行。因为,在抓取过程中会遇到网络问题,解析问题或者反爬虫的问题,而且抓取数据需要一段时间。为了保证其的独立性,所以信息抓取可以单独运行。当完成以后,把抓取的文件作为输入放到展示程序中运行。

展示程序主要完成,数据清洗,汇总求和以及展示地图的工作。这样前面的爬虫和后面的分析展示就连成一体了。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

旅游热点分析流程图

首页我们依旧要引入几个python包,如下。其中Geo opts 和ChartType都是用来展示地图用的。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

其次,我们需要装载csv文件。虽然我们下载了很多信息,但是对于我们最重要的其实是省市和热点信息。因为我们最后展示出来的就是,哪个城市是旅游的热点。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

城市,热度信息图

根据观察,要计算城市的热度,必须将城市信息分组以后求和。这个也是需要考虑的。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

根据城市信息对热度求和

将一些地图中无法识别的地点,以及一些没有热度值的脏数据过滤掉。就可以将生成的城市,热度列表传给展示函数了。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

最后,展示函数接受到列表参数,绘制热力图。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

结果分析

先看看哪些区域是大家比较喜欢的旅游目的地。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

2019国庆旅游热力图

从图上可以看出北京,沿海地图(福建,广州),江浙地区,甘肃地区是国庆期间比较热门的景点。中部地区的武汉,由于军运会将至,也称为了旅游的热门城市。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

2019国庆旅游热点图

再来看看,TOP20的旅游热点城市。

用Python偷偷告诉你国庆8亿人都去哪儿浪?

TOP20的A5旅游景点

用Python偷偷告诉你国庆8亿人都去哪儿浪?

用Python偷偷告诉你国庆8亿人都去哪儿浪?

爬虫思维导图


分享到:


相關文章: