1. 程式人生 > >程式設計師的我是如何搶票的(Python)

程式設計師的我是如何搶票的(Python)

馬上就要回家過年了,你的票買好了嗎。

雖然我不用搶票,但是還是研究了一下怎麼搶票。

程式設計師嘛,就是要對一切問題進行解構,探索原理本質,尋找規律,將其自動化。。。

好了,言歸正傳,開始。

1.首先,開啟12306網。選個自己要買的路段,我這裡是隨便選的。

然後點選查詢。

2.按下F12,設定如紅色框。然後重新點選查詢,看看瀏覽器都發送了什麼給伺服器。

從下圖看,是傳送了兩條。

3.分別點擊發送的兩條,檢視返回結果。可以看到第二條裡面有當前網頁車票相關的資訊。比如“有”就是顯示在網頁上面的車票後面的有字,“大連”就是出發站資訊。於是,我們知道車票資訊是在這裡面。實際這是個json格式的資料。

4.繼續檢視這條請求訪問的連結。如下。

於是,我們可以用requests庫來模擬瀏覽器訪問。很簡單,具體寫作如下:

5.那麼,如下圖車票的有無資訊是如何提取出來呢?

仔細觀察發現,“有”“無”“-”資訊是用“|”線來分割的。而且為了防止爬取,順序是和網頁顯示不一樣的。探究規律如下:

數字意思:軟臥 23 意思是第23個字元內容對應的是軟臥的有無票狀態。

'''
無座 26
軟臥 23
硬座 29
硬臥 28
特等商務座 32
一等座 31
二等座 30
'''

這裡,我們選擇硬座,如下編寫:

和上面的程式結合,執行如下:

6.與網頁對比,結果一致。D7411因為沒有票,所以被程式剔除。

7.到這裡,可以證明程式是可以獲取車票狀態的。那麼怎麼通知給我呢?

可以通過發郵件的方式。

8.但是郵件即時性不好,要是有票能自動打電話或者發簡訊就好了。

於是,找到了這樣的服務。

阿里大於”可以提供有償的短息和語音服務。具體可以實現簡訊通知,或者電話通知,電話語音的內容是可以自己設定的。只要呼叫它給的api,然後把有票的列車資訊作為引數傳給它就可以了。當Python指令碼檢測到有票的時候,就會給阿里大於api傳送哪些車有票等資訊。阿里大於呢,會撥打我設定好的電話號碼,通知我。這個電話是自動的,語音內容是將指令碼傳遞給阿里大於的文字資訊轉為語言播放給電話前的我的。

這段沒有實現,原理上是可行的。