Kürzlich habe ich gesehen, dass Python zur Implementierung der Zugfahrkartenabfrage verwendet wurde, und ich habe das Gefühl, dass ich viel gewonnen habe. Ich werde jeden Schritt im Detail beschreiben. (Beachten Sie, dass Python3 verwendet wird)
Zuerst zeige ich das Endergebnis:
Auf der cmd-Befehlszeile ausführen: pythontickets.py -dk shanghai chengdu 20161007 > txt
bedeutet: Fragen Sie die Zuginformationen beginnend mit D und K von Shanghai nach Chengdu am 07.10.2016 ab und speichern Sie sie in der Datei result.txt. Folgendes ist das Ergebnis .txt Die Ergebnisse in der Datei:
Das Folgende sind die Implementierungsschritte:
1. Installieren Sie die pip install-Bibliotheken von Drittanbietern: request, docopt, Prettytable
2. docopt kann zum Parsen von über die Befehlszeile eingegebenen Parametern verwendet werden:
""" 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 是可以随便写的,不影响解析
Das endgültige gedruckte Ergebnis ist ein Wörterbuch für die spätere Verwendung:
3. Zuginformationen abrufen
Unsere Schnittstelle zur Abfrage der verbleibenden Stimmen in 12306:
URL: 'https://kyfw.12306.cn/otn/resources/js/framework/station_name. js? station_version=1.8968'
Die Methode ist: get
Übertragene Parameter: queryDate:2016-10-05, from_station:CDW, to_station:SHH
Die entsprechende Abkürzung der Stadt ist Es wird eine weitere Schnittstelle benötigt, um abzufragen, um
3.1 Abfrage der Abkürzung der Stadt:
Die URL dieser Schnittstelle = 'https://kyfw.12306.cn/otn /resources/js/framework/ station_name.js?station_version=1.8968'
Die Methode ist get. Verwenden Sie reguläre Ausdrücke für die zurückgegebenen Ergebnisse, um die Werte des Stadtnamens und der Abkürzung (die zurückgegebenen Werte) zu extrahieren sind ähnlich: 7@cqn|Chongqing South|CRW|chongqingnan|cqn |, was wir brauchen ist: CRW, chongqingnan), der Code lautet wie folgt
parse_stations.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()
Das pprint-Modul kann Informationen ausdrucken, die leichter zu lesen sind:
Führen Sie in cmd aus: python parse_stations.py > stationen.py
Ruft die Datei „stations.py“ im aktuellen Verzeichnis ab. Fügen Sie in der Datei „stations =“ zur Datei „stations.py“ hinzu, um die spätere Werteauswahl zu erleichtern der Inhalt der Datei „stations.py“:
3.2 Nachdem nun die Parameter zum Abrufen der Zuginformationen bereit sind, besteht der nächste Schritt darin, den Rückgabewert des Zuges abzurufen und zu analysieren Geben Sie die von Ihnen benötigten Informationen an, z. B. Zugnummer, Fahrkartennummer der ersten Klasse usw. . , 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 Diese Bibliothek kann ein Format ausdrucken, das der Anzeige von MySQL-Abfragedaten ähnelt,
4. Der nächste Schritt besteht darin, die verschiedenen Module zu integrieren: Tickets.py
"""Train tickets query via command-line. Usage: tickets [-gdtkz] <from> <to> <date> Options: -h,--help 显示帮助菜单 -g 高铁 -d 动车 -t 特快 -k 快速 -z 直达 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): """ 获取命令行输入的参数 """ self.args = docopt(__doc__)#这个是获取命令行的所有参数,返回的是一个字典 def cli(self): """command-line interface""" # 获取 出发站点和目标站点 from_station = stations.get(self.args['<from>']) #出发站点 to_station = stations.get(self.args['<to>']) # 目的站点 leave_time = self._get_leave_time()# 出发时间 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 # 获取列车查询结果 r = requests.get(url,verify=False) traindatas = r.json()['data']['datas'] # 返回的结果,转化成json格式,取出datas,方便后面解析列车信息用 # 解析列车信息 traintypes = self._get_traintype() views = TrainCollection(traindatas,traintypes) views.print_pretty() def _get_traintype(self): """ 获取列车型号,这个函数的作用是的目的是:当你输入 -g 是只是返回 高铁,输入 -gd 返回动车和高铁,当不输参数时,返回所有的列车信息 """ 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): """ 获取出发时间,这个函数的作用是为了:时间可以输入两种格式: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()
Okay, das ist im Grunde alles, was ich gesagt habe Ich sagte zu Beginn: Sie können die gewünschten Zuginformationen abfragen.
Das Obige ist das vom Herausgeber eingeführte Python-Skript zur Implementierung des 12306-Zugticketabfragesystems Bei Fragen hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte mich auch bei Ihnen allen für Ihre Unterstützung der chinesischen PHP-Website bedanken!
Weitere Artikel zur Python-Implementierung des Zugfahrkartenabfragesystems 12306 finden Sie auf der chinesischen PHP-Website!