天天看點

程式員的我是如何搶票的(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發送哪些車有票等資訊。阿裡大于呢,會撥打我設定好的電話号碼,通知我。這個電話是自動的,語音内容是将腳本傳遞給阿裡大于的文本資訊轉為語言播放給電話前的我的。

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