it-roy-ru.com

Вход на сайт с использованием запросов Python

Я пытаюсь войти в https://www.voxbeam.com/login используя запросы для очистки данных. Я новичок в Python, и я делал в основном учебные пособия, а также самостоятельно разбираюсь в Интернете с BeautifulSoup.

Глядя на 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)

Я ожидаю, что после успешного входа в систему введите r URL-адрес панели мониторинга, чтобы я мог начать собирать нужные мне данные.

Когда я запускаю код с информацией аутентификации вместо 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/ который описывает другие методы, но я не нашел в HTML ничего, что указывало бы на то, что мне следует использовать один из них вместо post

Я тоже пробовал

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

но, похоже, это тоже не работает.

5
Pablo

Как сказано выше, вы должны отправить значения всех полей формы. Это можно найти в веб-браузере браузера. Эта форма отправляет 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) Используйте куки от ручного входа:

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)
8
bl79

Попробуйте указать URL более четко следующим образом:

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

Это установит Focus в форме входа в систему, чтобы применялся метод POST

1
Mohammad Jbber

Это очень сложно, в зависимости от того, как веб-сайт обрабатывает процесс входа в систему, но я использовал то, что я использовал Charles, который является прокси-приложением, и слушал запросы, которые мой браузер отправлял на сервер веб-сайта, когда я входил в систему вручную. После этого я скопировал точно такой же заголовок и cookie, которые были показаны в Чарльзе, в мой собственный код на python, и это сработало! Я предполагаю, что cookie и заголовок используются для предотвращения входа ботов. 

0
Reza Hosseini