ホームページ >バックエンド開発 >Python チュートリアル >Python は 12306 鉄道チケット照会システムを実装します
最近、電車のチケットのクエリを実装するために Python が使用されているのを見つけました。私もそれを実装して、多くのことが得られたと感じました。以下に各ステップを詳しく共有します。 (Python3 が使用されていることに注意してください)
最初に最終結果を示します:
cmd コマンドラインで実行: python ticket.py -dk shanghai chengdu 20161007 > result.txt
意味: 上海をクエリ-成都 2016.10.07 D と K で始まる列車情報を入力し、result.txt ファイルに保存します。結果は、次のとおりです。
実装手順は次のとおりです。
1. サードパーティのライブラリをインストールします。pip install および install:requests、docopt、prettytable
2. docopt は、コマンド ラインから入力されたパラメーターを解析するために使用できます。 最終的な印刷結果 後で簡単に使用できる辞書です:
3. 列車情報を取得します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 = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split() def __init__(self,rows,traintypes): self.rows = rows self.traintypes = traintypes def _get_duration(self,row): """ 获取车次运行的时间 """ duration = row.get('lishi').replace(':','小时') + '分' 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'], # 出发、到达站点 '/'.join([row['from_station_name'],row['to_station_name']]), # 成功、到达时间 '/'.join([row['start_time'],row['arrive_time']]), # duration 时间 self._get_duration(row), # 商务座 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 このライブラリは、mysql クエリ データの表示と同様の形式を出力できます。次のステップは、さまざまなモジュールを統合することです: ticket.py 。
#coding=utf-8 from prettytable import PrettyTable class TrainCollection(object): """ 解析列车信息 """ # 显示车次、出发/到达站、 出发/到达时间、历时、一等坐、二等坐、软卧、硬卧、硬座 header = '序号 车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 软卧 硬卧 硬座 无座'.split() def __init__(self,rows,traintypes): self.rows = rows self.traintypes = traintypes def _get_duration(self,row): """ 获取车次运行的时间 """ duration = row.get('lishi').replace(':','小时') + '分' 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'], # 出发、到达站点 '/'.join([row['from_station_name'],row['to_station_name']]), # 成功、到达时间 '/'.join([row['start_time'],row['arrive_time']]), # duration 时间 self._get_duration(row), # 商务座 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()
さて、これで基本的には終わりです。冒頭の指示に従って、必要な列車情報をクエリします
上記は、12306 列車チケットクエリシステムを実装するためにエディタで実装された Python スクリプトです。皆さん、助けてください。質問がある場合はメッセージを残してください。編集者がすぐに返信します。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。 12306 鉄道切符クエリ システムの Python 実装に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。