1. 程式人生 > >urllib2 實現簡單爬取12306網站

urllib2 實現簡單爬取12306網站

開發工具:python2.7

主要是用的庫:urllib2

爬取物件:12306購票系統

1、首先我們的任務是選取合適的網頁入口,開啟12306官網:

這裡寫圖片描述

我們先試試進入餘票查詢:
這裡寫圖片描述

第一次進入這個網站我們發現報錯了,在網址http處紅色顯示證書不符合要求,我們暫時忽略。點選查詢按鈕,這時候我們看到頁面並沒有變化。我們按F12進入開發者工具看看:
這裡寫圖片描述
我們進入Network選項,再次點選查詢發現下方顯示拒絕訪問,看來我們無法從這個介面進入網站。
我們返回之前的頁面點選購票:這裡寫圖片描述
再次點選查詢,這下我們看到了我們查詢的結果,url=https://kyfw.12306.cn/otn/leftTicket/init


然後我們用程式碼來抓取一下這個url:

import urllib2
#我們定義一個函式來抓取這個網站
def getList():
        url='https://kyfw.12306.cn/otn/leftTicket/init'
        req = urllib2.urlopen(url)
        html = req.read()#獲取網站原始碼資料
        #print html 
getList() #我們嘗試打印出來看看

這裡寫圖片描述

顯示是一大長串的json檔案。

print type(html)
type ‘str’

我們現在把str轉換成python能處理的dict

import json
dict = json.loads(html)

下面我們通過F12開發者工具檢視我們需要的車輛資訊在什麼地方。
通過一番查詢我們發現我們需要的資訊:這裡寫圖片描述

我們通過對比可以看到我們為難剛才打印出來的網頁資訊與我們在F12中找到的是吻合的。我們想要的資訊都在data裡的鍵值對裡。

2、我們提取我們想要的資訊:

import urllib2
import ssl
import json
import time
ssl._create_default_https_context = ssl._create_unverified_context
#關閉證書驗證

#< > 是個物件 需要方法進行操作
def getList(): req = urllib2.urlopen('https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-02-25&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=CDW&purpose_codes=ADULT')#開啟網頁 html = req.read()#獲取網站原始碼資料 dict = json.loads(html)#把str轉換成python能處理的dict return dict['data'] list_s = getList() #for i in list_s: print i['queryLeftNewDTO']['station_train_code'] + '*********' + i['queryLeftNewDTO']['swz_num']+'*****' +i['queryLeftNewDTO']['start_time'] 打印出車輛資訊、票數以及發車時間

ps:這裡需要提到一點,我們在執行程式碼過程中可能無法開啟網頁,主要是證書無法識別的原因,我們用ssl庫關掉證書認證就可以正常訪問網頁了。

執行結果:
這裡寫圖片描述

3、實現電話簡訊提醒

4、完成驗證登陸,自動購買車票

上面兩點還沒完成,待續。。。