Как программно передать учетные данные для входа на сайт - PullRequest
1 голос
/ 10 января 2020

После этого ответа на аналогичный вопрос я пытаюсь очистить сайт, который предоставляет контент, который мне нужно получить сразу после входа в систему:

import requests
creds = {'username_key': 'username_value', 'pw_key': 'pw_value'}
url = 'https://mollybet.com/beta/trade'
response = requests.post(url, data=creds) 

Но я не могу узнайте на странице входа в систему html, какими должны быть значения ключей имени пользователя и пароля, и status_code, который я продолжаю получать в объекте response, равен 405 (Not Allowed).

  1. Очевидно ли из тегов в коде html, какими должны быть значения key, или я полностью не согласен с тем, как я пытаюсь решить эту проблему?

Я также попытался войти в систему с помощью selenium (chromedriver) и, опять же, не могу определить элементы поля ввода. Например, хотя этот код обнаруживает целевой элемент на странице входа в систему

from selenium import webdriver 
webdr_browser = webdriver.Chrome()
webdr_browser.get(url) 
soup = bs.BeautifulSoup(webdr_browser.page_source,'lxml')

>>> soup.find('input', class_='jss91 jss76')
<input aria-invalid="false" class="jss91 jss76" type="text" value=""/>

Но когда я пытаюсь найти элемент, чтобы щелкнуть по нему:

>>> webdr_browser.find_element_by_class_name('jss91 jss76')
Traceback (most recent call last):
...
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".jss91 jss76"}

Другие find_element_by_ методы также терпят неудачу,

Есть идеи почему?

1 Ответ

1 голос
/ 10 января 2020

Я бы предложил использовать селен, чтобы заполнить информацию для вас. Я никогда не доверял поиску по классу, если это не было действительно необходимо. Я полагаю, что они, вероятно, изменятся и не расскажут вам много о структуре. Но поскольку страница довольно проста, поиск по имени тега, кажется, делает свое дело.

from selenium import webdriver
driver = webdriver.Chrome()

driver.get('https://mollybet.com/beta/login')

# Locate input and password fields
fields = driver.find_elements_by_tag_name('input')
fields[1].send_keys('USERNAME')
fields[2].send_keys('PASSWORD')

# Click the submit button
driver.find_element_by_tag_name('button').click()

Здесь вы можете использовать selenuim или BeautifulSoup для анализа содержимого страницы в будущем.

Проблема, с которой вы столкнулись, заключалась в том, что вы пытались найти два класса одновременно. Вам нужно изменить селектор на

driver.find_element_by_class_name('jss91.jss76')

Но убедитесь, что вы обращаете внимание на элементы, потому что оба поля имени пользователя и пароля имеют одинаковые два класса.

for field in fields:
    print(field.get_attribute('class'))

# jss91 jss76
# jss91 jss76 jss94 jss79

Для этого это с запросами, я следил за трафиком c, как я отправил запрос на сайт. Похоже, что форма подчиняется https://mollybet.com/s/weblogin/. Отправленный груз был {'username': "user", 'password': "pass", 'lang': "en"}. Теоретически, следующее должно работать, но я получаю 400 ошибок. Я также попытался добавить заголовки из исходного запроса. Если учетные данные были неправильными, это должна быть ошибка 401, но, возможно, она будет работать с вашим логином.

headers = {
    'Host': 'mollybet.com',
    'Connection': 'keep-alive',
    'Content-Length': '49',
    'Origin': 'https://mollybet.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',  # noqa
    'content-type': 'application/json',
    'Accept': '*/*',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'cors',
    'Referer': 'https://mollybet.com/beta/login',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
}

response = requests.post(
    'https://mollybet.com/s/weblogin/',
    data={'username': "user", 'password': "pass", 'lang': "en"},
    headers=headers,
    verify=False)
...