最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python腳本實(shí)現(xiàn)12306火車票查詢系統(tǒng)

 更新時(shí)間:2016年09月30日 15:41:07   作者:小石頭tester  
本文給大家分享我使用python3實(shí)現(xiàn)的12306火車票查詢系統(tǒng),小編分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

最近我看到看到使用python實(shí)現(xiàn)火車票查詢,我自己也實(shí)現(xiàn)了,感覺收獲蠻多的,下面我就把每一步驟都詳細(xì)給分享出來。(注意使用的是python3)

首先我將最終結(jié)果給展示出來:

在cmd命令行執(zhí)行:python tickets.py -dk shanghai chengdu 20161007 > result.txt

意思是:查詢 上海--成都 2016.10.07 的D和K開頭的列車信息,并保存到 result.txt文件中;下面就是result.txt文件中的結(jié)果:

下面的將是實(shí)現(xiàn)步驟:

1、安裝第三方庫 pip install 安裝:requests,docopt,prettytable

2、docopt可以用來解析從命令行中輸入的參數(shù):

"""
Usage:
test [-gdtkz] <from> <to> <date>
Options:
-h,--help 顯示幫助菜單
-g 高鐵
-d 動(dòng)車
-t 特快
-k 快速
-z 直達(dá)
Example:
tickets -gdt beijing shanghai 2016-08-25
"""
import docopt
args = docopt.docopt(__doc__)
print(args)
# 上面 """ """ 包含中的:
#Usage:
# test [-gdtkz] <from> <to> <date>
#是必須要的 test 是可以隨便寫的,不影響解析

最終打印的結(jié)果是一個(gè)字典,方便后面使用:

3、獲取列車的信息

我們在12306的余票查詢的接口:

url:https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-10-05&from_station=CDW&to_station=SHH

方法為:get

傳輸?shù)膮?shù):queryDate:2016-10-05、from_station:CDW、to_station:SHH

其中城市對應(yīng)簡稱是需要另外的接口查詢得出

3.1 查詢城市對應(yīng)的簡稱:

這個(gè)接口的url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8968'

  方法是get,對返回結(jié)果利用正則表達(dá)式,取出城市名和簡稱的值(返回的值類似:7@cqn|重慶南|CRW|chongqingnan|cqn|,我們需要的就是:CRW、chongqingnan),代碼如下

parse_stations.py:

#coding=utf-8
from prettytable import PrettyTable
class TrainCollection(object):
"""
解析列車信息
"""
# 顯示車次、出發(fā)/到達(dá)站、 出發(fā)/到達(dá)時(shí)間、歷時(shí)、一等坐、二等坐、軟臥、硬臥、硬座
header = '序號 車次 出發(fā)站/到達(dá)站 出發(fā)時(shí)間/到達(dá)時(shí)間 歷時(shí) 商務(wù)座 一等座 二等座 軟臥 硬臥 硬座 無座'.split()
def __init__(self,rows,traintypes):
self.rows = rows
self.traintypes = traintypes
def _get_duration(self,row):
"""
獲取車次運(yùn)行的時(shí)間
"""
duration = row.get('lishi').replace(':','小時(shí)') + '分'
if duration.startswith('00'):
return duration[4:]
elif duration.startswith('0'):
return duration[1:]
return duration
@property
def trains(self):
result = []
flag = 0
for row in self.rows:
if row['station_train_code'][0] in self.traintypes:
flag += 1
train = [
# 序號
flag,
# 車次
row['station_train_code'],
# 出發(fā)、到達(dá)站點(diǎn)
'/'.join([row['from_station_name'],row['to_station_name']]),
# 成功、到達(dá)時(shí)間
'/'.join([row['start_time'],row['arrive_time']]),
# duration 時(shí)間
self._get_duration(row),
# 商務(wù)座
row['swz_num'],
# 一等座
row['zy_num'],
# 二等座
row['ze_num'],
# 軟臥
row['rw_num'],
# 硬臥
row['yw_num'],
# 硬座
row['yz_num'],
# 無座
row['wz_num']
]
result.append(train)
return result
def print_pretty(self):
"""打印列車信息"""
pt = PrettyTable()
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt)
if __name__ == '__main__':
t = TrainCollection()

其中pprint這個(gè)模塊能是打印出來的信息,更加方便閱讀:

在cmd中運(yùn)行:python parse_stations.py > stations.py

就會在當(dāng)前目錄下得到stations.py文件,文件中就是站點(diǎn)名字和簡稱,在stations.py文件中加入"stations = "這樣就是一個(gè)字典,方便后面的取值,下面就是stations.py文件的內(nèi)容:

3.2 現(xiàn)在獲取列車信息的參數(shù)已經(jīng)準(zhǔn)備齊了,接下來就是拿到列車的返回值,解析出自己需要的信息,比如:車次號,一等座的票數(shù)等等。。,myprettytable.py

#coding=utf-8
from prettytable import PrettyTable
class TrainCollection(object):
"""
解析列車信息
"""
# 顯示車次、出發(fā)/到達(dá)站、 出發(fā)/到達(dá)時(shí)間、歷時(shí)、一等坐、二等坐、軟臥、硬臥、硬座
header = '序號 車次 出發(fā)站/到達(dá)站 出發(fā)時(shí)間/到達(dá)時(shí)間 歷時(shí) 商務(wù)座 一等座 二等座 軟臥 硬臥 硬座 無座'.split()
def __init__(self,rows,traintypes):
self.rows = rows
self.traintypes = traintypes
def _get_duration(self,row):
"""
獲取車次運(yùn)行的時(shí)間
"""
duration = row.get('lishi').replace(':','小時(shí)') + '分'
if duration.startswith('00'):
return duration[4:]
elif duration.startswith('0'):
return duration[1:]
return duration
@property
def trains(self):
result = []
flag = 0
for row in self.rows:
if row['station_train_code'][0] in self.traintypes:
flag += 1
train = [
# 序號
flag,
# 車次
row['station_train_code'],
# 出發(fā)、到達(dá)站點(diǎn)
'/'.join([row['from_station_name'],row['to_station_name']]),
# 成功、到達(dá)時(shí)間
'/'.join([row['start_time'],row['arrive_time']]),
# duration 時(shí)間
self._get_duration(row),
# 商務(wù)座
row['swz_num'],
# 一等座
row['zy_num'],
# 二等座
row['ze_num'],
# 軟臥
row['rw_num'],
# 硬臥
row['yw_num'],
# 硬座
row['yz_num'],
# 無座
row['wz_num']
]
result.append(train)
return result
def print_pretty(self):
"""打印列車信息"""
pt = PrettyTable()
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt)
if __name__ == '__main__':
t = TrainCollection()

prettytable 這個(gè)庫是能打印出類似mysql查詢數(shù)據(jù)顯示出來的格式,

4、接下來就是整合各個(gè)模塊:tickets.py

"""Train tickets query via command-line.
Usage:
tickets [-gdtkz] <from> <to> <date>
Options:
-h,--help 顯示幫助菜單
-g 高鐵
-d 動(dòng)車
-t 特快
-k 快速
-z 直達(dá)
Example:
tickets -gdt beijing shanghai 2016-08-25
"""
import requests
from docopt import docopt
from stations import stations
# from pprint import pprint
from myprettytable import TrainCollection
class SelectTrain(object):
def __init__(self):
"""
獲取命令行輸入的參數(shù)
"""
self.args = docopt(__doc__)#這個(gè)是獲取命令行的所有參數(shù),返回的是一個(gè)字典
def cli(self):
"""command-line interface"""
# 獲取 出發(fā)站點(diǎn)和目標(biāo)站點(diǎn)
from_station = stations.get(self.args['<from>']) #出發(fā)站點(diǎn)
to_station = stations.get(self.args['<to>']) # 目的站點(diǎn)
leave_time = self._get_leave_time()# 出發(fā)時(shí)間
url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={0}&from_station={1}&to_station={2}'.format(
leave_time,from_station,to_station)# 拼接請求列車信息的Url
# 獲取列車查詢結(jié)果
r = requests.get(url,verify=False)
traindatas = r.json()['data']['datas'] # 返回的結(jié)果,轉(zhuǎn)化成json格式,取出datas,方便后面解析列車信息用
# 解析列車信息
traintypes = self._get_traintype()
views = TrainCollection(traindatas,traintypes)
views.print_pretty()
def _get_traintype(self):
"""
獲取列車型號,這個(gè)函數(shù)的作用是的目的是:當(dāng)你輸入 -g 是只是返回 高鐵,輸入 -gd 返回動(dòng)車和高鐵,當(dāng)不輸參數(shù)時(shí),返回所有的列車信息
""" 
traintypes = ['-g','-d','-t','-k','-z']
# result = []
# for traintype in traintypes:
# if self.args[traintype]:
# result.append(traintype[-1].upper())
trains = [traintype[-1].upper() for traintype in traintypes if self.args[traintype]]
if trains:
return trains
else:
return ['G','D','T','K','Z']
def _get_leave_time(self):
"""
獲取出發(fā)時(shí)間,這個(gè)函數(shù)的作用是為了:時(shí)間可以輸入兩種格式:2016-10-05、20161005
"""
leave_time = self.args['<date>']
if len(leave_time) == 8:
return '{0}-{1}-{2}'.format(leave_time[:4],leave_time[4:6],leave_time[6:])
if '-' in leave_time:
return leave_time
if __name__ == '__main__':
cli = SelectTrain()
cli.cli()

好了,基本上就結(jié)束了,按照開頭的哪樣,就能查詢你想要的車次信息了

以上所述是小編給大家介紹的Python腳本實(shí)現(xiàn)12306火車票查詢系統(tǒng),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 在Python中使用正則表達(dá)式的方法

    在Python中使用正則表達(dá)式的方法

    這篇文章主要介紹了在Python中使用正則表達(dá)式的方法,講到了專門對正則表達(dá)式提供支持的擴(kuò)展庫re,需要的朋友可以參考下
    2015-08-08
  • Python中對數(shù)據(jù)庫的操作詳解

    Python中對數(shù)據(jù)庫的操作詳解

    今天簡單說說MySQL,我們存儲數(shù)據(jù),直接用本地文件即可,但是,本地文件不利于存放海量數(shù)據(jù),也不利于用程序?qū)ξ募臄?shù)據(jù)進(jìn)行查詢與管理,我們可以使用數(shù)據(jù)庫
    2023-02-02
  • 詳解如何用Python登錄豆瓣并爬取影評

    詳解如何用Python登錄豆瓣并爬取影評

    這篇文章主要介紹了如何用Python登錄豆瓣并爬取影評,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python使用gensim計(jì)算文檔相似性

    Python使用gensim計(jì)算文檔相似性

    在文本處理中,比如商品評論挖掘,有時(shí)需要了解每個(gè)評論分別和商品的描述之間的相似度,以此衡量評論的客觀性。那么python 里面有計(jì)算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強(qiáng)大。下面我們就來體驗(yàn)下gensim的強(qiáng)大
    2016-04-04
  • 解決python3 pika之連接斷開的問題

    解決python3 pika之連接斷開的問題

    今天小編就為大家分享一篇解決python3 pika之連接斷開的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python內(nèi)置異常類型全面匯總

    Python內(nèi)置異常類型全面匯總

    這篇文章主要介紹了Python內(nèi)置異常類型全面匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 編寫同時(shí)兼容Python2.x與Python3.x版本的代碼的幾個(gè)示例

    編寫同時(shí)兼容Python2.x與Python3.x版本的代碼的幾個(gè)示例

    這篇文章主要介紹了編寫同時(shí)兼容Python2.x與Python3.x版本的代碼的幾個(gè)示例,在Python2.7.x的更新中由于采用了某些Python3中的代碼編寫特性、使得在有些原本不同之處編寫兼容性代碼成為可能,需要的朋友可以參考下
    2015-03-03
  • Python加載帶有注釋的Json文件實(shí)例

    Python加載帶有注釋的Json文件實(shí)例

    今天小編就為大家分享一篇Python加載帶有注釋的Json文件實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 基于Django模板中的數(shù)字自增(詳解)

    基于Django模板中的數(shù)字自增(詳解)

    下面小編就為大家?guī)硪黄贒jango模板中的數(shù)字自增(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • python 在指定范圍內(nèi)隨機(jī)生成不重復(fù)的n個(gè)數(shù)實(shí)例

    python 在指定范圍內(nèi)隨機(jī)生成不重復(fù)的n個(gè)數(shù)實(shí)例

    今天小編就為大家分享一篇python 在指定范圍內(nèi)隨機(jī)生成不重復(fù)的n個(gè)數(shù)實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論

永平县| 观塘区| 延寿县| 嘉义县| 武宁县| 彩票| 望江县| 乌拉特前旗| 湖南省| 绵竹市| 寿阳县| 交口县| 峨山| 忻城县| 峨眉山市| 石狮市| 普格县| 汶川县| 铅山县| 隆回县| 平远县| 北流市| 平江县| 哈尔滨市| 苏尼特左旗| 自治县| 天水市| 普定县| 邵阳县| 宣武区| 南宁市| 顺义区| 镇雄县| 惠东县| 沁源县| 连州市| 隆德县| 政和县| 曲麻莱县| 襄樊市| 蒲江县|