2017-09-06 14 views
5

ここでやっていることに感謝します。通常、私はStackoverflowの助けを借りて私の問題を把握することができますが、今回は私は立ち往生しています。うまくいけばあなたは私を助けることができる!Pythonリクエストのログインに失敗しました

質問はかなり簡単です:this webpageにログインする方法Pythonのリクエスト

マイ手順:

  1. は、ログインURL
  2. ログイン情報を提供します。 HTMLによると、私は '電子メール'と 'パスワード'を提供する必要があります。
  3. ログインが成功した場合
  4. チェックHTMLをログインするセッションと利用ポストを作成

残念ながら、簡単なアプローチは、このケースで動作するようには思えません。例えば、detailsの出力は次のようになります。ログインが成功した場合

<script> 
    dataLayer = [{ 
     'environment': 'production', 
     'loggedIn': '0', 
     'userCode': '', 
     'rank': '', 
     'totalBalance': '0', 
     'overAgeCasino': '0' 
    }]; 
</script> 

もちろん、'loggedIn''0''1'に変更する必要があります。

例では、「csrftoken」を追加する必要があり、HTMLの「隠れた」タイプであることがわかりました。ただし、type = 'hidden'部分の名前はこれと関係がないように見えますが、値もありません(link to screenshot of HTML)。 どこかに私はCSFRトークンはまたのCookieJarに保存されているが、それがないとされていることを読む:

<RequestsCookieJar[<Cookie PHPSESSID=5dib6cf6kpvf29dsn725ljcec7 for .napoleongames.be/>, <Cookie locale=en_GB for .napoleongames.be/>, <Cookie user=false for .napoleongames.be/>]> 

私はそれは難しいログインが不可能であることを信じることを見つけるが、私はアイデアを使い果たしました。誰かがurllib(2)でそれを行う方法を知っているなら、それはまた役に立ちます。私はそれを円滑に走らせることができなかったので、セレンを使いたくないです。

コード:

import requests 
    from bs4 import BeautifulSoup 
    from datetime import date 

date_str = str(date.today()) 
login_url = 'https://en-gb.sports.napoleongames.be/user/login' 
protected_url = 'proctected_url' 

payload = {'email': '[email protected]', 
      'password': '*********'} 

with requests.Session() as session: 
    session.get(login_url) 
    login_page = session.post(login_url, 
          data=payload) 

    html_body = BeautifulSoup(login_page.content, 'html.parser').find(
     name='body', attrs={'id': 'user_login'}) 
    details = html_body.findAll('script')[0] 
    page = session.get(protected_url) 

ヘッダ:フォームを送信すると

{'Date': 'Wed, 06 Sep 2017 23:45:52 GMT', 'Server': 'Apache', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'Cache-Control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Pragma': 'no-cache', 'X-Frame-Options': 'SAMEORIGIN', 'X-Cache-Page': 'MISS', 'Set-Cookie': 'locale=en_GB; Expires=Mon, 05-Mar-2018 23:45:52 GMT; Domain=.napoleongames.be; Path=/, user=false; expires=Mon, 05-Mar-2018 23:45:52 GMT; Max-Age=15552000; path=/; domain=.napoleongames.be, loyalty=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.napoleongames.be', 'Strict-Transport-Security': 'max-age=15768000', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '10840', 'Connection': 'close', 'Content-Type': 'text/html'} 
+1

残念ながら、現代のウェブサイトのフレームワークの多くは、javascriptに大きく依存しています。もちろん、要求は処理できません。あなたの作品は、定期的に現代のWebページをスクラップする必要がある場合、私は強くセレンに慣れて、それは優秀で、この種の問題を簡単に解決することを強くお勧めします。 @DanielleM。 –

+0

リクエストにはjavascriptがあります。 [Link](https://stackoverflow.com/a/38081914/7073884) –

+0

@DanielleM。いいえ、楽しかったです。私はセレンを使用するときに発生するエラーを把握する必要があります。最初に解決策がダウングレードされているパスの問題がありましたが、何かがgeckodriverに間違っていて、次に推奨ソリューションがアップグレードされていたので、リクエストに集中しました – Rob

答えて

3

は、あなたが入力する必要はありませフィールドだけフォームタグの内側に配慮他の分野に取る必要がありますアップ。この場合、ページソースの内部を見ると、ログイン時に1つ以上のフィールドが表示されます。

あなたのペイロードにすることを追加してみることができます。

payload = {'email': '[email protected]', 
      'password': '*********' 
      'buttons_app_service_user_login[buttonClicked]': 'buttons_app_service_user_login-save'} 

することが働いたり、他の問題が発生した場合なら、私に教えてください。

+0

成功しました。したがって、キーは '値'(空白)の代わりに 'id'を使用することでした。 – Rob

+0

初期のロード時に値が空です。空のユーザー名とパスワードでログインフォームを送信しようとすると、値が入力されます。 – chad

関連する問題