Проблемы со входом на сайт - PullRequest
2 голосов
/ 25 марта 2019

Я пытаюсь создать небольшой скрипт, который входит в веб-страницу, а затем оттуда я могу делать другие вещи.

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

Когда я пробую свой код, возвращаемый html содержит поля, заполненные пользователем / паролем, который я указал. Это как если бы кнопка «Войти» не была нажата.

Вот форма:

<form method="POST">
   <table border=1  bgcolor="#a7a7a7"  style="border-collapse:collapse;border-style:solid; border-color:#006600" >
      <tr>
         <td>
            <table  cellspacing=2 cellpadding=4>
               <tr>
                  <td align="right"  bgcolor="#b7b7b7" >your email</td>
                  <td  bgcolor="#c7c7c7" ><input name="user_email" type="text" size=30 value=""><br></td>
               </tr>
               <tr>
                  <td align="right"  bgcolor="#b7b7b7" >your password</td>
                  <td  bgcolor="#c7c7c7" ><input name="user_password" type="password" size=30><br></td>
               </tr>
               <tr>
                  <td align="center" colspan=2><input type="submit" name="do_login" value="log in"></td>
               </tr>
            </table>
         </td>
      </tr>
   </table>
   <input type="hidden" name="allhidden[0]" value="dummy">
   <input type="hidden" name="allhidden[_ga]" value="1234">
   <input type="hidden" name="allhidden[_gid]" value="1234">
   <input type="hidden" name="allhidden[gd_session]" value="eFmcHb">
   <input type="hidden" name="allhidden[grey_cookie]" value="&&&">
   <br>
</form>

Вот мой код:

s = requests.Session()

# Perform login
result = s.post(LOGIN_URL, data={
    "user_email": USERNAME, 
    "user_password": PASSWORD, 
})

# Scrape url
html = s.get(DASHBOARD_URL).content
print(html)
soup = BeautifulSoup(html, "html.parser")

Пробовал варианты кода, но знаю, что выше работает на обычных страницах. Есть ли что-то еще, что мне нужно передать или инициировать кнопку отправки?

Спасибо за любую помощь!

1 Ответ

1 голос
/ 26 марта 2019

После проверки [1] запроса вы можете увидеть, что следующие поля являются обязательными:

z: 7T2RlN
user_email: USERNAME
user_password: PASSWORD
do_login: log in
allhidden[0]: dummy

Вам нужно сначала соскрести значение z с http://greyhound -data.com / login.htm , которое является скрытым значением поля: <input type="hidden" name="z" value="7T2RlN">.

import requests
from bs4 import BeautifulSoup

with requests.Session() as s:
    r = s.get('http://greyhound-data.com/login.htm')
    soup = BeautifulSoup(r.text, 'lxml')
    z = soup.find('input', {'name': 'z'})['value']
    data = {
        'z': z,
        'user_email': USERNAME,
        'user_password': PASSWORD,
        'do_login': 'log in',
        'allhidden[0]': 'dummy',
    }
    r = s.post('http://greyhound-data.com/login.htm', data=data)
    print('You are now successfully logged in.' in r.text)
    # True

[1]: для проверки запроса:

  1. Открыть Инструменты разработчика ( Ctrl + Shift + I )
  2. Нажмите на сеть
  3. Введите данные для входаи отправьте форму
  4. Нажмите login.htm

Обновленный код:

import requests
from bs4 import BeautifulSoup

with requests.Session() as s:
    r = s.get('http://greyhound-data.com/login.htm')
    soup = BeautifulSoup(r.text, 'lxml')

    data = {
        'user_email': USERNAME,
        'user_password': PASSWORD,
        'do_login': 'log in',
    }

    for hidden_field in soup.find_all('input', type='hidden', value=True):
        data[hidden_field['name']] = hidden_field['value']

    r = s.post('http://greyhound-data.com/login.htm', data=data)
    print('You are now successfully logged in.' in r.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...