12306搶票腳本開發(三)實現一個簡單的查詢腳本


文章地址 :

12306搶票腳本開發(一)提綱
12306搶票腳本開發(二)解析火車站代號并分析查詢的HTTP請求
12306搶票腳本開發(三)實現一個簡單的查詢腳本
12306搶票腳本開發(四)完善上節課的代碼并面向對象
12306搶票腳本開發(五)更友好的使用方式
12306搶票腳本開發(六)更友好的時間輸入方式
12306搶票腳本開發(七)將前幾節課的成果結合起來實現一個完整的工具


簡介 :

根據上節課的分析 , 我們已經知道了查詢余票的接口的參數 :

https://kyfw.12306.cn/otn/leftTicket/query?
leftTicketDTO.train_date=2017-02-23&
leftTicketDTO.from_station=BJP&
leftTicketDTO.to_station=SHH&
purpose_codes=ADULT
很簡單 , 四個參數 : 
leftTicketDTO.train_date : 出發日期
leftTicketDTO.from_station : 出發站的代號
leftTicketDTO.to_station : 到達站的代號
purpose_codes : ADULT 表示成人票 , 改變選項為學生票可以發現該參數的值變成了 : 0X00

這樣的話 , 我們就可以來寫一個函數模擬這個接口 :

#!/usr/bin/env python
# encoding:utf-8

import requests

def buildQueryUrl(train_date, station_from, station_to, purpose_code):
    url = "https://kyfw.12306.cn/otn/leftTicket/query?"
    url += "leftTicketDTO.train_date=" + train_date
    url += "&leftTicketDTO.from_station=" + station_from
    url += "&leftTicketDTO.to_station=" + station_to
    url += "&purpose_codes=" + purpose_code
    return url

def main():
    print buildQueryUrl("2017-02-23", "BJP", "SHH", "ADULT")
    print buildQueryUrl("2017-02-23", "BJP", "SHH", "0X00")

if __name__ == "__main__":
    main()

運行結果 :

Paste_Image.png

訪問一下 :

Paste_Image.png

呣~Good
讓我們現在快樂地解析 json 吧 , 根據上節課猜的字段名 , 找出幾個比較重要的字段 :

"start_station_name": "北京南", # 始發站火車站名
"end_station_name": "上海虹橋", # 終點站火車站名
"from_station_name": "北京南", # 乘客上車的站的名稱
"to_station_name": "上海虹橋", # 乘客下車的站的名稱
"start_time": "19:00", # 開車時間
"arrive_time": "23:56", # 到達時間
"gg_num": "--", # 
"gr_num": "--", # 高級軟臥
"qt_num": "--", # 其他
"rw_num": "--", # 軟臥
"rz_num": "--", # 軟座
"tz_num": "--", # 特等座
"wz_num": "--", # 無座
"yb_num": "--", # 
"yw_num": "--", # 硬臥
"yz_num": "--", # 硬座
"ze_num": "有", # 二等座
"zy_num": "10", # 一等座
"swz_num": "8" # 商務座
# 這里有兩個字段實在不知道是干啥的 ... 先擱置吧 ...

繼續碼代碼 :

#!/usr/bin/env python
# encoding:utf-8

import json
import requests
import logging

logging.captureWarnings(True)

def getStartStationName(jsonContent):
    return jsonContent["queryLeftNewDTO"]["start_station_name"]

def getEndStationName(jsonContent):
    return jsonContent["queryLeftNewDTO"]["end_station_name"]

def getFromStationName(jsonContent):
    return jsonContent["queryLeftNewDTO"]["from_station_name"]

def getToStationName(jsonContent):
    return jsonContent["queryLeftNewDTO"]["to_station_name"]

def getStartTime(jsonContent):
    return jsonContent["queryLeftNewDTO"]["start_time"]

def getArriveTime(jsonContent):
    return jsonContent["queryLeftNewDTO"]["arrive_time"]

def getQitaNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["qt_num"]

def getWuzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["wz_num"]

def getYingzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["yz_num"]

def getYingwoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["yw_num"]

def getRuanzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["rz_num"]

def getRuanwoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["rw_num"]

def getGaojiruanwoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["gr_num"]

def getErdengzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["ze_num"]

def getYidengzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["zy_num"]

def getTengdengzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["tz_num"]

def getShangwuzuoNumber(jsonContent):
    return jsonContent["queryLeftNewDTO"]["swz_num"]

url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-02-23&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT"
content = requests.get(url, verify=False).text.encode("UTF-8")
jsonContent = json.loads(content)
for i in jsonContent["data"]:
    print "=" * 36
    print "始發站 : ", getStartStationName(i)
    print "終點站 : ", getEndStationName(i)
    print "起始站 : ", getFromStationName(i)
    print "到達站 : ", getToStationName(i)
    print "發車時間 : ", getStartTime(i)
    print "到達時間 : ", getArriveTime(i)
    print "其他 : ", getQitaNumber(i)
    print "無座 : ", getWuzuoNumber(i)
    print "硬座 : ", getYingzuoNumber(i)
    print "硬臥 : ", getYingwoNumber(i)
    print "軟座 : ", getRuanzuoNumber(i)
    print "軟臥 : ", getRuanwoNumber(i)
    print "高級軟臥 : ", getGaojiruanwoNumber(i)
    print "二等座 : ", getYidengzuoNumber(i)
    print "一等座 : ", getErdengzuoNumber(i)
    print "特等座 : ", getTengdengzuoNumber(i)
    print "商務座 : ", getShangwuzuoNumber(i)

運行之后的效果 :

Paste_Image.png

總結和預告

好了這節課就先到這里 , 下節課我們會繼續完善這節課的代碼
下節課會將這些函數封裝到一個類里面 , 方便之后調用 , 謝謝大家賞臉啦
{:-)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容