2013-05-10 105 views
0

我無法發送POST數據以使用Python中的請求庫訪問我的帳戶。將所得soup是相同的,如果沒有POST已發送這是我已被使用的代碼和在其他網站上工作:使用Python中的請求庫發送POST數據

def get_data(final_url): 
    payload = {'session[email]':'[email protected]','session[password]':'mypwd','session[remember_me]':'0','commit':'Sign in'} 
    with requests.session() as ses: 
     log_soup = BeautifulSoup(ses.get('https://www.login-page.com/login').text) 
     payload['utf8'] = log_soup.findAll('input',attrs={'name':'utf8'})[0].get('value') 
     payload['authenticity_token'] = log_soup.findAll('input',attrs={'name':'authenticity_token'})[0].get('value') 
     ses.post('https://www.login-page.com/login',data=payload) 
     req = ses.get(final_url) 

     soup = BeautifulSoup(req.text) 

    return soup 


<form accept-charset="UTF-8" action="/sign_in" class="main_form" id="new_session" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;"/><input name="authenticity_token" type="hidden" value="l5+2s90FtEUsS3GHlr2tAktcxSW8jqgXx3mXEwIlAzE="/></div><div class="error_message"> 
</div> 
<dl> 
<dt><label for="session_email">Email</label></dt> 
<dd> 
<div class="input_border"><input autofocus="autofocus" class="text required email" id="session_email" name="session[email]" placeholder="Email" size="30" type="email"/></div> 
</dd> 
</dl> 
<dl> 
<dt><label for="session_password">Password</label></dt> 
<dd> 
<div class="input_border"><input class="text required" id="session_password" name="session[password]" placeholder="Password" size="30" type="password"/></div> 
</dd> 
</dl> 
<div class="checkbox_field"><input name="session[remember_me]" type="hidden" value="0"/><input id="session_remember_me" name="session[remember_me]" type="checkbox" value="1"/><label for="session_remember_me">Remember me</label></div> 
<table class="buttons"> 
<tr> 
<td><input class="button public" data-disable-with="Please wait..." name="commit" type="submit" value="Sign in"/></td> 
<td class="forgot_password"><a href="/passwords/new">Forgot your password?</a></td> 
</tr> 
</table> 
</form> 

後手動記錄中得到的POST數據如下:

utf8:✓ 
authenticity_token:l5+2s90FtEUsS3GHlr2tAktcxSW8jqgXx3mXEwIlAzE= 
session[email]:[email protected] 
session[password]:mypwd 
session[remember_me]:0 

非常感謝您的幫助!

+0

請問您的登錄頁面想到JSON編碼的數據,或形式編碼?難道它只是不能解析你發佈的數據? – 2013-05-10 18:42:09

+0

是的,我認爲它確實,但是,我添加了'json.dumps(payload)'作爲我的數據發送,但仍然沒有提交表單。 – Matt 2013-05-10 18:50:37

+1

手動記錄的POST數據 - 你從哪裏得到的?你有可能用wireshark運行相同的請求嗎?它看起來就像正在調用'requests'一樣,所以很容易確定它是否在客戶端或服務器端 – 2013-05-10 18:54:52

回答

2

您使用的是什麼版本的請求?如果它介於0.14.x和1.2.0之間,則必須升級到1.2.0。會話中的Cookies不會在重定向時正確設置,1.2.0修復了此問題。

另一個問題是,您應該檢查ses.post(url, data=payload)的響應。你一定要檢查你是否收到了正確的狀態代碼(在這種情況下,因爲你期望重定向)沿301或302行。

假設所有上述檢查,您的網站可能會做一些時髦的User-Agent分析,你可能還需要檢查與瀏覽器的用戶代理字符串,如

ses.headers['User-Agent'] = '...' 
response = ses.post(url, data=payload) 
final_response = ses.get(final_url) 
+0

+1讓我意識到我的版本已經過時併爲我的未來節省了很多的痛苦。我也通過了你所建議的標題,但沒有明顯的效果。我收到的狀態碼是200而不是301或302,所以我假設我沒有按照我應該傳遞POST數據。 – Matt 2013-05-11 12:23:07

+0

@Matt然後檢查響應的歷史也爲重定向。此外,您可以執行以下操作:'ses.post(url,data = payload,allow_redirects = False)'這會給你重定向響應並告訴你你應該被重定向到哪裏。它也可以防止服務器在您確定您正在刮取該網站時將您的Cookie過期。 – 2013-05-11 13:30:13

+1

感謝您設置正確的道路!你一直很有幫助! – Matt 2013-05-12 11:30:32