>  기사  >  백엔드 개발  >  Python은 12306 기차표 쿼리 시스템을 구현합니다.

Python은 12306 기차표 쿼리 시스템을 구현합니다.

高洛峰
高洛峰원래의
2017-02-24 15:12:043311검색

최근에는 기차표 쿼리를 구현하는 데 Python이 사용되는 것을 보고 저도 직접 구현해 보았는데, 느낀 점은 각 단계를 아래에서 자세히 공유해 드리겠습니다. (python3이 사용된다는 점에 유의하세요.)

먼저 최종 결과를 보여드리겠습니다.

cmd 명령줄에서 실행: python ticket.py -dk shanghai chengdu 20161007 > txt

Python은 12306 기차표 쿼리 시스템을 구현합니다.

의미: 2016.10.07 상하이에서 청두까지 D와 K로 시작하는 열차 정보를 조회하고 result.txt 파일에 저장하면 다음과 같습니다. .txt 파일의 결과:

Python은 12306 기차표 쿼리 시스템을 구현합니다.

다음은 구현 단계입니다.

1. 타사 라이브러리 설치 pip install 설치: 요청, docopt, Prettytable

2. docopt를 사용하여 명령줄에서 입력한 매개변수를 구문 분석할 수 있습니다.

"""
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 是可以随便写的,不影响解析

최종 인쇄 결과는 나중에 사용하기 위한 사전입니다.

Python은 12306 기차표 쿼리 시스템을 구현합니다.

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|, 필요한 것은: CRW, chongqingnan), 코드는 다음과 같습니다

parse_stations.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()

pprint 모듈은 정보를 인쇄할 수 있으며 읽기 쉽습니다.

cmd에서 실행: pythonparse_stations.py >stations.py

현재 디렉터리에 있는stations.py 파일. 이 파일에는 사이트 이름이 포함되어 있으며 간단히 말해서 stations.py 파일에 "stations = "를 추가하여 후속 값 획득을 용이하게 하는 사전을 만듭니다. file:

Python은 12306 기차표 쿼리 시스템을 구현합니다.

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()

prettytable 이 라이브러리는 mysql 쿼리 데이터의 표시와 유사한 형식을 인쇄할 수 있습니다.

4 다음 단계는 다양한 모듈을 통합하는 것입니다: ticket.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[&#39;<from>&#39;]) #出发站点
to_station = stations.get(self.args[&#39;<to>&#39;]) # 目的站点
leave_time = self._get_leave_time()# 出发时间
url = &#39;https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={0}&from_station={1}&to_station={2}&#39;.format(
leave_time,from_station,to_station)# 拼接请求列车信息的Url
# 获取列车查询结果
r = requests.get(url,verify=False)
traindatas = r.json()[&#39;data&#39;][&#39;datas&#39;] # 返回的结果,转化成json格式,取出datas,方便后面解析列车信息用
# 解析列车信息
traintypes = self._get_traintype()
views = TrainCollection(traindatas,traintypes)
views.print_pretty()
def _get_traintype(self):
"""
获取列车型号,这个函数的作用是的目的是:当你输入 -g 是只是返回 高铁,输入 -gd 返回动车和高铁,当不输参数时,返回所有的列车信息
""" 
traintypes = [&#39;-g&#39;,&#39;-d&#39;,&#39;-t&#39;,&#39;-k&#39;,&#39;-z&#39;]
# 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 [&#39;G&#39;,&#39;D&#39;,&#39;T&#39;,&#39;K&#39;,&#39;Z&#39;]
def _get_leave_time(self):
"""
获取出发时间,这个函数的作用是为了:时间可以输入两种格式:2016-10-05、20161005
"""
leave_time = self.args[&#39;<date>&#39;]
if len(leave_time) == 8:
return &#39;{0}-{1}-{2}&#39;.format(leave_time[:4],leave_time[4:6],leave_time[6:])
if &#39;-&#39; in leave_time:
return leave_time
if __name__ == &#39;__main__&#39;:
cli = SelectTrain()
cli.cli()

기본적으로는 처음에 말씀하신 내용을 따르시면 됩니다.

위 내용은 편집자가 12306 열차표 조회 시스템을 구현하기 위해 소개한 Python 스크립트입니다. 궁금한 점이 있으시면 남겨주세요. 나에게 메시지를 보내주세요. 편집자는 모든 사람에게 즉시 답변을 드릴 것입니다. 또한 PHP 중국어 웹사이트를 지원해 주신 모든 분들께 감사드립니다!

12306 기차표 조회 시스템의 Python 구현과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.