Python培训
400-996-5531
旅游也需要新意,如何为自己选择合适的出游地方呢?如何让小伙伴们都臣服于我的计划呢?且看今天python培训带来的新资讯——python编程为你甄选端午出游计划。
旅游是调节心情的有效途径,越来越多的上班族和学生期待利用假期时间外出游 玩来开拓眼界、舒缓压力。然而真正有了假期,许多人却会因“去哪玩”的问题倍感困惑,六月份正是出行的好时节,期间还有端午节小长假,就让我们一起来学习如何利用python来安排自己的出行计划吧。
一.数据的获取
最近几年,既省钱又休闲的自助游逐渐成为年轻人出行的首选,这里推荐一个我个人比较喜欢的旅游网站——蚂蜂窝,这次通过分析“驴友”们的出行计划来规划我们自己的行程,第一步当然是爬取网站数据啦
1.分析目标网页
为了获取大家的出行信息,我们进入网站的“结伴”板块,查看“一个月以内”的出行计划,可以看到随着页面的更改url并没有发生变化,初步判断该网页是通过js加载的,要想爬取首先得找到真实url和返回的数据格式。
经过一番尝试,我们成功找到了请求返回的真实url和关键参数,这里返回的是json格式的数据,里面包含了一个html文本。
2.确定抓取内容
在正式开始爬取数据之前,我们要先确定需要爬取哪些数据。行程的列表页清晰地展现了目的地、行程简介、发起人ID和性别(呵呵),虽然这些信息非常有参考价值,但是如果能获取更多信息无疑会对我们的行程规划更有帮助,所以还是要进入详情页来看一看。
可以看到,详情页中对出发时间、行程历时、出发地点等都有详细说明,此外还有报名结伴人员情况,这项数据能在很大程度上反映小伙伴们的出行意向,所以一定要拿下来。
3.正式爬取数据
总体思路是爬取索引页中每一个行程的发起人和详情页url,之后进入详情页抓取出发时间、历史、目的地、出发城市、希望人数以及报名人员情况等数据,每个行程的索引页数据和详情页数据合 并后作为该行程的完整数据进行存储。以下是爬虫程序的总入口:
def entrance(self): start_url = r'#/together/' page_index = self.Start_page while True: payload = { 'flag':3, 'offset':page_index, 'mddid':0, 'timeFlag':3, 'timestart':'' } if self.get_info(start_url, payload): page_index += 1 time.sleep(self.sleep_time) else: break self.df.to_csv('travel.csv', encoding = 'utf_8_sig')
左右滑动看代码
payload参数:flag决定了行程的排序方式,可选值为1、2、3,分别代表“即将出发”、“最新发布”、“热门结 伴”;
offset表示当前页数,默认从0开始;middid表示行程目的地,不确定目的地值为0;timeFlage代表出 发时间,值为3表示选取一个月内的行程。
get_info()方法:抓取每一页的行程信息并翻页,如果无法获取有效信息则说明爬取结束。
数据存储:由于数据量不大,可以先全部存储到一个dataframe数据结构中,再一次性写入csv文件。
二. 数据清洗
我们来看看获取到的数据是什么样子的,可以看到,每条数据中都有很多干扰信息:
“出发时间”一栏我们想要 的仅仅是日期数据;
“报名人数”一栏我们想要的仅仅是数字,而不需要多余的修饰文字等等;
“部分出行” 计划涵盖了多个目的地,这对我们的旅游目的地分析是非常不利的
所以,我们必须先对获取到的数据进行清洗, 以期为正式的数据分析奠定基础。
1.规范格式
首先对历时、希望人数、报名人数(女)、报名人数(男)这几项数据进行清洗,仅保留数字部分;其次对出发是 按、出发地点相关数据进行情况,取到“:”及前面的内容。感谢pandas.Series.str方法,使我们可以非常简单地完 成上述工作,功能函数如下:
def no_colon(self, col_list): for col in col_list: self.df[col] = self.df[col].str.split(':', expand = True)[1]
左右滑动看代码
only_num(self, col_list):去除数据中的非数字部分。
no_colon(self, col_list):去除数据中的“:”及其前面的内容。
2.拆分目的地
刚才说到过,一个行程中包含多个目的地会对我们的分析造成干扰,这里的解决思路是对目的地数据进行拆分。
将一列数据拆分成X列(X为该行程包含的目的地个数),同样是使用pandas.Series.str方法,代码如下:
def multi_dest(self, col): df = self.df[col].str.split(':', expand = True)[1]\ .str.split('|', expand=True) df.rename(columns={0:'dest1', 1:'dest2', 2:'dest3', 3:'dest4', 4:'dest5'}, inplace=True) # 把拆分后的地址组成的临时df并入到原df中 self.df = self.df.join(df)
三.数据分析
现在我们可以对数据进行分析查找六月份的旅行规律了,为了便于观察,这里使用pyecharts进行可视化处理。
1.男女比例
首先对参与出行计划的人员性别进行分析,利用dataframe的sum()和groupby().count()方法可以很容易获得行程 发布者和参与者的性别分布:
从图中可以看出,发起人以女性居多,约占总数的60%,而参与者刚好相反,男性比 例约为60%,估计是女同胞们更擅长精心策划行程,而男同胞们大多比较“懒”吧~
2.出发时间
这里我们首先用dataframen的groupby()方法,以“出行时间”为关键字对数据进行分组,分别统计每天的行程数量 和参与者数量,然后画出折线图。
从结果来看,6月15、16两天是六月份出行的高峰期(这个时间刚好开始端午节假期),端午节有出行计划的朋友 们记得提前准备哈。除此之外的几个波峰也都出现在周末,看来喜欢自助游的朋友中还是上班族(也可能是大学 生)居多啊。
3.目的地选择
先来分析行程发布数据,首先将数据中所有的目的地加入到一个list中(包含重复数据),然后使用collections中的Counter()方法统计每个目的地出现的频次,最后制图。
其实作为一名自由行爱好者,我同样比较喜欢更加原始和纯粹的风光,对于沉淀心情确实会起到更好的效果,大家如果有出行计划又不知道去哪玩的话,不妨从上面的目的地中选一下。
4.参与者情况如何
首先分别统计出各个目的地报名的男性数量和女性数量储存到两个dict中,分别取参与 人数最多的10个目的地,最后将两组数据合并、去重......
然后我们会惊奇地发现,虽然两个序列中具体排名不尽相 同,但是男性和女性最想去的10个目的地居然完全一致。
不过各个地点的男女人数还是有较大差异的,如果想来一场完美的邂逅,或许下面这张图会有点帮助哈。
恭喜你阅读完了本文,从爬取到数据清洗,到数据分析,是一个痛并快乐着的过程,你还用python编程计划了哪些美好的事情呢?你在使用python的过程中还有哪些疑问,欢迎你来达内python培训机构进行咨询。
免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved