作者:PYuraL
来源:Yura不说数据说(ID:Data_tells_U)
……空气突然安静……
我:简单粗暴,挑个火车票最便宜的地方去!
室友马上拿出手机查?
我:你这一个一个查效率太低了吧,等会儿,让我拿出我的神器!?
我(信誓旦旦状):等我爬下携程所有票价信息,以后给我一个预算,我就能跟你说你去到哪儿!
01 有个想法
作为刚工作不久,收入约等于支出的月光族,没时间“读万卷书”,更没钱“行万里路”。别人出去旅游,澳洲美洲新马泰,而我们只能看看我们的余额宝,扣扣索索地找就近的地方,毕竟火车票便宜~
那么传统的查询方式——根据出发点&目的地查票价——对我们来说效率太低。理想方式当然是:输入出预算金额,就得到一个在预算范围内的所有目的地列表!
02 数据爬取
首先,我们当然要爬取从自身所在地到全国所有火车站点的?车次信息。
打开携程网页,选择火车:
我们需要输入出发城市、到达城市,出发时间默认为当天,需要修改成第二天及以后,以防由于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个城市!
03 交互一下
爬到了基础信息之后,我稍微设计一下交互的代码了~没什么经验,就只简单设计了几个选项。大家下载源码,爬取数据之后可直接输入条件,然后就能得到目的地列表啦。
Ps:我不会告诉大家Excel的“筛选”工具其实更加简单粗暴!
不完美的代码?
https://github.com/PengYura/CtripForTravel
04 最后的最后
钱是要赚的~
但是旅游也是万万不可少的!
囊中羞涩的时候,用用Yura的小神器
毕竟
经济基础决定上层建筑,旅游预算决定能走多远~
世界那么大,谁不想出去看看呀?