2017-02-18 99 views
4

我試圖登錄到使用請求的網站,似乎正在打牆。任何意見,將不勝感激。使用Python的請求登錄

我試圖登錄到economist.com(無理由,只是我有一個用戶名和密碼),其登錄頁面爲https://www.economist.com/user/login,其登錄表單的屬性爲action="https://www.economist.com/user/login?destination=%2F"

使用Chrome開發工具,形式爲數據登錄請求如下:

name: ///////// 
pass: //////// 
form-build-id: form-483956e97a61f73fbc0ebf06b04dbe3f 
form_id: user_login 
securelogin_original_baseurl: https://www.economist.com 
op: Log in 

我的代碼獲取登錄頁面,使用BeautifulSoup確定form_id;嘗試使用我的用戶名和密碼,檢索的form_id和其他隱藏變量登錄到登錄名;然後使用BeautifulSoup檢查網頁,看看是否旗幟有一個登錄或註銷鏈接,以確定是否我在實際登錄

的代碼如下:

import requests 
from bs4 import BeautifulSoup 

# Setting user agent to a real browser instead of requests 
headers = requests.utils.default_headers() 
headers.update(
    { 
     'User-Agent': 'Mozilla/5.0', 
    } 
) 

# create a session and login 
s = requests.Session() 
login_page = s.get('https://www.economist.com/user/login', headers=headers) 
login = BeautifulSoup(login_page.text, 'lxml') 
form = login.select_one("form > div > input") 
payload = { 
      'name' : '////////////', 
      'pass' : '////////', 
      'form_build_id' : form['value'], 
      'form_id' : 'user_login', 
      'securelogin_original_baseurl' : 'https://www.economist.com', 
      'op' : 'Log in' 
      } 
response = s.post("https://www.economist.com/user/login?destination=%2F", 
data=payload, headers=headers) 

# check homepage banner to see if login or logout link is there 
url = "https://www.economist.com/" 
r = s.get(url, headers=headers) 
soup = BeautifulSoup(r.text, 'lxml') 
banner = soup.select("div > div > span > a") 
for table_row in banner: 
    print(table_row['href']) 

運行時,該代碼顯示橫幅仍然有登錄鏈接,而不是登出鏈接,我認爲這意味着它沒有登錄。我知道我必須在這裏犯了一個非常簡單的錯誤,但在閱讀了這裏的其他類似問題之後,我似乎無法找到我要去的地方。我很感激任何關於這項工作的建議。

回答

1

我試過你的代碼,只有1件東西沒有與我一起工作。

form = login.select_one("form > div > input") 

要:

form = login.find('input', attrs={'name': "form_build_id"}) 

然後正常登錄,並確保如果我登錄與否,我得到,只有在用戶可以訪問登陸頁面。 http://www.economist.com/subscriptions/activation

,如果你可以訪問此頁面,那麼你已經登錄,否則你會被重定向到https://www.economist.com/user/register?destination=subscriptions%2Factivation&rp=activating

import requests 
from bs4 import BeautifulSoup 

# Setting user agent to a real browser instead of requests 
headers = requests.utils.default_headers() 
headers.update(
    { 
     'User-Agent': 'Mozilla/5.0', 
    } 
) 

# create a session and login 
s = requests.Session() 
login_page = s.get('https://www.economist.com/user/login', headers=headers) 
login = BeautifulSoup(login_page.text, 'lxml') 
form = login.find('input', attrs={'name': "form_build_id"})#works 

payload = { 
      'name' : '*****', 
      'pass' : '*****', 
      'form_build_id' : form['value'], 
      'form_id' : 'user_login', 
      'securelogin_original_baseurl' : 'https://www.economist.com', 
      'op' : 'Log in' 
      } 
response = s.post("https://www.economist.com/user/login?destination=%2F", 
data=payload, headers=headers) 

activation_page = s.get('http://www.economist.com/subscriptions/activation', headers=headers) 
if activation_page.url == 'https://www.economist.com/user/register?destination=subscriptions%2Factivation&rp=activating': 
    print"Failed to login" 
elif activation_page.url == 'http://www.economist.com/subscriptions/activation': 
    print"Logged In Successfully!" 
+0

感謝。這工作。我認爲我的「表格」工作正常,儘管你的表格不太易破碎。我認爲我的問題一直是一個糟糕的測試,看看我是否登錄。你的更優雅(雖然/激活重定向我/謝謝你,但前提是相同的)。 – argent656