```python
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'Holic'
import requests,time,re
# 获取城市名和城市代码
class Check_Hcp():
def __init__(self):
self.Result,self.Station,self.Code=self.Get_Station()
self.FromStations_ToBJ = ["怀化南","三穗","贵定北","凯里南","铜仁南","芷江","贵阳北","安顺西","关岭","曲靖北","昆明南"]
self.ToStations_ToBJ = ["北京","保定东","石家庄",
"高邑西","邯郸东","安阳东","新乡东","郑州东",
"漯河西","驻马店西","信阳东","武汉",
"赤壁北","长沙南",
"湘潭北","韶山南","娄底南","邵阳北","新化南"]
self.ToStations_ToHome = list(set(self.FromStations_ToBJ).union(set(self.ToStations_ToBJ)))
self.ToStations_ToHome.remove("北京")
print(self.ToStations_ToHome)
self.StationsNo_ToBJ=["G82","G404","G402","G406","D940"]
self.StationsNo_ToHome=["G81","G401","G403","G405","D939"]
# 获取火车站台信息
def Get_Station(self):
# 关闭https证书验证警告
requests.packages.urllib3.disable_warnings()
# 12306的城市名和城市代码js文件url
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9018'
try:
r = requests.get(url, verify=False)
except:
return False,"",""
else:
pattern = u'([\u4e00-\u9fa5]+)\|([A-Z]+)'
result = re.findall(pattern, r.text)
code_dict = {v: k for k, v in dict(result).items()}
print(code_dict)
return True,dict(result),code_dict
# 获取请求网址
def Get_Url(self,text):
if self.Result==False:
date, from_station, to_station = '--', '--', '--'
else:
# 返回调用api的url链接
# 解析参数 aggs[0]里是固定字符串:车票查询 用于匹配公众号接口
args = str(text).split(' ')
try:
date = args[1]
from_station_name = args[2]
to_station_name = args[3]
from_station = self.Station[from_station_name]
to_station = self.Station[to_station_name]
except:
date, from_station, to_station = '--', '--', '--'
# 将城市名转换为城市代码
# api url 构造
url = (
'https://kyfw.12306.cn/otn/leftTicket/query?'
'leftTicketDTO.train_date={}&'
'leftTicketDTO.from_station={}&'
'leftTicketDTO.to_station={}&'
'purpose_codes=ADULT'
).format(date, from_station, to_station)
return url
# 根据Url查询火车票信息
def Query_Train_Info(self,url):
'''
查询火车票信息:
返回 信息查询列表
'''
info_list = []
try:
r = requests.get(url, verify=False)
# 获取返回的json数据里的data字段的result结果
raw_trains = r.json()['data']['result']
for raw_train in raw_trains:
# 循环遍历每辆列车的信息
data_list = raw_train.split('|')
# 车次号码
train_no = data_list[3]
# 出发站
from_station_code = data_list[6]
from_station_name = self.Code[from_station_code]
# 终点站
to_station_code = data_list[7]
to_station_name = self.Code[to_station_code]
# 出发时间
start_time = data_list[8]
# 到达时间
arrive_time = data_list[9]
# 总耗时
time_fucked_up = data_list[10]
# 一等座
first_class_seat = data_list[31] or '--'
if first_class_seat=="无":first_class_seat="--"
# 二等座
second_class_seat = data_list[30] or '--'
if second_class_seat=="无":second_class_seat="--"
# 软卧
soft_sleep = data_list[23] or '--'
if soft_sleep=="无":soft_sleep="--"
#判断所需车次
if first_class_seat=="--" and second_class_seat=="--" and soft_sleep=="--":
continue
# 硬卧
hard_sleep = data_list[28] or '--'
# 硬座
hard_seat = data_list[29] or '--'
# 无座
no_seat = data_list[26] or '--'
# # 打印查询结果
# info = (
# '车次:{}\n出发站:{}\n目的地:{}\n出发时间:{}\n到达时间:{}\n消耗时间:{}\n座位情况:\n 一等座:「{}」 \n二等座:「{}」\n软卧:「{}」\n硬卧:「{}」\n硬座:「{}」\n无座:「{}」\n\n'.format(
# train_no, from_station_name, to_station_name, start_time, arrive_time, time_fucked_up, first_class_seat,
# second_class_seat, soft_sleep, hard_sleep, hard_seat, no_seat))
# 打印查询结果
info = (
'【车次:{}】【出发站:{}】【目的地:{}】【出发时间:{}】【到达时间:{}】【消耗时间:{}】\n【座位情况】:一等座:「{}」 二等座:「{}」软卧:「{}」'.format(
train_no, from_station_name, to_station_name, start_time, arrive_time, time_fucked_up, first_class_seat,
second_class_seat, soft_sleep))
# print(info)
# print("-"*50)
info_list.append(info)
return True,info_list
except:
return False,' 输出信息有误,请重新输入【%s】' %url
def Query_Text(self,Date,FromStation,ToStation):
Result, infos = self.Query_Train_Info(self.Get_Url(r" %s " % Date + FromStation + " " + ToStation))
if Result:
for info in infos:
print(info)
print("-"*50)
else:
print(infos)
def Query_Holic(self,data,way="Home"):
if way=="BJ":
FromStations=self.FromStations_ToBJ
ToStations=self.ToStations_ToBJ
TranNos=self.StationsNo_ToBJ
elif way=="Home":
FromStations=["北京"]
ToStations=self.ToStations_ToHome
TranNos=self.StationsNo_ToHome
else:
return
for FromStation in FromStations:
for ToStation in ToStations:
Result,infos=self.Query_Train_Info(self.Get_Url(r" %s " %data + FromStation + " " + ToStation))
if Result:
for info in infos:
TranNo =re.findall(u"【车次:(.+)】【出发站",info)[0]
if TranNo in TranNos:
print(info)
print("-"*50)
else:
print(infos)
if __name__ == '__main__':
# Check_Hcp().Query_Holic("2018-12-01",way="BJ")
Check_Hcp().Query_Text("2018-12-3","上海","天津")