12306上离现在太远的日子的火车查不到,但是接口其实是可以返回的,只是前端上限制了不让查。

通过点击查询按钮进行抓包(F12网络里就可以抓包,也可以通过抓包工具),可以获取到查询的接口以及上行参数。通过模拟请求、替换指定的上行参数与解析接口返回的数据可以得到指定日子回家的所有符合要求车次,python代码如下(下面代码只对url上行参数中的queryDate参数值进行了替换,from_station和to_station参数值也都可以抓包进行替换掉):
# -*- coding: utf-8 -*-
import requests,json
#入参date format:yyyy-mm-dd
def query_tickets(date):
s = requests.Session()
url = "https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate="+date+"&from_station=BJP&to_station=CCT"
r = s.get(url,verify=False)
json_r = json.loads(r.content)
date = " ".join(json_r["data"]["searchDate"].split(" "))
for ticket in json_r["data"]["datas"]:
start_station_name = ticket["from_station_name"]
end_station_name = ticket["to_station_name"]
train_no = ticket["train_no"]
short_train_no = ticket["train_no"][0:len(ticket["train_no"])-2]
for one in short_train_no:
if one.isupper():
index = short_train_no.index(one)
train_no = short_train_no[index:len(short_train_no)]
start_time = ticket["start_time"]
arrive_time = ticket["arrive_time"]
print start_station_name+u" 到 "+end_station_name+" "+train_no+" "+date+" "+start_time+" "+arrive_time
if __name__ == '__main__':
query_tickets("2017-01-25")
脚本中query_tickets方法传入的参数唯一为日期(出发地北京、目的地长春、票类型为成人票三个上行参数值已经写死在了get请求的url中,实际可以抓包替换一下)。上面代码以1月25号为例,运行脚本效果如下:
