1. 爬下12306--从0到1
发布日期:2021-05-14 05:46:01 浏览次数:7 分类:技术文章

本文共 2415 字,大约阅读时间需要 8 分钟。

1. 爬下12306--从0到1

原创 
2016年05月14日 23:29:15

第一章从0到1

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

你正开开心心地正坐在电脑前办(fa)公(dai)。 
这时Boss过来了,通知你周末陪他出趟差,去北京。 
让你现在给查查看还有哪些票?

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

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

在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  Speed100 17684  100 17684    0     0   157k      0 --:--:-- --:--:-- --:--:--  181kG142 上海虹桥 北京南 14:21 20:18 无 16 7G144 上海虹桥 北京南 14:32 20:29 无 无 1G18 上海虹桥 北京南 15:00 19:55 无 38 3G146 上海虹桥 北京南 15:05 20:50 无 60 10G148 上海虹桥 北京南 15:34 21:12 54 120 16G20 上海虹桥 北京南 16:00 21:17 193 119 16G150 上海虹桥 北京南 16:05 21:47 321 90 13G152 上海虹桥 北京南 16:20 21:52 560 91 21G22 上海虹桥 北京南 17:00 22:24 221 6 无G154 上海虹桥 北京南 17:14 22:40 612 103 22G156 上海虹桥 北京南 17:19 22:52 258 19 9G44 杭州东 北京南 17:24 23:01 187 109 21G158 上海虹桥 北京南 17:34 23:19 552 99 24G160 上海虹桥 北京南 17:39 23:27 499 92 20T110 上海 北京 17:49 09:25 -- -- --D322 上海 北京南 19:53 07:39 4 -- --D314 上海 北京南 21:12 08:56 1 -- --   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

有没有觉得这个很酷! 

逼格是不是很高! 
是不是应该get这项新技能!

那么问题来了? 

如果boss不是出差去北京,而是去深圳或西安呢? 
有该如何保持这高逼格呢?

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

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

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

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

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

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

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

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

#!/bin/bashcurl --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/'   
1
2
3

Unix有这样的设计哲学:

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

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

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

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

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

- 第一部分使用curl命令从12306官方网站获取车票信息 
- 第二部分使用grep命令将车票信息按照车次分离 
- 最后使用sed命令提取并打印需要的信息

通过curlgrepsed三个工具的协作实现我们想要的功能。

转载地址:https://blog.csdn.net/hzp666/article/details/79213691 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:阿里云弹性计算安全组最佳实践及新特性介绍
下一篇:最佳实践 | 基于弹性计算网络能力提升容器密度

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月04日 07时25分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章