旅游是调节心情的有效途径,越来越多的上班族和学生期待利用假期时间外出游玩来开拓眼界、舒缓压力。然而真正有了假期,许多人却会因“去哪玩”的问题倍感困惑,六月份正是出行的好时节,期间还有端午节小长假,就让我们一起来学习如何利用python来安排自己的出行计划吧。

一、数据的获取

最近几年,既省钱又休闲的自助游逐渐成为年轻人出行的***,这里推荐一个我个人比较喜欢的旅游网站——蚂蜂窝,这次通过分析“驴友”们的出行计划来规划我们自己的行程,***步当然是爬取网站数据啦。

1. 分析目标网页

为了获取大家的出行信息,我们进入网站的“结伴”板块,查看“一个月以内”的出行计划,可以看到随着页面的更改URL并没有发生变化,初步判断该网页是通过js加载的,要想爬取首先得找到真实URL和返回的数据格式。

经过一番尝试,我们成功找到了请求返回的真实URL和关键参数,这里返回的是json格式的数据,里面包含了一个html文本。

2. 确定抓取内容

在正式开始爬取数据之前,我们要先确定需要爬取哪些数据。行程的列表页清晰地展现了目的地、行程简介、发起人ID和性别(呵呵),虽然这些信息非常有参考价值,但是如果能获取更多信息无疑会对我们的行程规划更有帮助,所以还是要进入详情页来看一看。

可以看到,详情页中对出发时间、行程历时、出发地点等都有详细说明,此外还有报名结伴人员情况,这项数据能在很大程度上反映小伙伴们的出行意向,所以一定要拿下来。

3. 正式爬取数据

总体思路是爬取索引页中每一个行程的发起人和详情页URL,之后进入详情页抓取出发时间、历史、目的地、出发城市、希望人数以及报名人员情况等数据,每个行程的索引页数据和详情页数据合并后作为该行程的完整数据进行存储。以下是爬虫程序的总入口:

payload参数:flag决定了行程的排序方式,可选值为1、2、3,分别代表“即将出发”、“***发布”、“热门结伴”;offset表示当前页数,默认从0开始;middid表示行程目的地,不确定目的地值为0;timeFlage代表出发时间,值为3表示选取一个月内的行程。

get_info()方法:抓取每一页的行程信息并翻页,如果无法获取有效信息则说明爬取结束。

数据存储:由于数据量不大,可以先全部存储到一个dataframe数据结构中,再一次性写入csv文件。

首先,让我们来看一下获取到的数据。每条数据中都包含了许多干扰信息:在“出发时间”一栏,我们只需要日期数据;而“报名人数”一栏中,我们只需求数字,不需要其他修饰文字等。此外,“部分出行”计划涵盖了多个目的地,这对我们的旅游目的地分析非常不利。因此,在进行正式的数据分析之前,我们需要先对这些数据进行清洗。

1. 规范格式

首先,我们对历时、希望人数、报名人数(女)、报名人数(男)这几项数据进行清洗,仅保留数字部分。其次,对出发是按、出发地点相关数据进行处理,提取“:”及前面的内容。感谢pandas.Series.str方法,使我们可以轻松地完成上述工作。以下是功能函数:

- only_num(self, col_list):去除数据中的非数字部分。

- no_colon(self, col_list):去除数据中的“:”及其前面的内容。

2. 拆分目的地

既然一个行程包含多个目的地会对我们的分析造成干扰,那么解决思路就是对目的地数据进行拆分。将一列数据拆分成X列(X为该行程包含的目的地个数),同样使用pandas.Series.str方法实现。代码如下:

```python

split_destination(series_data, destination_num):

split_data = series_data['destination'].str.split(',', expand=True).stack().str[:destination_num]

return split_data.tolist()

```

三. 数据分析

现在我们已经准备好数据并完成了初步清洗,接下来我们将对数据进行分析以寻找六月份的旅行规律。为了方便观察,我们将使用pyecharts库进行可视化处理。

1. 男女比例

首先对参与出行计划的人员性别进行分析。利用dataframe的sum()和groupby().count()方法可以很容易获得行程发布者和参与者的性别分布。从图中可以看出,发起人以女性居多,约占总数的60%,而参与者正好相反,男性比例约为60%。估计是女同胞们更擅长精心策划行程,而男同胞们大多比较“懒”。

2. 出发时间

接下来,我们使用dataframe的groupby()方法,以“出行时间”为关键字对数据进行分组,分别统计每天的行程数量和参与者数量。然后画出折线图。从结果来看,6月15、16两天是六月份出行的高峰期(这个时间刚好开始端午节假期)。除此之外的几个波峰也都出现在周末。看来喜欢自助游的朋友中还是上班族(也可能是大学生)居多啊。

3. 目的地选择

根据以上分析结果,我们可以得出结论:六月份的女性朋友更倾向于制定旅行计划(如选择目的地、安排行程等),而男性朋友则更偏向于跟随计划出行。出发时间方面,周末成为出行高峰期。

首先,我们来分析行程发布数据。为了实现这一目标,我们需要将数据中所有的目的地加入到一个列表中(包含重复数据),然后使用collections模块中的Counter()方法统计每个目的地出现的频次,并绘制相应的图表。

在制图过程中,我们可以观察到彩条越长表示目的地出现的频次越多。从图表中,我们可以发现大家比较青睐的都是一些商业化程度较低的地区,例如拉萨和新疆。这可能是因为这些地区的原始风光更能让人沉淀心情,对于自由行爱好者来说具有较高的吸引力。因此,如果大家有出行计划却不知道去哪里游玩,可以从上述目的地中选择一个进行探索。

接下来,我们来看看参与者的情况。首先,我们需要分别统计各个目的地报名的男性数量和女性数量,并将结果储存到两个字典中。接着,我们需要取参与人数最多的10个目的地,并将这两组数据合并、去重。

令人惊奇的是,尽管两个序列中的具体排名可能有所不同,但男性和女性最想去的10个目的地居然完全一致。然而,各个地点的男女人数仍存在较大差异。为了更好地了解这些差异,我们可以绘制一张以性别为主要维度的柱状图。

通过以上分析,我们可以得出以下结论:大家更倾向于选择商业化程度较低的地区作为旅行目的地,而这些地区的原始风光更能让人沉淀心情;同时,男性和女性最想去的目的地竟然完全相同,但各地区的男女人数存在较大差异。希望这些信息能对您的出行计划有所帮助。