2014-10-22 110 views
0

我讀到RHE請求lib和嘗試登錄到這個網站:這段代碼www.hvr.co.il:試圖與蟒蛇請求網站登錄,參數丟失

import requests 
with requests.Session() as c: 
    url = 'https://www.hvr.co.il' 
    MY_TZ= 'XXX' 
    MY_PASS='XXX' 
    c.get(url) 
    login_data = dict(tz=MY_TZ, password=MY_PASS) 
    c.post(url, data=login_data, headers={"Referer":"http://www.hvr.co.il"}) 
    page = c.get('http://www.hvr.co.il/cart.aspx') 

我可以看到有另一個patameter,名稱CN,但它是一個隨機值,我不能預測.. 任何想法如何通過它?

+0

我讀快速並提交我的回答之前閱讀只是你的代碼。每次頁面加載時,隱藏的name =「cn」的輸入元素可能會隨機生成,您無法預測它。這纔是重點!我想這是一種CSRF保護。否則,如果該頁面提供某種API,則應按照以下答案進行操作。這是使用'requests'提供用戶名和密碼的方式。 – cezar 2014-10-22 12:14:40

+0

我以爲這個東西有這個參數..但我還是不明白,我該如何通過它? – SomeNiceGuy21 2014-10-22 12:24:20

+0

您無法通過發送帶有請求的表單來傳遞它。你不知道它的價值,你無法猜測或預測它。這就是它在那裏的存在點。它應該保護頁面並只允許在頁面上發送表單。 – cezar 2014-10-22 12:30:06

回答

-1

您試圖將數據作爲字典傳遞到日誌中,但您應該使用requests中的認證類。嘗試是這樣的:

# after import requests 
from requests.auth import HTTPBasicAuth 

# your code 
login_data = HTTPBasicAuth(MY_TZ, MY_PASS) 
c.post(url, auth=login_data, headers={"Referer":"http://www.hvr.co.il"}) 
# your code 

我假設您嘗試訪問的網頁使用基本身份驗證。最終你需要導入另一個認證類。

編輯:

在上面的代碼中有一個錯誤。這裏是更正:

c.get(url, auth=login_data, headers={"Referer":"http://www.hvr.co.il"}) 

發送表單需要發佈。在我們的例子中,我們通過請求認證類來提供憑證,所以請求方法應該被獲取。

+0

仍然無法正常工作..我錯過了什麼? – SomeNiceGuy21 2014-10-22 12:16:12

+0

很難猜測。我從這裏看不到它:) – cezar 2014-10-22 12:17:58

+0

任何想法我還能做什麼?我試着用機械化,但仍然沒有好.. – SomeNiceGuy21 2014-10-22 12:21:06

0

您不需要預測cn的值 - 當您執行初始GET時,它會提供給您。您需要解析返回的HTML表單以獲取值cn(以及任何其他具有動態值的隱藏字段(如果有)。然後,當您嘗試登錄時,您需要將相同的值發回。

你可以使用BeautifulSoup解析HTML:

import requests 
from bs4 import BeautifulSoup 

s = requests.session() 
r = s.get('https://www.hvr.co.il') 
soup = BeautifulSoup(r.content) 

data = {t['name']:t.get('value') for t in soup.find_all('input', attrs={'type': 'hidden'})} 
data.update({'tz': MY_TZ, 'password': MY_PASS}) 

r = s.post('https://www.hvr.co.il/signin.aspx', data=data) 

或者,你可能會發現它更容易使用mechanize

import mechanize 
br = mechanize.Browser() 
r = br.open('https://www.hvr.co.il') 
br.form = list(br.forms())[0] # select the first form 
br.form['tz'] = MY_TZ 
br.form['password'] = MY_PASS 
r = br.submit() 
# you should now be logged in if your credentials are right 
+0

這一行:'r = s.get('https://www.hvr.co.il')'將返回'。 – cezar 2014-10-22 13:33:16

+0

實際上我得到200,但在行湯= BeautifulSoup(r.content)我得到:TypeError:'模塊'對象不可調用 – SomeNiceGuy21 2014-10-22 14:53:36

+0

@cezar:奇怪,我總是得到響應代碼200.也許有一些間歇性問題與遠程服務器。 – mhawke 2014-10-22 15:00:23