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

总结和预告

好了这节课就先到这里 , 下节课我们会继续完善这节课的代码
下节课会将这些函数封装到一个类里面 , 方便之后调用 , 谢谢大家赏脸啦
{:-)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容