您的位置:首页 > 其它

1. 爬下12306--从0到1

2016-05-14 23:29 239 查看

第一章从0到1

今天,天气晴朗,阳光明媚。

你正开开心心地正坐在电脑前办(fa)公(dai)。

这时Boss过来了,通知你周末陪他出趟差,去北京。

让你现在给查查看还有哪些票?

只见你不紧不慢的打开一个命令行终端,有条不紊的敲入:

./fetch_sh-bj.sh 2016-05-14


在Boss还没反应过来时,悠然自得的将电脑屏幕转过去,气定神闲的说,“老大,周末从上海到北京的还有这些车次,每行最后3个数分别是二等座一等座商务座的剩余票数,我们订哪趟车?”

cyf@cyf$./fetch_sh-bj.sh 2016-05-14% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload Upload Total Spent Left Speed
100 17684 100 17684 0 0 157k 0 --:--:-- --:--:-- --:--:-- 181k
G142 上海虹桥 北京南 14:21 20:18 无 16 7
G144 上海虹桥 北京南 14:32 20:29 无 无 1
G18 上海虹桥 北京南 15:00 19:55 无 38 3
G146 上海虹桥 北京南 15:05 20:50 无 60 10
G148 上海虹桥 北京南 15:34 21:12 54 120 16
G20 上海虹桥 北京南 16:00 21:17 193 119 16
G150 上海虹桥 北京南 16:05 21:47 321 90 13
G152 上海虹桥 北京南 16:20 21:52 560 91 21
G22 上海虹桥 北京南 17:00 22:24 221 6 无
G154 上海虹桥 北京南 17:14 22:40 612 103 22
G156 上海虹桥 北京南 17:19 22:52 258 19 9
G44 杭州东 北京南 17:24 23:01 187 109 21
G158 上海虹桥 北京南 17:34 23:19 552 99 24
G160 上海虹桥 北京南 17:39 23:27 499 92 20
T110 上海 北京 17:49 09:25 -- -- --
D322 上海 北京南 19:53 07:39 4 -- --
D314 上海 北京南 21:12 08:56 1 -- --


有没有觉得这个很酷!

逼格是不是很高!

是不是应该get这项新技能!

那么问题来了?

如果boss不是出差去北京,而是去深圳或西安呢?

有该如何保持这高逼格呢?

为了解决后顾之忧,我们必须弄明白fetch_sh-bj.sh干了哪些事?

然后山寨出个上海到深圳和西安的查票工具:fetch_sh-sz.sh,和fetch_sh-xa.sh

不过,最终解决方案应该是弄个通用的查票工具fetch12306.sh

这样查上海到北京的动车票应该是这样的:

./fetch12306.sh 上海 北京 2016-05-14


如果你对这些东东感兴趣,那么相信我,本书一定符合你的口味。

废话不多说,让我们先看看fetch_sh-bj.sh到底干了哪些事。

fetch_sh-bj.sh是一个脚本文件,可以直接使用文本编辑器打开。

#!/bin/bash
curl --insecure --user-agent "Mozilla/5.0 (X11; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0" "https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=$1&from_station=SHH&to_station=BJP" | grep -oP "(?<={)[^{}]+(?=})" | sed -r 's/.*station_train_code":"([^"]+).*start_station_name":"([^"]+).*end_station_name":"([^"]+).*start_time":"([^"]+).*arrive_time":"([^"]+).*ze_num":"([^"]+).*zy_num":"([^"]+).*swz_num":"([^"]+).*/\1 \2 \3 \4 \5 \6 \7 \8/'


Unix有这样的设计哲学:

一个程序只做一件事,并做好。

程序要能协作。

程序要能处理文本流,因为这是最通用的接口。

fetch_sh-bj.sh正是这种哲学思想下的产物:

拼装现有的工具,协作完成我们期望的功能。

fetch_sh-bj.sh脚本以竖线(“|”)为单位划分成三部分:

- 第一部分使用curl命令从12306官方网站获取车票信息

- 第二部分使用grep命令将车票信息按照车次分离

- 最后使用sed命令提取并打印需要的信息

通过curlgrepsed三个工具的协作实现我们想要的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: