12306搶票腳本開(kāi)發(fā)(四)完善上節(jié)課的代碼并面向?qū)ο?/h2>

文章地址 :

12306搶票腳本開(kāi)發(fā)(一)提綱
12306搶票腳本開(kāi)發(fā)(二)解析火車站代號(hào)并分析查詢的HTTP請(qǐng)求
12306搶票腳本開(kāi)發(fā)(三)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的查詢腳本
12306搶票腳本開(kāi)發(fā)(四)完善上節(jié)課的代碼并面向?qū)ο?/a>
12306搶票腳本開(kāi)發(fā)(五)更友好的使用方式
12306搶票腳本開(kāi)發(fā)(六)更友好的時(shí)間輸入方式
12306搶票腳本開(kāi)發(fā)(七)將前幾節(jié)課的成果結(jié)合起來(lái)實(shí)現(xiàn)一個(gè)完整的工具


簡(jiǎn)介 :

根據(jù)上節(jié)課的代碼 , 我們可以將查詢余票的功能抽象成一個(gè)查詢類
這個(gè)類的構(gòu)造函數(shù)就是傳入 :

leftTicketDTO.train_date : 出發(fā)日期
leftTicketDTO.from_station : 出發(fā)站的代號(hào)
leftTicketDTO.to_station : 到達(dá)站的代號(hào)
purpose_codes : ADULT 表示成人票 , 改變選項(xiàng)為學(xué)生票可以發(fā)現(xiàn)該參數(shù)的值變成了 : 0X00

這個(gè)類還會(huì)向外部暴露獲取查詢結(jié)果的各種數(shù)據(jù)的接口 , 比如說(shuō) getStartStationName() 等...
開(kāi)始構(gòu)建代碼吧~


代碼 :

querier.py

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

import json
import requests
import logging

logging.captureWarnings(True)

class querier(object):
    train_date = "2017-01-01"
    from_station = "BJ"
    to_station = "SHH"
    purpose_codes = "ADULT"
    url = ""
    resultJson = {}
    trainsJson = []
    length = 0
    def __init__(self, train_date, from_station, to_station, purpose_codes):
        self.train_date = train_date
        self.from_station = from_station
        self.to_station = to_station
        self.purpose_codes = purpose_codes
        self.url = self.__buildQueryUrl(self.train_date, self.from_station, self.to_station, self.purpose_codes)
        self.resultJson = json.loads(requests.get(self.url, verify=False).text)
        self.trainsJson = self.resultJson["data"]
        self.length = len(self.trainsJson)

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

    def getStartStationName(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["start_station_name"]

    def getEndStationName(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["end_station_name"]

    def getFromStationName(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["from_station_name"]

    def getToStationName(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["to_station_name"]

    def getStartTime(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["start_time"]

    def getArriveTime(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["arrive_time"]

    def getQitaNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["qt_num"]

    def getWuzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["wz_num"]

    def getYingzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["yz_num"]

    def getYingwoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["yw_num"]

    def getRuanzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["rz_num"]

    def getRuanwoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["rw_num"]

    def getGaojiruanwoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["gr_num"]

    def getErdengzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["ze_num"]

    def getYidengzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["zy_num"]

    def getTengdengzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["tz_num"]

    def getShangwuzuoNumber(self, index):
        return self.trainsJson[index]["queryLeftNewDTO"]["swz_num"]

main.py

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

import querier

result = querier.querier("2017-02-28", "BJP", "SHH", "ADULT")
length = result.length
for i in range(length):
    print "=" * 36
    print "首發(fā)站 : ", result.getStartStationName(i)
    print "終點(diǎn)站 : ", result.getEndStationName(i)
    print "起始站 : ", result.getFromStationName(i)
    print "到達(dá)站 : ", result.getToStationName(i)
    print "出發(fā)時(shí)間 : ", result.getStartTime(i)
    print "到達(dá)時(shí)間", result.getArriveTime(i)
    print "其他 : ", result.getQitaNumber(i)
    print "無(wú)座", result.getWuzuoNumber(i)
    print "硬座 : ", result.getYingzuoNumber(i)
    print "硬臥 : ", result.getYingwoNumber(i)
    print "軟座 : ", result.getRuanzuoNumber(i)
    print "軟臥 : ", result.getRuanwoNumber(i)
    print "高級(jí)軟臥 : ", result.getGaojiruanwoNumber(i)
    print "二等座 : ", result.getErdengzuoNumber(i)
    print "一等座 : ", result.getYidengzuoNumber(i)
    print "特等座 : ", result.getTengdengzuoNumber(i)
    print "商務(wù)座 : ", result.getShangwuzuoNumber(i)

運(yùn)行效果 :

Paste_Image.png

總結(jié) :

雖然運(yùn)行效果看起來(lái)和上節(jié)課并沒(méi)有什么區(qū)別 , 但是我們的代碼已經(jīng)發(fā)生了質(zhì)的轉(zhuǎn)變
代碼的可讀性 , 可維護(hù)性都高了許多 , 這也是面向?qū)ο髱?lái)的好處
好了這節(jié)課就到這里 , 感興趣的小伙伴可以把代碼復(fù)制下來(lái)運(yùn)行嘗試一下 , git 倉(cāng)庫(kù)目前還比較亂 , 并沒(méi)有好好整理代碼結(jié)構(gòu) , 大家現(xiàn)在去看可能有點(diǎn)亂


預(yù)告 :

下節(jié)課我們就要開(kāi)始讓我們的代碼面向用戶 , 還記得嗎 ?
我們這里初始化 querier 類的時(shí)候傳遞的參數(shù) :

result = querier.querier("2017-02-28", "BJP", "SHH", "ADULT")

這樣并不符合易用性的原則 , 想一下讓一個(gè)完全不知道火車站的編號(hào)的人來(lái)用的話 , 他根本不知道應(yīng)該如何初始化我們的類 , 因此下節(jié)課我們要做一個(gè)將城市的中文名到編號(hào)進(jìn)行映射的功能 , 讓用戶能更方便地使用 , (還有一個(gè)需要做的就是對(duì)日期的表示 , 如果能支持更多的日期類型就很好了)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容