前言
最近學習Python,所以呢?跟大家一樣,都是看看官網,看看教程,然後就準備搞一個小東西來試試,但是網上的很多這樣的例子不是不夠詳細就是版本是2的。用到3上就會發生一些bug!所以今天給大家分享這麼一個實站教學!在給大家分享之前呢,小編推薦一下一個挺不錯的交流寶地,裡面都是一群熱愛並在學習Python的小夥伴們,大幾千了吧,各種各樣的人群都有,特別喜歡看到這種大家一起交流解決難題的氛圍,群資料也上傳了好多,各種大牛解決小白的問題,這個Python群:330637182 歡迎大家進來一起交流討論,一起進步,儘早掌握這門Python語言。
結果展示:
我在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->表格顯示
安裝庫
未安裝之前
Linux上面目前的庫
安裝庫:
pip3.5 install requests colorama docopt prettytble
安裝之後
安裝完成之後的庫列表
ok,我們環境有了,庫有了,那麼應該幹啥呢?
爬蟲個人分析:
制定爬取內容
選取目標
準備環境,上面就提前說了,因為這個本來就是在搞爬蟲,所以...
分析該網站的html結構,得到url
爬取數據
分析數據
封裝數據(組裝數據),弄成自己想要的樣子
coding......
那麼我們開始吧
第一步
當然是打開12306的官網了,然後進行一個餘票查詢,當然首先你得按一下f12,打開控制檯面板哦。
我是查詢的是:貴陽--遵義西 10-31號的車票
f12之後,查票頁面
我先埋下一個伏筆:
我看到的貴陽-遵義 10-31的車次一共是11個班次。
第二步
首先在控制檯找到Network按鈕,點擊。然後選擇XHR ---》找到請求到後臺的接口,
請求接口
那麼我們先看一個三個接口的請求和返回的數據:
第三個接口返回的數據
哈哈,在裡面我看到了貴陽,遵義,那麼大膽的猜測這個接口有可能就是我們需要的。
我們繼續點開看看有什麼東西,這些數據都是以json的格式傳遞過來的。
展開結果
到這裡我相信,聰明的人已經知道了這個就是我們所需要的接口了,而這些數據就絕對是車次信息的數據。
由上面的我f12查看到的數據是11條,那麼你們就沒有點小激動麼?
說明這個接口就是我們所需要的接口無誤。那麼現在我們就要得到它的url咯。
靠,雙十一快到了,被女朋友抓去看了一會兒衣服,可能今天就不寫了,明天接著寫。
那麼這樣:我就明天開始分析url,然後就coding
請求的接口URL:
分析參數的獲取
leftTicketDTO.train_date=2017-10-31 時間
leftTicketDTO.from_station=GIW 出發地
leftTicketDTO.to_station=ZIW 目的地
同學們請注意:我們輸入的是中文,出來的是地點代碼,說明中間有一層轉換,那麼在常規的網站中,只有兩種三種方式能這樣處理?
將這個地點-地點代碼字典寫入js中,這個地方不可能,因為國內的地點太多。
將地點-地點代碼字典寫入本地文件,然後使用。
從遠端服務器進行獲取,在這裡也沒必要,因為每次都要去請求後臺,增加服務器的壓力,這個是沒必要的,因為這個字典的話是基本不會變化的。
ok經過上面的分析,我們就能很清楚的知道這個字典絕對是從js獲取的,那麼我們就也一樣的使用發f12來檢查到資源,找到該頁面所引用的所有js,然後進行分析。
該頁面所加載的js文件
上圖中的矩形中的就是當前頁面中的所有js,當然每個js的作用我就不一一的說了,各位需要幫助的可以email我,或者在下面留言。
那麼我直接查看各個的內容,發現有一個是:
包含了地點,地點代碼js
這樣我們就得到了一個js的請求地址哦。 https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9028
瀏覽器中輸入該URL看到的結果
我們還可以來一個測試:
我在查詢的時候是輸入了,貴陽-遵義,搜索一下看看吧。
搜索
同學們,看到這個你們覺得爽不爽,說明這個文件就是我們所需要的。
ok,到這裡,編碼前期準備工作,所有的都昨晚了,我從一步一步的分析,然後截圖。給大家思路,方法,步驟。希望大家能夠更明白,更多的是學習到其中的分析思路哈。
codingwars
首先爬取地點-代碼code字典。
新增一個stations字典名稱
好的,到這裡我們的地點-地點代碼就得到了,那麼我們就應該寫那個爬取車次信息的py了。
處理輸出的代碼:
成果展示:
但是我在遠端上使用xshell沒有顏色,這個是什麼鬼。最後發現是自己設置xshell而已。
好的,下面就是我們的程序執行的結果。
如果程序輸入的地點在字典中查詢不到,那麼就不能查票。所以我們需要隨時更新stations.py文件(地點-code字典表)
成果展示
ok,到這裡的話,我們的所有的爬蟲就抓取成功,並且輸出成我們想要的結果了。我準備下一步就是搞那個搶票。試試吧。
謝謝閱讀!原文鏈接:
如有侵權請聯繫小編刪除!