python實現(xiàn)12306車票查詢

看到網(wǎng)上有很多火車票查詢的小腳本漱受,參考一下,發(fā)現(xiàn)很多都已經(jīng)不能再運行了骡送,據(jù)說12306接口返回的數(shù)據(jù)格式更新比較快拜效,這里自己也寫了一個。

環(huán)境

  • Mac osx
  • python3.6
  • pycharm

效果圖

預覽效果

編碼

  1. 安裝腳本用到的模塊

requests各谚, 用于請求12306網(wǎng)站網(wǎng)址

docopt紧憾, 解析命令行參數(shù)

prettytable, 數(shù)據(jù)用表格的形式打印在終端

colorama昌渤, 為打印在表格中的數(shù)據(jù)著色

安裝方式赴穗,直接用pip命令就好:

pip install requests prettytable docopt colorama

下面先來介紹一下prettytable docopt colorama這三個模塊

docopt

python命令行參數(shù)解析工具有很多,這里參考別的查票腳本用的docopt膀息,為了對這個模塊進行了解學習般眉,本篇文章也用了這個模塊,首先針對本文潜支,我們要查詢火車票信息甸赃,肯定要輸入出發(fā)地點,到達地點冗酿,出發(fā)日期埠对,以及要查詢的票的種類络断,于是我們需要的命令行模型如下:

python tickets.py [-gdtrkz] <from> <to> <date>

  • <from> 出發(fā)地
  • <to> 目的地
  • <date> 日期
  • [-gdtrkz] 車票類型(對應)

看一下下面的代碼

#coding=utf-8

"""
Usage:
    python tickets.py [-gdtrkz] <from> <to> <date>
"""
from docopt import docopt

arguments = docopt(__doc__)
print(arguments)

終端運行上面的代碼結(jié)果如下:


命令行解析

由上面的測試可以看出,docopt能從注釋中的Usage下面的命令解析出一個字典项玛,“[ ]”中的是選項貌笨,一般不寫代表全部,寫了代表查詢某一選項對應的數(shù)據(jù)襟沮,
若是選項輸入錯誤锥惋,不會拋出異常,只會出現(xiàn)以下提示:

Usage:
    python tickets.py [-gdtkz] <from> <to> <date>

“< >”中的是參數(shù)开伏,如本例中的<from>,<to>,<date>,這里的參數(shù)是不能少的膀跌,上面提到的選項少了,是可以查詢到數(shù)據(jù)的固灵,這里的參數(shù)少了捅伤,雖然不會報錯,但是不可能有數(shù)據(jù)怎虫。

為了代碼的可讀性暑认,一般注釋中除了Usage(用法)之外,還有參數(shù)說明大审,使用方式等蘸际,比如:

"""
Usage:
    python tickets.py [-gdtrkz] <from> <to> <date>

Options:
    -h,--help   幫助菜單
    -g          高鐵
    -d          動車
    -t          特快
    -r          高級軟臥
    -k          快速
    -z          直達

Example:
    #查詢5月10日北京到上海所有車次
    python tickets.py 北京 上海 2017-05-10 
    #查詢5月10日南京到上海的動車和高鐵
    python tickets.py -dg 南京 上海 2017-05-10
"""

prettytable

這個就不多說了,這里有個對它的用法介紹的很詳盡的文章
http://www.cnblogs.com/Mr-Koala/p/6582299.html

colorama

這是個對終端輸出的文本進行著色的模塊徒扶,直接上代碼圖(官方示例):

colorama使用示例

知道這些用法就足夠本腳本使用了粮彤,模塊的介紹到此結(jié)束,下面正式進入正題姜骡。

網(wǎng)頁接口的獲取

通過chrome監(jiān)聽點擊查詢按鈕后發(fā)送的請求如下

查詢請求

從這個請求我們需要知道导坟,這個一個get請求(嗯,確實是get)圈澈,請求的地址是:https://kyfw.12306.cn/otn/leftTicket/query 惫周,需要的參數(shù)有四個:

  • leftTicketDTO.train_date=2017-05-10 車票日期2017-05-10
  • leftTicketDTO.from_station=HZH 起點站HZH
  • leftTicketDTO.to_station=NJH 終點站NJH
  • purpose_codes=ADULT 車票類型ADULT(成人票)

起點站和終點站使用站點的字母縮寫表示的

車站對應的字母縮寫在哪里却音?狈究??癞志?

在剛進入車票查詢頁面時啥么,在頁面加載的js文件中登舞,有下面的鏈接

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9006

這里返回的是所有的車站和對應縮寫的數(shù)據(jù)

import re
import  requests
from pprint import pprint

url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9006'
response = requests.get(url,verify=False)
stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)',response.text)
pprint(dict(stations),indent=4)

通過正則表達式,匹配所有的車站和對應的縮寫悬荣,并轉(zhuǎn)換成字典格式菠秒。

因為所有的地點和對應的縮寫,變化的可能性不大氯迂,將上面獲取的字典數(shù)據(jù)保存為一個文件践叠,備用言缤。

下面繼續(xù)看查詢車票時返回的數(shù)據(jù):


通過這個json數(shù)據(jù),可以獲取到所有車次的信息酵熙,關鍵在于如何對現(xiàn)有的json進行解析轧简,獲取到所有車次的信息驰坊?ps:網(wǎng)上看了其他人寫的一些查詢車票信息的腳本匾二,之前的車票信息每個字段對應一個值,標準的json形式:


現(xiàn)在的json數(shù)據(jù)每列車的信息都在一串字符串中拳芙,思來想去察藐,沒有找到什么好辦法,唯一發(fā)現(xiàn)的規(guī)律就是每個字段用“|”分割舟扎,現(xiàn)在的做法就是將該段字符串以“|”分割成一個列表分飞,從列表中去數(shù)需要的字段對應的位置。

主要代碼如下:

    def trains(self):
        for raw_train in self.available_trains:
            raw_train_list = raw_train.split('|')
            train_no = raw_train_list[3]
            initial = train_no[0].lower()
            duration = raw_train_list[10]
            if initial in self.options:
                train = [
                    train_no,
                    '\n'.join([Fore.LIGHTGREEN_EX + self.available_place[raw_train_list[6]] + Fore.RESET,
                               Fore.LIGHTRED_EX + self.available_place[raw_train_list[7]] + Fore.RESET]),
                    '\n'.join([Fore.LIGHTGREEN_EX + raw_train_list[8] + Fore.RESET,
                               Fore.LIGHTRED_EX + raw_train_list[9] + Fore.RESET]),
                    duration,
                    raw_train_list[-4] if raw_train_list[-4] else '--',
                    raw_train_list[-5] if raw_train_list[-5] else '--',
                    raw_train_list[-14] if raw_train_list[-14] else '--',
                    raw_train_list[-12] if raw_train_list[-12] else '--',
                    raw_train_list[-7] if raw_train_list[-7] else '--',
                    raw_train_list[-6] if raw_train_list[-6] else '--',
                    raw_train_list[-9] if raw_train_list[-9] else '--',
                ]
                yield train

最后附上代碼地址https://github.com/lexyhp/12306

關于如何從json數(shù)據(jù)中取出需要的字段睹限,歡迎有更好方法的朋友留言譬猫,感謝!羡疗!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末染服,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叨恨,更是在濱河造成了極大的恐慌柳刮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒钝,死亡現(xiàn)場離奇詭異秉颗,居然都是意外死亡,警方通過查閱死者的電腦和手機送矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門蚕甥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栋荸,你說我怎么就攤上這事菇怀。” “怎么了蒸其?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵敏释,是天一觀的道長。 經(jīng)常有香客問我摸袁,道長钥顽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任靠汁,我火速辦了婚禮蜂大,結(jié)果婚禮上闽铐,老公的妹妹穿的比我還像新娘。我一直安慰自己奶浦,他們只是感情好兄墅,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澳叉,像睡著了一般隙咸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上成洗,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天五督,我揣著相機與錄音,去河邊找鬼瓶殃。 笑死充包,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的遥椿。 我是一名探鬼主播基矮,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冠场!你這毒婦竟也來了家浇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慈鸠,失蹤者是張志新(化名)和其女友劉穎蓝谨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體青团,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡譬巫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了督笆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芦昔。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖娃肿,靈堂內(nèi)的尸體忽然破棺而出咕缎,到底是詐尸還是另有隱情,我是刑警寧澤料扰,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布凭豪,位于F島的核電站,受9級特大地震影響晒杈,放射性物質(zhì)發(fā)生泄漏嫂伞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帖努。 院中可真熱鬧撰豺,春花似錦、人聲如沸拼余。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匙监。三九已至凡橱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舅柜,已是汗流浹背梭纹。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工躲惰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留致份,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓础拨,卻偏偏與公主長得像氮块,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诡宗,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 效果圖 1.只查詢動車票 2.查詢所有票 Github鏈接 代碼鏈接為:https://github.com/ha...
    happyte閱讀 1,959評論 0 22
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理滔蝉,服務發(fā)現(xiàn),斷路器塔沃,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 前幾天看了一個爬取12306來獲得火車票信息的教程蝠引,發(fā)現(xiàn)12306官網(wǎng)的存儲車票信息的 Json 數(shù)據(jù)格式已經(jīng)變了...
    LiuHDme閱讀 2,066評論 0 12
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,975評論 6 13
  • 智力涅磐之路 你想成為什么樣的人物,想達成什么樣的理想蛀柴,從一個領域展開新的開始螃概,到成為大師級別,無非三件事: 1....
    楊大輝閱讀 639評論 9 14