上一篇咱們遺留了一個問題,爲何post數據後urlopen()兩個url仍是沒能返回登錄以後的網頁源碼,爲了便於分析咱們仍是貼出上一篇的代碼php
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" ''' 使用post直接登錄 ''' import urllib import urllib2 url = "http://www.lvye.org/user.php" user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0" referer = "http://www.lvye.org/user.php" host = "www.lvye.org" headers = {'User-Agent':user_agent, 'Referer':referer, 'Host':host} # 這裏的用戶名和密碼要改爲大家本身的 data = {'uname':'xxxxxxxxxx', 'pass': 'xxxxxxxxxx', 'op': 'login', 'xoops_redirect':''} post_data = urllib.urlencode(data) request = urllib2.Request(url,headers=headers) response = urllib2.urlopen(request,post_data) print response.read() print "########################################################" response2 = urllib2.urlopen("http://www.lvye.org/userinfo.php?uid=409557") print response2.read()
這裏詳細講兩個問題python
1. 爲何一樣是 urlopen(),第一個攜帶data,而第二個卻沒有攜帶瀏覽器
前面咱們已經說了,data 是post發送的數據,而這個發送的數據是有一個規定的url的,經過httpfox能夠找的到,不是隨便向哪一個url發送都行的,因此上面那段的第一個url是登錄的網址,data數據要被髮送到這個網址,而第二個url是網站裏面的其餘網址,不須要傳入任何數據,因此不用寫data參數,可是其實你加上來也不會報錯,可是仍是不能得出你想要的結果cookie
2. 爲何上面的作法會失敗oop
首先咱們能夠肯定的是,咱們post的方法是徹底正確的,由於咱們已經從源碼中看到了現象,可是爲何咱們連續使用兩個urlopen()卻沒有成功呢,由於實際上上面的兩個urlopen()只是把兩個獨立的操做合起來而已,這跟你在兩個程序中分別打開這兩個url的效果是同樣的,無論是哪一個urlopen(),它們都只是將網址打開,發送數據,而後獲取返回的頁面源碼而已,它們並無處理任何數據的能力,好比像cookies,咱們前面也說過,由於urlopen()沒有處理cookies和http驗證的能力,因此要使用opener,這就是根本的緣由,就像水過鴨背同樣,執行完了就完了,並無對數據進行處理,仍是同樣白搭,然並卵。post
要解決這個問題只能使用cookies,先post數據到登錄的網址,而後使用cookielib獲取cookies,再使用這個cookies登錄網站中其餘的網頁。由於登錄,獲取cookies,使用cookies再次登錄這個是在同一個程序中運行的,處理器夠快的話,充其量也就是幾秒鐘的事情,因此cookies的時效性能夠不用考慮,好了,結合咱們前面講解的知識,咱們將代碼完成吧網站
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" ''' 使用post直接登錄 ''' import urllib import urllib2 import cookielib # 登錄界面的url login_url = "http://www.lvye.org/user.php" # 用戶我的界面的url user_url = "http://www.lvye.org/userinfo.php?uid=409557" # 設置瀏覽器的headers信息 user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0" referer = "http://www.lvye.org/user.php" host = "www.lvye.org" headers = {'User-Agent':user_agent, 'Referer':referer, 'Host':host} # 設置post 的數據 data = {'uname':'xxxxxxxxx', 'pass': 'xxxxxxxxxxxxxx', 'op': 'login', 'xoops_redirect':''} # 將數據編碼成url查詢字符串 post_data = urllib.urlencode(data) # 初始化一個cookieJar來處理 cookies,CookieJar 這個類是獲取cookies並保存 cookieJar = cookielib.CookieJar() # 給opener加入cookies的處理程序 handler = urllib2.HTTPCookieProcessor(cookieJar) # 構建一個opener opener = urllib2.build_opener(handler) # 構造請求 request = urllib2.Request(login_url,headers=headers) # 打開登錄界面的url,並將data post出去, login_response = opener.open(request,post_data) # 自動攜帶cookies去訪問用戶界面的url response = opener.open(user_url) print response.read()
好了,如今用咱們前面將的判斷模擬登錄是否成功的方法來驗證吧
ui