歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 1. 爬下12306

1. 爬下12306

日期:2017/3/3 12:48:59   编辑:Linux技術

第一章從0到1

今天,天氣晴朗,陽光明媚。 你正開開心心地正坐在電腦前辦(fa)公(dai)。

這時Boss過來了,通知你周末陪他出趟差,去北京。

讓你現在給查查看還有哪些票?

只見你不緊不慢的打開一個命令行終端,有條不紊的敲入:

[code]./fetch_sh-bj.sh 2016-05-14
在Boss還沒反應過來時,悠然自得的將電腦屏幕轉過去,氣定神閒的說,“老大,周末從上海到北京的還有這些車次,每行最後3個數分別是二等座一等座商務座的剩余票數,我們訂哪趟車?”

[code]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。 這樣查上海到北京的動車票應該是這樣的:

[code]./fetch12306.sh 上海 北京 2016-05-14
如果你對這些東東感興趣,那麼相信我,本書一定符合你的口味。

廢話不多說,讓我們先看看fetch_sh-bj.sh到底干了哪些事。 fetch_sh-bj.sh是一個腳本文件,可以直接使用文本編輯器打開。

[code]#!/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三個工具的協作實現我們想要的功能。

Copyright © Linux教程網 All Rights Reserved