python-49: 爬蟲模擬登錄源碼

上一篇咱們遺留了一個問題,爲何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

相關文章
相關標籤/搜索