web-dev-qa-db-ja.com

pythonリクエストを使用してウェブサイトにログイン

https://www.voxbeam.com/login にリクエストを使用してデータをスクレイピングするためにログインしようとしています。私はpython初心者であり、私はほとんどチュートリアルを行い、BeautifulSoupを使って自分でWebスクレイピングを行っています。

HTMLを見る:

<form id="loginForm" action="https://www.voxbeam.com//login" method="post" autocomplete="off">

<input name="userName" id="userName" class="text auto_focus" placeholder="Username" autocomplete="off" type="text">

<input name="password" id="password" class="password" placeholder="Password" autocomplete="off" type="password">

<input id="challenge" name="challenge" value="78ed64f09c5bcf53ead08d967482bfac" type="hidden">

<input id="hash" name="hash" type="hidden">

メソッドpostを使用し、userNameおよびpassword

私はこれを試しています:

import requests
import webbrowser

url = "https://www.voxbeam.com/login"
login = {'userName': 'xxxxxxxxx',
         'password': 'yyyyyyyyy'}

print("Original URL:", url)

r = requests.post(url, data=login)

print("\nNew URL", r.url)
print("Status Code:", r.status_code)
print("History:", r.history)

print("\nRedirection:")
for i in r.history:
    print(i.status_code, i.url)

# Open r in the browser to check if I logged in
new = 2  # open in a new tab, if possible
webbrowser.open(r.url, new=new)

ログインに成功すると、ダッシュボードのURLrにアクセスできるようになるので、必要なデータのスクレイピングを開始できます。

Xxxxxxおよびyyyyyyの代わりに認証情報を使用してコードを実行すると、次の出力が表示されます。

Original URL: https://www.voxbeam.com/login

New URL https://www.voxbeam.com/login
Status Code: 200
History: []

Redirection:

Process finished with exit code 0

ブラウザにwww.voxbeam.com/loginの新しいタブが表示されます

コードに何か問題がありますか? HTMLに何か不足していますか?ダッシュボードのURLをrで取得したり、リダイレクトしてブラウザのタブでURLを開いて応答を視覚的に確認したり、別の方法で処理する必要がありますか?

私はここで数日間多くの同様の質問を読んでいますが、すべてのウェブサイト認証プロセスは少し異なっているようで、私はチェックしました http://docs.python-requests.org/en/latest/user/authentication / これは他の方法を説明していますが、postの代わりにそれらの1つを使用することを示唆するものがHTMLに見つかりませんでした

私も試しました

r = requests.get(url, auth=('xxxxxxxx', 'yyyyyyyy')) 

でもうまくいかないようです。

6
Pablo

上記のように、フォームのすべてのフィールドの値を送信する必要があります。これらは、ブラウザのWebインスペクターで見つけることができます。このフォームは、2つの追加の非表示値を送信します。

url = "https://www.voxbeam.com//login"
data = {'userName':'xxxxxxxxx','password':'yyyyyyyyy','challenge':'zzzzzzzzz','hash':''}  
# note that in email have encoded '@' like uuuuuuu%40gmail.com      

session = requests.Session()
r = session.post(url, headers=headers, data=data)

また、多くのサイトは、非表示フォームフィールド、js、エンコードされた値の送信などのボットから保護されています。

1)手動ログインからCookieを使用します:

url = "https://www.voxbeam.com"
headers = {'user-agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36"}
cookies = {'PHPSESSID':'zzzzzzzzzzzzzzz', 'loggedIn':'yes'}

s = requests.Session()
r = s.post(url, headers=headers, cookies=cookies)

2)モジュールSeleniumを使用します。

from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys

url = "https://www.voxbeam.com//login"
driver = webdriver.Firefox()
driver.get(url)

u = driver.find_element_by_name('userName')
u.send_keys('xxxxxxxxx')
p = driver.find_element_by_name('password')
p.send_keys('yyyyyyyyy')
p.send_keys(Keys.RETURN)
10
bl79

次のようにURLをより明確に指定してください。

  url=https://www.voxbeam.com//login?id=loginForm

これは、POSTメソッドが適用されるように、ログインフォームにsetFocusを設定します

2
Mohammad Jbber

Webサイトがログインプロセスを処理する方法によっては非常に注意が必要ですが、私がやったのは、プロキシアプリケーションであるCharlesを使用し、手動でログインしているときにブラウザーがWebサイトのサーバーに送信したリクエストをリッスンすることでしたその後、Charlesに表示されたものとまったく同じヘッダーとCookieを独自のpythonコードにコピーし、機能しました!Cookieとヘッダーはボットのログインを防ぐために使用されると思います。

0
Reza Hosseini