神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

編程語言 Python 程序員 12306 python學院 python學院 2017-11-03

前言

最近學習Python,所以呢?跟大家一樣,都是看看官網,看看教程,然後就準備搞一個小東西來試試,但是網上的很多這樣的例子不是不夠詳細就是版本是2的。用到3上就會發生一些bug!所以今天給大家分享這麼一個實站教學!在給大家分享之前呢,小編推薦一下一個挺不錯的交流寶地,裡面都是一群熱愛並在學習Python的小夥伴們,大幾千了吧,各種各樣的人群都有,特別喜歡看到這種大家一起交流解決難題的氛圍,群資料也上傳了好多,各種大牛解決小白的問題,這個Python群:330637182 歡迎大家進來一起交流討論,一起進步,儘早掌握這門Python語言。

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

結果展示:

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

我在window上運行的結果

下面這一段說明我是抄的,哈哈,因為我自己再怎麼寫還不是同樣的內容。

讓我們先給這個小應用起個名字吧,既然及查詢票務信息,那就tickets,其實 大家隨意了,需要發佈就需要起一個更好的名字,不然只要自己玩兒的懂,但是要有程序的特點,所以還是tickets相關的吧。方便閱讀和自己記憶。

我們希望用戶只要輸入出發站,到達站以及日期就讓就能獲得想要的信息,比如要查看10月31號貴陽-遵義西的火車餘票, 我們只需輸入:

python3.5 lnlr.py 貴陽 遵義西 2017-10-31

注意:上面的日期(包括後面的)是筆者寫文章時確定的日期,當你在做這個項目的時候可能要根據當前時間做適當調整。

轉化為程序語言就是:

python3.5 lnlr.py from to date

另外,火車有各種類型,高鐵、動車、特快、快速和直達,我們希望可以提供選項只查詢特定的一種或幾種的火車,所以,我們應該有下面這些選項:

-g 高鐵

-d 動車

-t 特快

-k 快速

-z 直達

這幾個選項應該能被組合使用,所以,最終我們的接口應該是這個樣子的:

python3.5 lnlr.py [options] from to date

接口已經確定好了,剩下的就是實現它了。

環境

Centos 7 linux 系統

Python3.5.2

使用到的庫

docopt------>命令行解釋器(把我玩兒死)

colorama--->一個文本著色器

requests --->爬蟲必備,http請求庫

prettytable->表格顯示

安裝庫

  1. 未安裝之前

    神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

    Linux上面目前的庫

安裝庫:

pip3.5 install requests colorama docopt prettytble

  1. 安裝之後

    神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

    安裝完成之後的庫列表

ok,我們環境有了,庫有了,那麼應該幹啥呢?

爬蟲個人分析:

  1. 制定爬取內容

  2. 選取目標

  3. 準備環境,上面就提前說了,因為這個本來就是在搞爬蟲,所以...

  4. 分析該網站的html結構,得到url

  5. 爬取數據

  6. 分析數據

  7. 封裝數據(組裝數據),弄成自己想要的樣子

  8. coding......

那麼我們開始吧

第一步

當然是打開12306的官網了,然後進行一個餘票查詢,當然首先你得按一下f12,打開控制檯面板哦。

我是查詢的是:貴陽--遵義西 10-31號的車票

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

f12之後,查票頁面

我先埋下一個伏筆:

我看到的貴陽-遵義 10-31的車次一共是11個班次。

第二步

首先在控制檯找到Network按鈕,點擊。然後選擇XHR ---》找到請求到後臺的接口,

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

請求接口

那麼我們先看一個三個接口的請求和返回的數據:

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

第三個接口返回的數據

哈哈,在裡面我看到了貴陽,遵義,那麼大膽的猜測這個接口有可能就是我們需要的。

我們繼續點開看看有什麼東西,這些數據都是以json的格式傳遞過來的。

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

展開結果

到這裡我相信,聰明的人已經知道了這個就是我們所需要的接口了,而這些數據就絕對是車次信息的數據。

由上面的我f12查看到的數據是11條,那麼你們就沒有點小激動麼?

說明這個接口就是我們所需要的接口無誤。那麼現在我們就要得到它的url咯。

靠,雙十一快到了,被女朋友抓去看了一會兒衣服,可能今天就不寫了,明天接著寫。

那麼這樣:我就明天開始分析url,然後就coding

請求的接口URL:

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

分析參數的獲取

leftTicketDTO.train_date=2017-10-31 時間

leftTicketDTO.from_station=GIW 出發地

leftTicketDTO.to_station=ZIW 目的地

同學們請注意:我們輸入的是中文,出來的是地點代碼,說明中間有一層轉換,那麼在常規的網站中,只有兩種三種方式能這樣處理?

  1. 將這個地點-地點代碼字典寫入js中,這個地方不可能,因為國內的地點太多。

  2. 將地點-地點代碼字典寫入本地文件,然後使用。

  3. 從遠端服務器進行獲取,在這裡也沒必要,因為每次都要去請求後臺,增加服務器的壓力,這個是沒必要的,因為這個字典的話是基本不會變化的。

ok經過上面的分析,我們就能很清楚的知道這個字典絕對是從js獲取的,那麼我們就也一樣的使用發f12來檢查到資源,找到該頁面所引用的所有js,然後進行分析。

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

該頁面所加載的js文件

上圖中的矩形中的就是當前頁面中的所有js,當然每個js的作用我就不一一的說了,各位需要幫助的可以email我,或者在下面留言。

那麼我直接查看各個的內容,發現有一個是:

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

包含了地點,地點代碼js

這樣我們就得到了一個js的請求地址哦。 https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9028

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

瀏覽器中輸入該URL看到的結果

我們還可以來一個測試:

我在查詢的時候是輸入了,貴陽-遵義,搜索一下看看吧。

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

搜索

同學們,看到這個你們覺得爽不爽,說明這個文件就是我們所需要的。

ok,到這裡,編碼前期準備工作,所有的都昨晚了,我從一步一步的分析,然後截圖。給大家思路,方法,步驟。希望大家能夠更明白,更多的是學習到其中的分析思路哈。

codingwars

  1. 首先爬取地點-代碼code字典。

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

新增一個stations字典名稱

好的,到這裡我們的地點-地點代碼就得到了,那麼我們就應該寫那個爬取車次信息的py了。

處理輸出的代碼:

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

成果展示:

但是我在遠端上使用xshell沒有顏色,這個是什麼鬼。最後發現是自己設置xshell而已。

好的,下面就是我們的程序執行的結果。

如果程序輸入的地點在字典中查詢不到,那麼就不能查票。所以我們需要隨時更新stations.py文件(地點-code字典表)

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

成果展示

ok,到這裡的話,我們的所有的爬蟲就抓取成功,並且輸出成我們想要的結果了。我準備下一步就是搞那個搶票。試試吧。

謝謝閱讀!原文鏈接:

神級程序員用Python3抓取12306車次信息!超詳細的新手案例教學!

如有侵權請聯繫小編刪除!

相關推薦

推薦中...