ホームページ >バックエンド開発 >Python チュートリアル >Python は 12306 鉄道チケット照会システムを実装します

Python は 12306 鉄道チケット照会システムを実装します

高洛峰
高洛峰オリジナル
2017-02-24 15:12:043342ブラウズ

最近、電車のチケットのクエリを実装するために Python が使用されているのを見つけました。私もそれを実装して、多くのことが得られたと感じました。以下に各ステップを詳しく共有します。 (Python3 が使用されていることに注意してください)

最初に最終結果を示します:

cmd コマンドラインで実行: python ticket.py -dk shanghai chengdu 20161007 > result.txt

Python は 12306 鉄道チケット照会システムを実装します

意味: 上海をクエリ-成都 2016.10.07 D と K で始まる列車情報を入力し、result.txt ファイルに保存します。結果は、次のとおりです。

Python は 12306 鉄道チケット照会システムを実装します

実装手順は次のとおりです。

1. サードパーティのライブラリをインストールします。pip install および install:requests、docopt、prettytable

2. docopt は、コマンド ラインから入力されたパラメーターを解析するために使用できます。 最終的な印刷結果 後で簡単に使用できる辞書です:

3. 列車情報を取得します

12306 で残りのチケットをクエリするためのインターフェース: Python は 12306 鉄道チケット照会システムを実装します

url: 'https://kyfw.12306. cn/otn/resources/js/framework/station_name.js?station_version=1.8968'

メソッドは:get

送信パラメータ:queryDate:2016-10-05、from_station:CDW、to_station:SHH

対応する略語インターフェイスのクエリ結果

3.1 対応する都市の略語をクエリします:

このインターフェイスの URL = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name .js?station_version=1.8968'

メソッドは get です。返された結果に対して正規表現を使用して都市名と略称を取得します (戻り値は次のようになります: 7@cqn|Chongqing South|CRW|chongqingnan|cqn|, what必要なコードは次のとおりです: CRW、chongqingnan)、コードは次のとおりです

parse_stations.py:

"""
Usage:
test [-gdtkz] <from> <to> <date>
Options:
-h,--help 显示帮助菜单
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达
Example:
tickets -gdt beijing shanghai 2016-08-25
"""
import docopt
args = docopt.docopt(__doc__)
print(args)
# 上面 """ """ 包含中的:
#Usage:
# test [-gdtkz] <from> <to> <date>
#是必须要的 test 是可以随便写的,不影响解析

pprint モジュールには情報を出力できます。これは読むのに便利です:

cmd で実行: python parse_stations .py > station.py

は現在のディレクトリにあります。このファイルにはサイト名と略語が含まれており、辞書を作成するために「stations =」を追加します。後の値は、stations.py ファイルの内容です:

3.2 列車情報を取得するためのパラメータが準備できたので、次のステップは列車の戻り値を取得し、必要な情報を解析することです。 、列車番号、一等券の枚数など。 。 , myprettytable.py

#coding=utf-8
from prettytable import PrettyTable
class TrainCollection(object):
"""
解析列车信息
"""
# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座
header = &#39;序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座&#39;.split()
def __init__(self,rows,traintypes):
self.rows = rows
self.traintypes = traintypes
def _get_duration(self,row):
"""
获取车次运行的时间
"""
duration = row.get(&#39;lishi&#39;).replace(&#39;:&#39;,&#39;小时&#39;) + &#39;分&#39;
if duration.startswith(&#39;00&#39;):
return duration[4:]
elif duration.startswith(&#39;0&#39;):
return duration[1:]
return duration
@property
def trains(self):
result = []
flag = 0
for row in self.rows:
if row[&#39;station_train_code&#39;][0] in self.traintypes:
flag += 1
train = [
# 序号
flag,
# 车次
row[&#39;station_train_code&#39;],
# 出发、到达站点
&#39;/&#39;.join([row[&#39;from_station_name&#39;],row[&#39;to_station_name&#39;]]),
# 成功、到达时间
&#39;/&#39;.join([row[&#39;start_time&#39;],row[&#39;arrive_time&#39;]]),
# duration 时间
self._get_duration(row),
# 商务座
row[&#39;swz_num&#39;],
# 一等座
row[&#39;zy_num&#39;],
# 二等座
row[&#39;ze_num&#39;],
# 软卧
row[&#39;rw_num&#39;],
# 硬卧
row[&#39;yw_num&#39;],
# 硬座
row[&#39;yz_num&#39;],
# 无座
row[&#39;wz_num&#39;]
]
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__ == &#39;__main__&#39;:
t = TrainCollection()

Python は 12306 鉄道チケット照会システムを実装します

prettytable このライブラリは、mysql クエリ データの表示と同様の形式を出力できます。次のステップは、さまざまなモジュールを統合することです: ticket.py

#coding=utf-8
from prettytable import PrettyTable
class TrainCollection(object):
"""
解析列车信息
"""
# 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座
header = &#39;序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座&#39;.split()
def __init__(self,rows,traintypes):
self.rows = rows
self.traintypes = traintypes
def _get_duration(self,row):
"""
获取车次运行的时间
"""
duration = row.get(&#39;lishi&#39;).replace(&#39;:&#39;,&#39;小时&#39;) + &#39;分&#39;
if duration.startswith(&#39;00&#39;):
return duration[4:]
elif duration.startswith(&#39;0&#39;):
return duration[1:]
return duration
@property
def trains(self):
result = []
flag = 0
for row in self.rows:
if row[&#39;station_train_code&#39;][0] in self.traintypes:
flag += 1
train = [
# 序号
flag,
# 车次
row[&#39;station_train_code&#39;],
# 出发、到达站点
&#39;/&#39;.join([row[&#39;from_station_name&#39;],row[&#39;to_station_name&#39;]]),
# 成功、到达时间
&#39;/&#39;.join([row[&#39;start_time&#39;],row[&#39;arrive_time&#39;]]),
# duration 时间
self._get_duration(row),
# 商务座
row[&#39;swz_num&#39;],
# 一等座
row[&#39;zy_num&#39;],
# 二等座
row[&#39;ze_num&#39;],
# 软卧
row[&#39;rw_num&#39;],
# 硬卧
row[&#39;yw_num&#39;],
# 硬座
row[&#39;yz_num&#39;],
# 无座
row[&#39;wz_num&#39;]
]
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__ == &#39;__main__&#39;:
t = TrainCollection()

さて、これで基本的には終わりです。冒頭の指示に従って、必要な列車情報をクエリします

上記は、12306 列車チケットクエリシステムを実装するためにエディタで実装された Python スクリプトです。皆さん、助けてください。質問がある場合はメッセージを残してください。編集者がすぐに返信します。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。 12306 鉄道切符クエリ システムの Python 実装に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。