原本寫到這裏我認爲咱們這個實例已經講解完成了,可是當我回過頭看以後,發現以前一些比較模糊或者不是很肯定的事情,在這裏獲得了一些新的的認識,因此以爲有必要在這裏記錄一下python
爲何登錄的源碼中要使用函數獲取cookies
瀏覽器
我記得我在第40小節的時候比較了幾種方法獲取的cookies,最後咱們選擇了firebug工具獲取的cookies來直接登錄,當時也說過使用代碼獲取的cookies會受到限制,可是,咱們在模擬登錄中,對於cookies的咱們仍是使用代碼來獲取而且處理,爲何要這樣作呢?不是說會受到限制嗎?服務器
首先第一個緣由是咱們除了這個程序沒有別的程序能夠實現處理cookies的功能了,咱們要在代碼中模擬登錄的整個流程,這中間確定是不能斷開而後再去瀏覽器取cookies的,而python中彷佛也只有這個庫能實現cookies的處理,但實際上,我一直對這個問題耿耿於懷,因此,如今咱們就來對比看看這幾個cookies有什麼區別,首先仍是先貼上上次的源碼cookie
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" import urllib2 import cookielib #聲明一個CookieJar對象實例來保存cookie cookie = cookielib.CookieJar() #利用urllib2庫的HTTPCookieProcessor對象來建立cookie處理器 handler=urllib2.HTTPCookieProcessor(cookie) #經過handler來構建opener opener = urllib2.build_opener(handler) #此處的open方法同urllib2的urlopen方法,也能夠傳入request response = opener.open('http://www.baidu.com') for item in cookie: print item.name+':'+item.value
我這裏使用的是百度的url,咱們知道百度是須要登錄的,咱們從瀏覽器獲取到的是登錄以後的cookies,而咱們這個代碼是不能實現登錄的,因此獲取的是未登錄的cookies,這兩個cookies確定是不同的,通過前面的解釋應該很容易理解,但是我真的很想知道登錄前和登錄後,經過瀏覽器和經過代碼獲取的cookies有什麼區別,因此我仍是作了這樣的嘗試,雖然這看起來並無什麼卵用session
仍是使用前面模擬登錄的綠野網站,首先我分別獲取登錄前瀏覽器和代碼獲取的cookies,固然,爲了將其餘的干擾因素減到最小,在作這一切操做以前,咱們還須要將瀏覽器本來的cookies所有刪除
函數
登錄前,瀏覽器工具
登錄前,代碼網站
PHPSESSID:7v0lru00p00trv1sdjk7mbrr90
登錄後,瀏覽器ui
登錄後,代碼(這原本是很長的,爲了方便顯示,我給他來了一個腰斬)url
<cookielib.CookieJar[<Cookie PHPSESSID=jm7n7e8qrbhc1j95mrvf5lbq03 for www.lvye.org/>, <Cookie lvyebbs=1e9bec842fcbfeca3668f75b2921d2058d0dac3e99f217be35f9da07f59032aa for www.lvye.org/>]>
咱們來分析一下這幾組數據,首先,不論是登錄前仍是登錄後,使用兩種方法獲取的兩組數據是不同的,在瀏覽器獲取的數據中,登錄前和登錄後,PHPSESSID是同樣的,可是登錄後多了一項,而使用代碼獲取的cookies中,登錄先後數據都是不同的,這是爲何呢?
這得說到session,也就是會話,只要向服務器發送請求,就能夠算是發起一次會話,會話的時間有長有短,具體的能夠上網去查一下,cookies裏面的PHPSESSID就是會話的id,咱們使用瀏覽器打開綠野網並登錄的過程當中,因爲網頁一直沒有關閉,也就是說一直保持着這一個會話,因此PHPSESSID是同一個,可是,登錄先後,cookies會變化,前面也說到,登錄後的cookies會帶有瀏覽器返回來的一個標識,因此,瀏覽器獲取到的cookies也是變化的,瀏覽器君仍是很誠實的,那麼,代碼呢?
首先第一次的代碼是使用cookielib獲取的,也就是上面的那段代碼,而第二次使用的是模擬登錄的源碼,只是將獲取到的cookies輸出出來,因此這兩次使用的代碼是徹底沒問題的,可是爲何這兩次代碼獲取的結果都沒一個同樣的呢?
代碼雖然能獲取cookies,可是卻不能保持會話,也就是說,兩次代碼總共發起了兩次會話,因此獲取的PHPSESSID並不同,可是咱們能夠看到,雖然登錄先後的值不同,可是內容,項目和瀏覽器獲取的是同樣的,說明使用cookielib獲取的cookies是可靠的
2. opener自動處理cookies
前面也說到,urlopen不具備處理cookies和驗證等功能,因此要使用opener,後面的代碼中也屢次說到opener會自動對cookies進行處理並在下一次訪問的時候自動攜帶cookies進行訪問,可是這個"自動"是怎麼回事呢?咱們來編寫代碼試試看吧
咱們就找新鮮的代碼,前面的驗證碼登錄中咱們接觸到不少的cookies,因此,咱們用這個例子來嘗試最合適不過了,咱們將這個過程當中全部的cookies都輸出來看看吧,代碼就不貼上來了,咱們直接來看結果吧
<cookielib.CookieJar[<Cookie PHPSESSID=d7g7molaicj3ckredp085km2l4 for id.ifeng.com/>]> <cookielib.CookieJar[<Cookie IF_REAL=0 for .ifeng.com/>, <Cookie IF_TIME=1450140425515 for .ifeng.com/>, <Cookie IF_USER=2027598917%40qq.com for .ifeng.com/>, <Cookie sid=45CC6C7439F91C9EDDC19C800306B899user66726221 for .ifeng.com/>, <Cookie PHPSESSID=d7g7molaicj3ckredp085km2l4 for id.ifeng.com/>]> <cookielib.CookieJar[<Cookie IF_REAL=0 for .ifeng.com/>, <Cookie IF_TIME=1450140425515 for .ifeng.com/>, <Cookie IF_USER=2027598917%40qq.com for .ifeng.com/>, <Cookie reborn=AncOJghiBSwEPgY2BzcGNFFrC2IGYwAx for .ifeng.com/>, <Cookie sid=45CC6C7439F91C9EDDC19C800306B899user66726221 for .ifeng.com/>, <Cookie PHPSESSID=d7g7molaicj3ckredp085km2l4 for id.ifeng.com/>]>
咱們看到這裏的PHPSESSID是同一個的,也就說明了在這個代碼中,因爲全部操做都是按從上到下的順序進行的,因此整個過程都保持在一個會話中,並且,三個不一樣狀態的cookies也是不同的,這也跟前面說的驗證碼的機制相吻合,整個過程當中咱們只使用一個opener,只對cookies進行一次獲取的操做,然後面卻可以輸出三個不一樣cookies,這因此也體現了opener可以對cookies進行自動處理,不須要咱們重複獲取
爲了對比咱們再來看看瀏覽器獲取的幾個cookies
登陸前
輸入驗證碼登陸後
進入個人博客
除了一些亂七八糟的數據以外,可是這些數據也是不會變的,大致上的數據是同樣的,並且登陸先後數據的變化也跟代碼裏面顯示的同樣,至於爲何會多出這麼多數據,這有多是瀏覽器的設置或者什麼的,可是,咱們能夠肯定的是,使用cookielib處理的cookies是徹底沒有問題的