????室友:Yura,这周我双休,要不要去哪里玩儿?

????我:杭州都玩遍啦,去别的城市看看?

????室友:好哇~我想去莫干山,或者绍兴名人故居,西塘乌镇也不错~哦!好想去南京吃鸭血粉丝汤!如果还能去武汉吃周黑鸭,成都吃串串,重庆吃火锅就更好了!(陷入幻想)

????我:……这么远,路费够我们一周生活费了!

……空气突然安静……

????我:简单粗暴,挑个火车票最便宜的地方去!

室友马上拿出手机查????

  • 杭州到湖州……嗯……34元……

  • 杭州到绍兴…嗯…26元……

  • 杭州到……

????我:你这一个一个查效率太低了吧,等会儿,让我拿出我的神器!

哦,不对,是这个????

????我(信誓旦旦状):等我爬下携程所有票价信息,以后给我一个预算,我就能跟你说你去到哪儿!

作为刚工作不久,收入约等于支出的月光族,没时间“读万卷书”,更没钱“行万里路”。别人出去旅游,澳洲美洲新马泰,而我们只能看看我们的余额宝,扣扣索索地找就近的地方,毕竟火车票便宜~

那么传统的查询方式——根据出发点&目的地查票价——对我们来说效率太低。理想方式当然是:输入出预算金额,就得到一个在预算范围内的所有目的地列表!

首先,我们当然要爬取从自身所在地到全国所有火车站点的????车次信息。

打开携程网页,选择火车:

我们需要输入出发城市、到达城市,出发时间默认为当天,需要修改成第二天及以后,以防由于0点至当前时间点的车次不显示,导致爬取信息不全。

我在杭州,就以杭州东站为出发点,搜索上海为例吧。

结果如图所示:

Ctrl+F,搜索票价24.5试试,很容易就找到了车次的信息页面 (https://trains.ctrip.com/TrainBooking/Ajax/SearchListHandler.ashx?Action=getSearchList):

我们的目标是输入预算,然后得到能够到达的目的地信息,所以车次信息中最关键词的字段就是价格。

但是不同的火车类型(火车/动车/高铁)和不同的座位类型(商务座/一等座/二等座……)的价格都是不一样的。因此我们需要将不同火车类型和座位位置的信息都爬下来!

综上,我们需要的字段一共有:到达城市,时间(可有可无),火车类型,座位类型和票价。

孤陋寡闻的我只乘过高铁和动车,以前只知道分商务座、一等座和二等座,现在爬了数据才发现:动车不仅有动卧,而且还有高级动卧!

(感觉很舒服的亚子)

火车类型也不仅仅是高铁、动车和“绿皮火车”。印象中“绿皮火车”是属于那种便宜但是慢一点的火车统称,实际上可以细分为Z、T和K。所以此次爬虫一共爬取了5种类型的车次:

爬虫的过程不难,设置一下请求头,还是比较容易拿下的。需要注意的是这次用的是POST方法:

与GET方法最大的区别就是需要事先传入一些参数。拉到最下面,可以看到这一串信息。

解读一下,发现包括一些筛选条件、出发地信息、目的地信息和出发时间。按我的(并不多的)经验,一般情况下,不管三七二十一,全部传进去就完事儿了!

这是我以杭州东站为出发点,上海为目的地,得到的所有班次信息:

最贵的是动车高级动卧(320元),最便宜的是火车硬座(24.5元),果然穷人有穷人的坐法,富人有富人的捷径,一切只是????的区别罢辽!

 一条路线都爬下来了,全国路线还远吗?

批量爬取信息的时候,最关键就是找到网址参数之间的区别。不过这次由于是post方法获取信息,变化的值在传入的参数中,网址本身并没有变化。经过筛筛改改测试,发现最关键的信息在于DepartureCity(拼音形式)和ArrivalCity(拼音形式)。DepartureDate(出发日期)也是一个必要参数,但是不用经常改,随便设置一个一天以后的日子就行了,我将其设置成了2019年11月11日,别问为什么,任性。

那么出发城市和到达城市怎么设置呢,我们不能每次都手动输入吧,而且我们熟知的城市肯定有限,那咋办?只能再爬一下城市信息咯。

输入框里面就有所有的城市地名信息,秉着“可见一定可爬”的信念,我找到了城市信息的网页 ????(https://webresource.ctrip.com/ResTrainOnline/R1/TrainBooking/JS/hotline.min.js?2019_10_16_10_51_39.js):

源码信息是这样的:

直接按照“|”进行分割即可:a=r.text.split('|'),得到的excel文件如下,一般是一个中文地址对应一个拼音形式:

直接排序显示,筛选出拼音的内容即可。

部分城市对应着两个拼音,比如“杭州东”对应有两串拼音:“hangzhoudong”和“hzd@hangzhou”,我不清楚里面的逻辑。但是我们只要获得城市的名字即可,因此我也删去了包含“@”关键词的拼音部分。

最后得到如下:

一共有2804个城市!

接下来就是批量爬取了,文明爬虫,从我做起,每次更换城市的时候记得休息一会儿哦????

为了减少爬虫的频次,我暂时只爬取了杭州去往全国各个地方的票价信息。大家如果需要的话也可以爬取全国任意两个城市的票价信息,按需索取哈~

最后得到了3397条信息,原来杭州出发可直达637个城市!

爬到了基础信息之后,我稍微设计一下交互的代码了~没什么经验,就只简单设计了几个选项。大家下载源码,爬取数据之后可直接输入条件,然后就能得到目的地列表啦。

Ps:我不会告诉大家Excel的“筛选”工具其实更加简单粗暴!

不完美的代码????

https://github.com/PengYura/CtripForTravel

钱是要赚的~

但是旅游也是万万不可少的!

囊中羞涩的时候,用用Yura的小神器

毕竟

经济基础决定上层建筑,旅游预算决定能走多远~

世界那么大,谁不想出去看看呀? 

生活不易,必须多才多艺。

数据很多,Yura分析跟你说。

不定期更新数据分析小文章

请大家多多关注多多点赞多多转发:)

世界那么大,谁不想去看看相关推荐

  1. 世界那么大,我想去看看

    题目描述 河南省实验中学的一名教师T的一封辞职信引发热评,辞职的理由仅有10个字:"世界那么大,我想去看看".网友评这是"史上最具情怀的辞职信,没有之一".经采 ...

  2. “世界那么大,我想去看看” ——10款精美的旅游网站设计欣赏

    不知大家是否还记得那个最具情怀的辞职信"世界那么大,我想去看看".我想我们现在都还没有这个勇气辞职,背起行囊来一场说走就走的旅行. 说起旅行,就想起去年在某著名旅行网站上的体验.网 ...

  3. 3年前离职,写下“世界那么大,我想去看看”的女教师,现在怎么样了?

    "世界那么大我想去看看" 那封红极一时的辞职信 想必大家都还记得吧 2015年4月13日 河南实验中学教师顾少强 留下一封辞职信 转身离开那座生活了将近35年的城市 寥寥10字主体 ...

  4. 问题 C: 世界那么大,我想去看看

    题目描述 河南省实验中学的一名教师T的一封辞职信引发热评,辞职的理由仅有10个字:"世界那么大,我想去看看".网友评这是"史上最具情怀的辞职信,没有之一".经采 ...

  5. 世界那么大,我想去看看!

    最近一个老师的辞职信火了,嘿嘿,字写的好漂亮,自愧不如啊.辞职理由写的更是文艺,很是喜欢,特拿过来记录一下. 这几天身体状况很不好,现在考虑要不要去跑步呢.哎,也怪自己的自制力太差了,总是ziwei, ...

  6. 世界那么大,我想去看看——【百度地图的使用】

    在日常生活中,地图的应用很广泛,作为前端小白,我们应该如何去使用呢?接下来就跟着小蜗牛一起去学习吧. 我们在这里以百度地图为例: 一.准备工作 1:首先打开百度地图开放平台网站百度地图开放平台 | 百 ...

  7. 2015年,写下“世界那么大,我想去看看”的女教师,终被现实打败

  8. 世界那么大,我想去看看。Django仿制微信朋友圈九宫格相册(1)

    前面文章里的Python和Django知识点很重要,但过于零散.我们学习最终的目的还是应用.我们今天就来看下如何利用Django仿制微信朋友圈的九宫格相册.本教程比较长,会分成2部分发布,欢迎持续关注 ...

  9. python世界那么大_世界这么大,Python 也想去看看

    把时间线拉回到 2015 年 4 月 13 日,一位河南省实验中学的心里老师在辞职信上写下了「世界那么大,我想去看看」这句话,后来爆红网络,我想这位心里老师当时写这句话的时候肯定没想到这句只有十个字的 ...

  10. 从热门话题世界这么大我想去看看想到的:年轻人该如何改变这个世界 无力感越来越强,最后却成为了力量...

    从热门话题世界这么大我想去看看想到的:年轻人该如何改变这个世界 [一] 古人留给我们一些所谓的人生哲理,比如"沉默是金"."难得糊涂"等,实际上有问题.之所以要 ...

最新文章

  1. android 检查网络连接状态实现步骤
  2. LeetCode 430. Flatten a Multilevel Doubly Linked List
  3. 深入理解ajax系列第一篇——XHR对象
  4. How Much Memory Your Code Is Using? Gym - 101955J
  5. linux基于域的虚拟目录,RHELAS4.0 apache配置之我的小结(虚拟目录,虚拟主机)
  6. 计算机辅助初中英语教学,初中英语CAI课件制作初探
  7. win10操做系统恢复操做
  8. server2012 asp odb数据原_异地服务器文件及数据库定时备份
  9. mysql更换主键遇到的一个问题
  10. docker存储驱动模式之direct-lvm配置
  11. 宠物商城后台管理系统(springMVC+Mybatis+数据库)
  12. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值
  13. 爬取qq音乐,js加密sign值无效,包含思路,遇到的各种问题要点
  14. 打车代驾顺风车货车租运系统开发功能(司机端)
  15. UFS-Net: A unified flame and smoke detection method for early detection of fire in video surveillanc
  16. 如何将WPS转换成office,WPS转office的转换方法
  17. 使用Spring Boot实现GraphQL
  18. 计算机通识必修课程学什么内容,计算机通识课程教学平台的研究与探索——以民办大学为例.pdf...
  19. 安卓手机如何投屏? Scrcpy完美解决
  20. linux 工作笔记软件下载,最新为知笔记linux版本下载地址电脑版-CC软件

热门文章

  1. 【教师招聘】教育综合高分必刷180题
  2. python调用msfconsole全自动永恒之蓝攻击_使用Metasploit复现永恒之蓝攻击
  3. 张鑫溢:8.30今日黄金原油是涨还是跌,鲍威尔暗示打压金价走势?
  4. 【gunicorn】gunicorn基本使用
  5. 畅游C++ Boost Serialization 序列化
  6. hdoj4540 威威猫系列故事——打地鼠
  7. ts10_2Univariate TS模型_pAcf_bokeh_AIC_BIC_combine seasonal_decompose twinx ylabel_bold partial title
  8. Flutter TextField输入框属性详解
  9. “汽车共享”将成汽车租赁潮流
  10. 【Unity3d教程】如何让NavMesh上的载具和车辆能像现实一样优雅地掉头和转向