12306提前查北京到长春的春运火车票

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号为例,运行脚本效果如下:

只是一种思路,不用太认真。实际抢票我已经下载了网易火车票这款app,可以根据上面查询的结果现在选定一下要抢的车次,然后在网易火车票这个app里设置好具有针对性的抢票方案,成功率应该会更大一些。这就是今年我的抢票计划。

 
 
 
 
 
posted @ 2016-12-13 22:55  天外归云  阅读(674)  评论(7编辑  收藏  举报