Python命令行查詢12306火車票

2021-02-15 SunFlow007


程序很簡單,主要是調用了12306的api。用法也很簡單:輸入出發地、目的地、乘車時間,將查詢到的結果在命令行列印出來。對了,這個是我以前參照了:Python3 實現火車票查詢工具_Python_實驗樓 - 實驗樓 ,現在我把簡單修改了一下,適合新人練練手!

有兩點需要注意:

1.from stations import stations這個是stations是個存儲城市和代碼的字典{},譬如南京,對應的城市代碼是NKH,這個就是在stations裡查找得出的。

2.主要用到了colorama,docopt,prettytable可以將命令行的查詢結果以彩色表格形式列印。

3.用到了while True....這樣可以保證程序一直循環,查詢一次,輸出結果以後,再次開始新一輪的查詢。如果需要中斷程序可以用ctrl+c。

使用方法如下:

"""Usage:    輸入要查詢的火車類型可以多選(動車d,高鐵g,特快t,快速k,直達z)    輸入出發地、目的地、出發日期。    查詢結果以命令行形式自動呈現。Examples:    Please input the trainType you want to search :dgz    Please input the city you want leave :南京    Please input the city you will arrive :北京    Please input the date(Example:2017-09-27) :2018-03-01"""

程序截圖如下:

動態效果如下:

程序原始碼,包含兩部分:1.stations.py 2.searchTrain.py

1.stations.py

import reimport requestsfrom pprint import pprinturl = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018'requests.packages.urllib3.disable_warnings()#如果不加此句會有:InsecureRequestWarning: Unverified HTTPS request is being madehtml = requests.get(url,verify=False)station = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', html.text)stations = dict(station)pprint(stations,indent = 4)

2.searchTrain.py

"""Usage:    輸入要查詢的火車類型可以多選(動車d,高鐵g,特快t,快速k,直達z)    輸入出發地、目的地、出發日期。    查詢結果以命令行形式自動呈現。Examples:    Please input the trainType you want to search :dgz    Please input the city you want leave :南京    Please input the city you will arrive :北京    Please input the date(Example:2017-09-27) :2018-03-01"""#coding = utf-8#author = Lyon#date = 2017-12-17import jsonimport requestsfrom docopt import docoptfrom prettytable import PrettyTablefrom colorama import init,Forefrom stations import stationsclass searchTrain:    def __init__(self):        self.trainOption = input('-d動車 -g高鐵 -k快速 -t特快 -z直達,Please input the trainType you want to search :')        self.fromStation = input('Please input the city you want leave :')        self.toStation = input('Please input the city you will arrive :')        self.tripDate = input('Please input the date(Example:2017-09-27) :')        self.headers = {            "Cookie":"__NRF=74C05F8DA4A54BAD8FE8C1858576401F; JSESSIONID=7F000001F6317B0C83A920B23A62A0D64E27924D83; route=495c805987d0f5c8c84b14f60212447d; BIGipServerotn=602931722.64545.0000; BIGipServerpool_passport=200081930.50215.0000; _jc_save_fromStation=%u4E0A%u6D77%2CSHH; _jc_save_toStation=%u5357%u4EAC%2CNJH; _jc_save_fromDate=2017-07-20; _jc_save_toDate=2017-07-18; _jc_save_wfdc_flag=dc",            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",            }        self.available_trains,self.options = self.searchTrain()    @property    def trains(self):        for item in self.available_trains:            cm = item.split('|')            train_no = cm[3]            initial = train_no[0].lower()            if not self.options or initial in self.options:                train = [                train_no,                '\n'.join([Fore.GREEN + cm[6] + Fore.RESET,                          Fore.RED + cm[7] + Fore.RESET]),                '\n'.join([Fore.GREEN + cm[8] + Fore.RESET,                          Fore.RED + cm[9] + Fore.RESET]),                cm[10],                cm[32],                cm[25],                cm[31],                cm[30],                cm[21],                cm[23],                cm[28],                cm[24],                cm[29],                cm[26],                cm[22]   ]                yield train    def pretty_print(self):        pt = PrettyTable()        header = '車次 車站 時間 歷時 商務座 特等座 一等 二等 高級軟臥 軟臥 硬臥 軟座 硬座 無座 其他'.split()        pt._set_field_names(header)        for train in self.trains:            pt.add_row(train)        print(pt)    def searchTrain(self):        arguments = {        'option':self.trainOption,        'from':self.fromStation,        'to':self.toStation,        'date':self.tripDate        }        options = ''.join([item for item in arguments['option']])        from_station, to_station, date = stations[arguments['from']] , stations[arguments['to']] , arguments['date']        url = ('https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT').format(date,from_station,to_station)        requests.packages.urllib3.disable_warnings()        html = requests.get(url,headers = self.headers,verify=False)        available_trains = html.json()['data']['result']        return available_trains,optionsif __name__ == '__main__':    while True:        asd = searchTrain()        asd.pretty_print()

後續:其實查詢還是很簡單的,就是調用API接口,輸入查詢關鍵詞就OK了,但是要想完整地實現購買火車票的流程,還是一個比較複雜的項目,Github上有完整的項目,喜歡的童鞋可以上去看看~testerSunshine/12306

彩蛋:

下一篇文章:Python命令行實現—查全國7天天氣

下下篇文章:Python—itchat實現微信自動回復

下下下篇文章:Python實現微信查天氣+火車+飛機+快遞!!!

相關焦點

  • 火車票查詢12306機票查詢 智行火車票12306搶票
    火車票查詢12306機票查詢智行火車票12306是否可靠?智行火車票12306確實能搶到票嗎?赤星火車票12306是否要收費?智行火車票12306門票獲取應用程式是一款旨在自動獲取火車票的軟體。您可以在此平臺上查看最新的票務信息,買票比其他人快一步,您也可以隨時更改標誌,讓您隨時拿票快來下載吧!
  • 火車票查詢及票價查詢一 火車票查詢系統(一)——利用python實現監控12306餘票查詢
    直接掃碼或長按識別加入就可以了,加的時候一定要備註:火車票,否則不通過,請理解!加我後我第一時間拉你進群的哈。最近春運高峰,本人從12月開始買過年回家的火車票,然鵝?現實總是那麼殘酷,放票時間記不住,要麼就是不能實時盯著刷票,外面的軟體也不知道靠不靠譜,反正是沒買到票,所以一怒之下,自己做一個12306餘票查詢系統,可以實現以下一些功能:火車票查詢及票價查詢一1。設置目標位置進行查詢餘票2。通過設定條件監控到餘票後進行12306帳號登錄3。12306登錄及圖片識別(自動登錄功能)4。
  • 火車票查詢預訂 12306網上訂火車票官網
    全國專業的網上訂票平臺——12306網上訂火車票官網,為您提供火車票預訂、時刻表查詢、火車票餘票查詢、火車正晚點查詢、車票起售時間查詢、貨運信息查詢、鐵路知識以及新聞公告等。我們熟知的12306,它既是全國鐵路統一客服電話號碼,也是網上訂火車票官網。也就是說,旅客朋友可以在12306網上訂火車票,也可以撥打12306進行與火車票相關的諮詢。
  • 火車票查詢預訂最新 12306火車票預訂網 火車票預訂查詢官網
    12306火車票預定網每天7:00~23:00,提供註冊用戶網上預訂火車票、網上查詢火車票價等服務。旅客登錄12306官網新版首頁,查看最新的列車時刻表,輕鬆在線預訂20天以後的火車票。下面詳細介紹火車票預定網的相關內容。
  • 火車票查詢預訂最新 12306網上訂票 火車票訂票官網
    火車站的預售期是18天,網上訂票官網預售期是20天,旅客可以提前登錄12306(122306)網上訂票官網,查詢最新的火車票餘票情況。通過火車票訂票官網的數據,了解各車次不同席位的票價,快速制定出行訂票計劃。火車票訂票官網網址:12306(122306)新版網址是kyfw,12306.cn;舊版網址是www.12306.cn。
  • 火車票預訂網12306官網 12306官網火車票預訂(學生票)
    目前春運就到了,如下圖所示,學生也在複習準備著考試,考試完就可以回家過年了,現在就必須提前訂票,不然之後只能買到站票或在硬座,小編介紹一下如何提前預訂火車票火車票預訂網12306官網312306官網訂票火車票預訂網12306官網進入官網首頁,點擊「購票」
  • 12306網上火車票退票攻略
    退票時間:我還沒有換取紙質車票當我們在12306網上預訂火車票官網訂票後
  • 自己動手寫100行Python代碼搶火車票!【附源碼下載地址】
    今年你不妨自己寫一段代碼來搶回家的火車票,是不是很Cool。
  • Python實戰案例教學(視頻講解) - 12306自動訂票&搶票
    需求和實現原理每到春節國慶這種長假,搶火車票就成了最熱門的話題。很多網站也推出了一些搶票軟體,有些收費有些免費。我們說,python是萬能的!那麼,python能幫我自動預訂(搶)火車票嗎?答案是肯定的:)要不然我也不會做這個視頻教程了。python有很多方法去實現搶票,其基本原理,就是讓程序自動模擬人去操作12306網站。
  • 12306網上火車票退票入口www.12306.cn
    此外,鐵路部門還在www.12306.cn上增設了12306網上退票綠色通道,方便旅客退票。 火車票退票省錢攻略12306退票流程如下:1.首先登陸火車票訂票官網:www.12306.cn,輸入用戶名和密碼後,進入下面頁面:2.購買車票後,在訂單查詢中可查詢到車票信息,點擊退票按鈕3、系統提示確定退票後,進入確認(退票)頁面,點擊確認退票按鈕
  • 12306網上火車票退票入口
    此外,鐵路部門還在www.12306.cn上增設了12306網上退票綠色通道,方便旅客退票。 火車票退票省錢攻略12306退票流程如下:1.首先登陸火車票訂票官網:www.12306.cn,輸入用戶名和密碼後,進入下面頁面:2.購買車票後,在訂單查詢中可查詢到車票信息,點擊退票按鈕3、系統提示確定退票後,進入確認(退票)頁面,點擊確認退票按鈕
  • 【app推薦】智行火車票——智行在手,秒殺無憂
    編者按:昨天團團君推送的火車票新的購票時間是不是讓大家眼花繚亂呢?別擔心!今天團團君為大家特推團團君一直在使用的搶票神器——智行火車票。
  • Python3.6實現12306火車票自動搶票
    Python運行環境:python3.6用到的模塊:re、splinter、time、sys、httplib2、urllib、smtplib、email火車票可以自動填充帳號密碼,同時,在登錄時,也可以修改帳號密碼然後手動識別驗證碼,並登陸,接下來的事情,交由腳本來做了,靜靜的等待搶票結果就好(刷票過程中,瀏覽器不可關閉)author: cuizytime: 2018-05-30"""import refrom splinter.browser import Browserfrom time import sleepimport sysimport
  • 火車票查詢預訂 火車票訂單取消三次還可以買票嗎?
    鐵路12306官網自推出網上訂購火車票服務以來,這種快捷方便的訂票方式深受旅客朋友的喜愛,只要是買火車票就在鐵路12306官網訂票。鐵路12306官網不僅可以訂票,還可以取消未付款定單。當沒有訂到合適的車次時,您可以及時的取消當前訂單,重新下單。一個帳號一天可以取消幾次訂單呢? 一個帳號一天可以取消訂單三次,三次之後當天就不可以再用該帳號在鐵路12306官網訂票了,只能等到次日才可以再次下單訂票。
  • 火車票查詢預訂火車票 2021年春運火車票今起接受預訂
    火車票查詢預訂火車票1首先我們登錄「中國鐵路客戶服務中心」官方站點www.12306.cn 這是網絡訂購火車票的唯一網站,大家要記住了,以免上當造成不必要的財產損失。想要網上購票就先要註冊網站的用戶名(已經註冊的用戶跳過此環節)。我們打開網站首頁,點擊左側的「網上購票用戶註冊」按鍵開始註冊。
  • 12306官方火車票Api接口
    對於技術人員,雖然寫一個搶票軟體還是比較難的,但是還是簡單看看12306相關的接口,如果有類似的需求或業務,或者此文章可以幫助到你。背景在一些需要工具等應用可能會應用到火車票信息的查詢,但是又不知去哪裡找即免費又不限制次數的Api接口,呵呵,今天我簡單給你介紹一些Api接口的抓取,不要激動,最終還是希望可以幫助到你。
  • 明天起12306買火車票可以用微信支付啦!
    明天6時起,微信支付全面接入12306購票平臺,用戶在12306官網或官方APP上可使用微信支付購買車票。在手機12306官方APP選擇車票預訂↓選好行程並點擊查詢↓選擇合適的列車並進入到訂單頁面↓核實好信息後點擊「提交訂單」↓選擇「立即支付
  • 智行火車票預訂特價機票酒店汽車門票
    > 點擊下方【公.眾.號】關注後,免費領取智行火車票預訂特價機票酒店汽車門票(若資源失效,我們會儘快更新)智行火車票是上海蒜芽信息科技有限公司發布的一款自動查詢預訂火車票的軟體。智行火車票提供雲端監控、自動搶票、直連官方、智能規劃等功能。
  • 2021年春運火車票預定及購買入口www.12306.cn
    從今日開始,廣大市民可以通過網絡和電話購買2021年春運首日(2020年1月28日)的火車票了。據悉,2021年春運時間為1月28日至3月8日。從12月30日起,購票人可以通過網絡和電話購買2021年1月28日的火車票;2021年1月1日起,可以通過車站窗口和代售點購買。2021年1月13日至2021年1月19日可以購買春節7天長假的火車票。
  • 2019年春運火車票已經開售 12306這個新功能厲害了!
    需要搶票回家的小夥伴要記住幾個時間點哦:2018年12月23日,可以購買春運第一天(2019年1月21日)的火車票。2019年1月5日,可以購買2019年年二十九(2月3日)的火車票。2019年1月6日,可以購買2019年除夕(2月4日)的火車票。2019年1月7日,可以購買2019年春節(2月5日)的火車票。2019年1月12日,可以購買2019年正月初六(2月10日)的火車票。2019年1月30日,可以購買春運最後一天2019年3月1日的火車票。