文章地址 :
12306搶票腳本開發(fā)(一)提綱
12306搶票腳本開發(fā)(二)解析火車站代號(hào)并分析查詢的HTTP請(qǐng)求
12306搶票腳本開發(fā)(三)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的查詢腳本
12306搶票腳本開發(fā)(四)完善上節(jié)課的代碼并面向?qū)ο?/a>
12306搶票腳本開發(fā)(五)更友好的使用方式
12306搶票腳本開發(fā)(六)更友好的時(shí)間輸入方式
12306搶票腳本開發(fā)(七)將前幾節(jié)課的成果結(jié)合起來實(shí)現(xiàn)一個(gè)完整的工具
簡(jiǎn)介 :
火車票購票的時(shí)候需要我們輸入火車發(fā)車的時(shí)間 , 這個(gè)時(shí)間是要精確到天的
在我們之前的分析中 , 查詢的接口使用的時(shí)間格式為 : "年-月-日" (當(dāng)月和日為一位數(shù)的時(shí)候補(bǔ)零)這樣的格式
為了能讓程序的輸入更友好 , 我們應(yīng)該考慮我們常見的時(shí)間表示都有什么 ?
1. 相對(duì)日期表示法 :
1.1 自然語言 : 今天/明天/后天/下個(gè)月的15日/下個(gè)月的第一個(gè)星期五...
1.2 時(shí)間戳 : 1487892686 (精確到秒或者毫秒)
2. 絕對(duì)日期表示法
2.1 格式一 : 2017年1月1日 / 2017年01月01日
2.2 格式二 : 2017年1月1號(hào) / 2017年01月01號(hào)
2.3 格式三 : 17年1月1日 / 17年01月01號(hào)
2.4 格式四 : 2017/01/01
2.5 格式五 : 一月一日 / 1月1日
2.6 格式六 : 15日
對(duì)于 相對(duì)日期表示法
中的自然語言表示法的前幾個(gè) (例如 : 今天/明天/后天) 我們可以通過基于規(guī)則的匹配來獲取到用戶想要表達(dá)的真實(shí)日期
對(duì)于 相對(duì)日期表示法
中的自然語言表示法的后幾個(gè) (例如 : 下個(gè)月的15日/下個(gè)月的第一個(gè)星期五) 可能需要解析固定的語法格式 , 然后進(jìn)行一定的計(jì)算才能得出真正的日期 (這個(gè)感覺比較復(fù)雜 , 需要解析的規(guī)則也比較多 , 因此先不考慮)
對(duì)于 時(shí)間戳
這里因?yàn)樗_了 , 我們并不要求這樣高的精度 , 而且在正常的使用中 , 應(yīng)該也不會(huì)有用戶直接輸入一個(gè)時(shí)間戳來表示自己乘坐火車的時(shí)間
對(duì)于 絕對(duì)日期
這種格式 : 我們根據(jù)觀察可以發(fā)現(xiàn) , 存在如下規(guī)律 :
1. 每一種格式中都包含年月日這三個(gè)元素
2. 這三個(gè)元素之后的字符是分隔符 , 這個(gè)分隔符有兩種情況 :
2.1 都相同 , 例如 2017/01/01
2.2 固定的格式 : 年 月 日 / 年 月 號(hào)
3. 有的時(shí)候 , 用戶可能會(huì)省略 年份 或者 年份和月份 , 但是 日期 并不會(huì)少 , 這種情況就表示出發(fā)日期為 當(dāng)前月份 或者 是今年
我們只需要能找到這些分隔符 , 然后用分隔符把這個(gè)表示日期的字符串分割開來再解析成為我需要的格式即可
接下來就來看看我們最終的代碼 :
代碼 :
#!/usr/bin/env python
# encoding:utf-8
import datetime
import re
def timeConvertor(content):
# 首先判斷用戶是不是按規(guī)定格式輸入的
if re.match(r"\d{4}-\d{2}-\d{2}", content):
return content
elif content == "明天":
now = datetime.datetime.now()
delta = datetime.timedelta(days=1)
n_days = now + delta
return n_days.strftime("%Y-%m-%d")
elif content == "后天":
now = datetime.datetime.now()
delta = datetime.timedelta(days=2)
n_days = now + delta
return n_days.strftime("%Y-%m-%d")
elif content.endswith("天后"):
content = content.replace("天后", "")
days = int(content)
now = datetime.datetime.now()
delta = datetime.timedelta(days=days)
n_days = now + delta
return n_days.strftime("%Y-%m-%d")
else: # 所有其他沒有的規(guī)則都默認(rèn)查詢今天
now = datetime.datetime.now()
return now.strftime("%Y-%m-%d")
def test():
print timeConvertor("今天")
print timeConvertor("明天")
print timeConvertor("后天")
print timeConvertor("1天后")
print timeConvertor("5天后")
print timeConvertor("10天后")
總結(jié) :
由于時(shí)間的關(guān)系 , 本節(jié)課最終實(shí)現(xiàn)的代碼很簡(jiǎn)陋 , 而且之前分析的一些功能并沒有實(shí)現(xiàn) , 但是考慮到用戶的輸入格式錯(cuò)誤的可能性較小 , 為了提高開發(fā)效率 , 盡快能推出一款產(chǎn)品 , 因此這里只是簡(jiǎn)單地對(duì)用戶輸入的時(shí)間進(jìn)行了格式化 , 完整的格式化代碼會(huì)在整個(gè)系統(tǒng)開發(fā)完成后再進(jìn)行改進(jìn)
運(yùn)行效果 :
參考資料 :
預(yù)告 :
下節(jié)課我們會(huì)結(jié)合之前所有課程的經(jīng)驗(yàn) , 將之前課程的所有代碼整合起來 , 實(shí)現(xiàn)一個(gè)可以正常使用的查票引擎
用戶可以使用命令行參數(shù)來輸入 :
1. 出發(fā)時(shí)間 (根據(jù)這節(jié)課的腳本實(shí)現(xiàn))
2. 出發(fā)地
3. 目的地
然后程序就會(huì)自動(dòng)去請(qǐng)求 12306 的數(shù)據(jù)接口 , 得到數(shù)據(jù)后再格式化顯示出來