2017-02-18 10 views
4

リクエストを使用してウェブサイトにログインしようとしていて、壁に当たっているようです。アドバイスをいただければ幸いです。Pythonのリクエストを使用してログインする

ログインページがhttps://www.economist.com/user/loginで、ログインフォームの属性がaction="https://www.economist.com/user/login?destination=%2F"の場合、economist.comにログインしようとしています(理由はありません。ユーザー名とパスワードが必要です)。 Chromeデベロッパーツールを使用して

は、次のようにログイン要求のためのフォームデータは次のとおりです。

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

私のコードは、ログインページを取得し、form_idを決定するためにBeautifulSoupを使用しています。ユーザー名とパスワード、取得したform_id、およびその他の隠し変数を使用してログインにPOSTを試みます。その後、バナーは、私が実際にログインしているかどうかを判断するには、ログインまたはログアウトのリンクを持っているかどうかを確認するためにホームページをチェックするために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

関連する問題