"驗證碼登錄的流程是怎麼樣的?"python
這是我最早問本身的一個問題,因而,我去登錄了不少的網站,最後發現大體的流程是這樣的api
點擊登錄打開登錄界面
瀏覽器
在登錄界面輸入用戶名密碼和驗證碼而後點擊登錄按鈕cookie
登錄界面跳轉,跳轉到網站的某一個頁面工具
這就意味着咱們須要在程序中模擬這些操做,這看上去好像並非很難,在咱們上一個模擬登陸實例的基礎上加上驗證碼的數據一塊兒post出去就好了,爲了便於操做,我將想到的全部要作的事情一一列舉出來,大體是這樣的post
先手動登錄,在登錄過程當中找到post數據的內容,向哪一個網站post數據
網站
使用urlopen 將登錄界面的源碼下載下來,並將驗證碼圖片的網址找出來url
點擊驗證碼的圖片找到要輸入的驗證碼,構建請求,加入post數據,並將全部數據發送到實際登錄的網站code
使用cookielib獲取cookies,並構造opener自動攜帶cookies訪問其餘的頁面圖片
你們能夠看到大部分的流程和上一個實例模擬登錄的同樣,只是增長了驗證碼圖片的獲取和輸入而已,OK,來走一遍流程
手動登錄,獲取登錄過程當中的各類信息,仍是httpfox,仍是直接上圖,
好了,獲取咱們所須要的信息就是這兩張圖,圖上的另外幾個post是其餘網站的,不用管,就看我標出來的就好,
2. 爬取頁面源碼,並獲取驗證碼圖片
前面咱們已經說到,圖片在網頁中是以連接的形式存放的,那麼驗證碼應該也不例外,因此咱們經過RE,能夠把驗證碼的網址抽取出來,整個流程你們已經很熟悉了,源碼也很簡單
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" ''' 獲取源碼並獲取驗證碼的數據 ''' import urllib2 import re # httpfox顯示的登錄界面 login_url = 'https://id.ifeng.com/api/sitelogin' headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0',} pattern = re.compile(r'<img src="(.*?)".*?',re.S) request = urllib2.Request(login_url,headers=headers) response = urllib2.urlopen(request) contents = response.read() items = re.findall(pattern,contents) for item in items: print item
來來來,咱們來看看輸出
nothing??!!這該死的小婊砸,這是怎麼回事?首先我開始檢查我寫的代碼有沒有錯誤,可是發現運行正常,因此應該不是代碼的問題,而後我又檢查了正則式,就短短的幾個字母,應該是沒有錯的,那剩下來的因素貌似只有url了,難道我傳進去的url是錯誤的?但是這不是從工具裏面獲取的嗎?爲了避免放過這一個可能性,我仍是將這個想法嘗試了一次,畢竟也沒什麼事能夠作了,我將RE的部分去掉,只是獲取網頁的源碼並輸出,而後結果是這樣的
這是一個JS的腳本,反正我是看不懂,不過能夠確定的是,這並非我看到的登錄界面的源碼,這究竟是爲何呢?因而我把前面使用到的url,也就是https://id.ifeng.com/api/sitelogin ,輸入瀏覽器,當我點擊訪問以後,奇怪的事情是這個網址居然變化了!!
輸入的時候是這樣的:
訪問以後變成了這樣:
首先咱們看到網址已經變化了,並且還有一些提示的信息,這是兩個不一樣的網頁,也就是說,在訪問的過程當中,網頁已經發生了跳轉,這是爲何呢?