python实现12306火车票查询
注:该文是本博主记录学习之用,没有太多详细的讲解,敬请谅解!
某天突然心血来潮,想熟悉下python(目前零接触python),加上年尾将近,车票成了年底热议的话题,故本文由此而生。
由于本人是Java出身,故学习python难度不大,虽语法不同,但大同小异,故此手写一个低配版车票查询功能。本文不提供python环境的说明,各位有兴趣的可自行上网查询学习,敬请见谅!
本文是基于学习之用,故以下代码不是非常完善的功能,只是做个简单的查询功能,各种异常情况没有处理,有兴趣的同学可自行完善!
代码实现
import requests
import json
import os
'''
1、简陋版的车票查询
'''
class TrainTickets:
def __init__(self):
self.filename = 'station_name.txt'
self.stationCodeUrl="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js" #获取城市代码地址
self.trainTicketsUrl="https://kyfw.12306.cn/otn/leftTicket/queryA?" #12306车票查询地址
#下载城市代码
def downloadStationCode(self):
response = requests.get(self.stationCodeUrl);
with open(self.filename, 'w') as f:
for each in response.text.split('=')[1].split('@'):
if each != "'":
f.write(each)
f.write('\n')
#查询城市代码
def searchStationCode(self,from_station,to_station):
stationCode={}
if not (os.path.exists(os.getcwd()+self.filename)):
self.downloadStationCode()
with open("station_name.txt",'r') as f:
for line in f:
content=line.split("|")
if(from_station==content[1]):
stationCode[0]=content[2] # 出发城市代码
if (to_station == content[1]):
stationCode[1] = content[2] # 到达城市代码
return stationCode
#查询车票
def searchTrainTickets(self,from_station,to_station,train_date):
#城市名称转为城市代码
stationCode = t.searchStationCode(from_station, to_station)
prefix="leftTicketDTO."; #请求参数前缀
from_station=prefix+"from_station="+stationCode[0] #始发地
to_station=prefix+"to_station="+stationCode[1] #目的地
train_date=prefix+"train_date="+train_date #出发日
self.trainTicketsUrl+=train_date+"&"+from_station+"&"+to_station+"&purpose_codes=ADULT"; #参数必须按照顺序来,否则调用不了
response=requests.get(self.trainTicketsUrl);
if response.status_code == 200 :
try:
result=json.loads(response.text).get("data")
dataList=result.get("result")
map=result.get("map")
for datas in dataList:
data=datas.split("|")
print("车次:%s 始发站:%s 终点站:%s 出发时间:%s 到达时间:%s 历时:%s 商务座特等座:%s 一等座:%s 二等座:%s 高级软卧:%s 软卧:%s 动卧:%s 硬卧:%s 软座:%s 硬座:%s 无座:%s"
%(data[3],map[data[6]],map[data[7]],data[8],data[9],data[10],data[32],data[31],data[30],data[21],data[23],data[33],data[26],data[27],data[28],data[29]))
except Exception as e:
print("抓取数据失败:",e)
else:
print("抓取数据失败")
#执行main方法
if __name__ == "__main__":
t=TrainTickets()
t.searchTrainTickets('广州', '武汉', '2018-12-27')