標籤:簡單 利用 line 興趣 com cst 令行 模組 odi
Python 實現火車票查詢工具
一. 實驗介紹
通過python3實現一個簡單的命令列版本的火車票查詢工具,用實際中的例子會更感興趣,不管怎麼樣,既練習了又可以自己使用。
1. 知識點:
- Python 基礎知識的綜合運用
- docopt, requests, colorama, prettytable 庫的使用
- setuptools 的使用
2. 效果:
二. 介面設計
介面我們就按照12306官網的查詢格式如下:
程式名: pickets
查詢方式: 程式名 出發地 目的地 出發日
火車類型:
-g 高鐵
-d 動車
-t 特快
-k 快速
-z 直達
最終組合介面為:
python pickets.py [-gdtkz] from to date
三. 代碼實現
根據介面設計需要安裝的庫:
G:\Python項目實戰\pickets>pip3 install requests prettytable docopt colorama
requests: 使用Python訪問HTTP資源的必備庫 詳細使用請訪問:http://www.cnblogs.com/python-nameless/p/6013647.html
prettytable: 可以將列印內容格式化為像MySQL一樣的輸出 詳細使用請訪問:http://www.cnblogs.com/python-nameless/p/6013698.html
docopt:命令列參數解析工具 詳細使用請訪問:https://github.com/docopt/docopt
colorama: 命令列著色工具
1. 解析參數
docopt模組可以按照我們自己在文檔字串定義的格式來解析參數,如下:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # __Author__: Hong 4 5 """火車票查詢工具 6 7 Usage: 8 tickets [-gdtkz] <from> <to> <date> 9 10 注意:Usage為固定詞彙,其他報錯。11 12 Options:13 -h,--help 顯示協助菜單14 -g 高鐵15 -d 動車16 -t 特快17 -k 快速18 -z 直達19 20 Example:21 tickets 北京 大同 2016-08-2822 tickets -t 北京 大同 2016-08-2823 """24 from docopt import docopt25 from requests import request26 import prettytable27 import colorama28 29 30 def cli():31 """command-line interface"""32 33 arguments = docopt(__doc__)34 print(arguments)35 36 if __name__ == ‘__main__‘:37 cli()
由上面的程式中,docopt會根據我們在docstring中定義的格式解析參數並返回一個字典(arguments),例如查詢北京到大同的特快如下:
G:\Python項目實戰\pickets>python pickets.py -tk 北京 大同 2016-10-30
參數解析結果:
1 G:\Python項目實戰\pickets>python pickets.py -tk 北京 大同 2016-10-302 {‘-d‘: False,3 ‘-g‘: False,4 ‘-k‘: True,5 ‘-t‘: True,6 ‘-z‘: False,7 ‘<date>‘: ‘2016-10-30‘,8 ‘<from>‘: ‘北京‘,9 ‘<to>‘: ‘大同‘}
2. 擷取資料
參數解析好以後,我們可以通過12306官網擷取我們需要的資料,IE瀏覽器開啟12306官網的查票系統,輸入出發地,目的地,日期,查詢,通過F12開發人員模式找到請求地址(重新整理一次):
通過此請求URL,我們可以看到有我們需要的資訊,或者直接點擊參數查看:
可以看到參數為:出發地 查詢類型(成人,學生) 日期 目的地
通過本文可以看到:返回一個json格式的資料,即一個字典,裡邊包括了各個網站的中文名和網站代號,我們可以利用這個介面來擷取。
開啟此頁的源碼(在頁面右擊選擇查看源碼):
查看一下具體內容:
複製此連結前邊需要加頂層網域https://kyfw.12306.cn開啟, 如下:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971
station_names是一個很長的字串,裡邊包括了所有車站中文名,拼音,簡寫,代號等,
Python3實現火車票查詢工具