python-48:直接使用POST方法登陸網站

如今在回頭去看前面寫的東西感受有些雜亂,雖然在寫以前已經大概想好要按着怎樣的思路去寫,可是在真正寫的時候發現問題愈來愈多,不懂的地方也愈來愈多,因而就不斷的上網去查解決的方法,結果又得到了不少知識,並且也很想將這些知識寫進來,因此就成了如今這個樣子,之後仍是須要經常提醒本身最初的目的是什麼
咱們來回顧一下前面講的知識,爲了實現模擬登陸,咱們先分析了大多數狀況下自動登陸的方法,因而咱們知道了 cookies,接着咱們又討論了怎麼使用瀏覽器工具找到cookies,而且編寫代碼實現了直接使用 cookies 登陸網站,爲了進一步的學習 cookies,咱們又講解了 cookielib 模塊的使用,並且知道了 cookies 有時效性,因而咱們認爲不能每一次運行代碼前都要先手動登陸,而後獲取 cookies 寫入再進行登陸,因此咱們分析了瀏覽器將用戶名密碼等信息發送出去的過程,討論了瀏覽器發送數據的兩種方式:POST 和 GET,這時我忽然冒出了一個想法,既然瀏覽器在 POST 數據以後可以自動登陸,那麼我能不能在代碼中直接模擬這個過程呢?
因而我設定了這樣的一個流程
1. 設置瀏覽器的 headers, 設置請求等
2. 使用 httpfox 工具獲取post data
3. 將post data 寫下來並進行編碼
4. 攜帶 headers 和 data 等信息進行網頁請求php

這裏仍是將獲取post data 的過程截圖出來,首先是登錄界面的網址:http://www.lvye.org/user.php
python


咱們來看看headers和post data
瀏覽器

你們能夠看到,這裏在post的後面還有一個url,這個url很重要,真的很重要,它就是的發送數據的真正網址
cookie

好了,這裏的post data 也不是不少,我打算把它所有寫下去,因而,我寫了這樣的代碼工具

#!/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':'xxxxxxxxxxx',
        '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()

而後我滿心歡喜的等待輸出結果......oop


這個頁面源碼是什麼鬼,跟咱們前面直接使用cookies獲取到的頁面源碼不同啊,爲何呢?難道咱們的程序出錯了嗎?post

其實並無,咱們的程序已經達到我咱們想要的效果,它出現了一個我已經登錄的提示,就是圖中框出來的那部分,但這又是爲何呢,並且這些字眼我好像在哪裏看到過,爲了找出這個緣由,我又去從新登錄了一次學習

咱們看到網址仍是原來的網址,可是界面倒是這樣的,並且,這裏的文字不就是跟源碼裏面的文字同樣嗎,那爲何會出現這樣的狀況呢?網站

咱們知道當你輸入用戶名密碼登錄一個網站的時候,頁面會自動跳轉到網站的主頁或者其餘的網頁,總之不會停留在登錄的界面,這在瀏覽器中很容易實現,可是在爬蟲代碼中就很難實現,由於一發生跳轉就是兩個界面,也就是兩個不一樣的url,可是在程序中不可能自動幫你跳轉,因此必需要進行兩次urlopen()操做,那我就在代碼中進行兩次urlopen()操做不行嗎?來實踐看看吧ui

因爲 data 是發送給登錄界面的數據(前面已經講解了怎麼找post data 裏面說有找對應的url的),因此咱們在打開另外一個url時不須要再攜帶data 信息了,只要在前面那段代碼的基礎上加上兩句話就能夠了

response2 = urllib2.urlopen("http://www.lvye.org/userinfo.php?uid=409557")
print response2.read()

咱們來看輸出結果

這仍是沒有返回登錄後的頁面的源碼,這是爲何呢?

這篇太長了咱們下一篇講解吧

相關文章
相關標籤/搜索