2016-06-30 75 views
1

我試圖用python requests模塊執行登錄。我首先使用我的用戶名和密碼登錄到登錄頁面,以保存響應中的Cookie。之後,我嘗試進入密碼保護頁面。問題是響應頁面說我必須激活cookie才能登錄到此頁面,但我得到一個可以顯示的Cookie。 下面是代碼從登錄頁面使用Python請求執行登錄(Cookie未激活)

輸入參數:

<input type="hidden" name="security_token" value="kAvcFvod9KSrGLS1JX30+dhNI8QhmVpbqbe00zuvztE="> 
<input type="hidden" name="login_ticket" value="3781fe1e16e441e9957bec8b32aa4630"> 
<input type="hidden" name="resolution" value=""> 
<input type="hidden" name="device_pixel_ratio" value="1"> 

<input type="text" autofocus id="loginname" name="loginname" value="" size="20" maxlength="63"> 
<input type="password" id="password" name="password" size="20"> 

Python代碼:

import requests 

login = r'LOGIN_URL' 
url = 'PROTECTED_URL' 

values = {'loginname': 'USERNAME', 'password': r'PASSWORD','security_token' : r'kAvcFvod9KSrGLS1JX30+dhNI8QhmVpbqbe00zuvztE=', 'login_ticket' : r'3781fe1e16e441e9957bec8b32aa4630', 'resolution' : '', 'device_pixel_ratio' : '1'} 

session = requests.Session() 

r = session.post(login, data = values) 
print r.content 
print r.cookies 
s = session.get(url) 

(我得到的安全令牌和登錄票從另一個獲取請求之前) 因此,r.content打印o基本上說一個網頁:登錄不成功,因爲Cookies沒有激活。

但是從r.cookies輸出爲:

<RequestsCookieJar[<Cookie Seminar_Session=abbfdd4e96ee048b1b97fd027a2c7de4 for URL/>]> 

而且s.get只是返回你,如果你不登錄並試圖訪問受保護的頁面的登錄頁面。

所以我覺得一切正常,只是網頁認爲我不保存發送的cookies。我該如何解決這個問題?

編輯(解決方案):

工作,謝謝!

解決方案與BeautifulSoup:

import requests 
from bs4 import BeautifulSoup 

login = 'LOGIN_URL' 
url = 'PROTECTED_URL' 

session = requests.Session() 

l = session.get(login) 

soup = BeautifulSoup(l.content,'lxml') 

values = {'loginname': 'USERNAME', 'password': r'PASSWORD','security_token' : soup.find('input')['value'], 'login_ticket' : soup.find('input').next_sibling.next_sibling['value'], 'resolution' : '', 'device_pixel_ratio' : '1'} 

r = session.post(login, data = values) 
s = session.get(url) 

回答

1

嘗試登錄頁面的初始GETr = session.get(login)。然後檢查session.cookies - 它應該包含一個會話cookie。您還需要提取security_tokenlogin_ticket和其他字段的各種值,以便您可以將它們包含在登錄POST請求中。

關鍵問題是使用相同的會話,該會話用於獲取所有後續請求的標記。服務器可能會將會話ID與它分配的令牌關聯起來,因此您需要將它們一起保存在客戶端。通過在獲取令牌後創建新會話,就像您正在做的那樣,該關聯會丟失。

在代碼:

import requests 

login = r'LOGIN_URL' 
url = 'PROTECTED_URL' 

session = requests.Session() 

r = session.get(login) # retrieve cookie, tokens, and other stuff 

# parse the response to extract the tokens etc. (perhaps use BeautifulSoup). Store in "values". Add username and password to "values" 

r = session.post(login, data=values) # perform the login 

r = session.get(url)     # get the protected page