Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 10, 2018 16:22:05

Panzershracker
Зарегистрирован: 2018-08-24
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

Добрый день!
Уже месяц ломаю голову над авторизацией на одном ресурсе, не пойму почему у меня не получается.
Итак, я пробовал делать это с помощью Реквеста, но не особо получается, вроде все делаю правильно,
и данные какие нужно отправляю, но все безуспешно. Единственное как у меня получилось пройти авторизацию так это с помощью selenium webdriver, но в нем мне ,пока, еще сложнее разобраться, так что хотелось бы использовать реквестс, да и скорость с ним выше.
Скажу сразу, обковырял весь гугл, смотрел кучу видео, прочитал Web Scraping with Python изд. O'reilly, Но, она не особо мне помогла в этом вопросе.
Возможно, есть совет по какой нибудь литературе, которая придется к месту.
Вот код:

 import requests
from bs4 import BeautifulSoup as soup
# from pathlib import Path
GB = 'https://geekbrains.ru'
LOGIN_URL = 'https://geekbrains.ru/login'
CPT = 'https://geekbrains.ru/wanna_captcha'
with requests.Session() as session:
    r = session.get(GB)
    print(f'Code for {GB} is :', r.status_code)
    soup = soup(r.text, 'lxml')
    token = soup.select_one('[name="authenticity_token"]')['value'] #str class
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    r = session.post(CPT, data = {'user[email]': 'mail',
                                  'user[password]': 'pass',
                                  'authenticity_token' : token,
                                  'utf8': 'true',
                                  'user[remember_me]': '0',
                                  'user-agent': user_agent})
    cpt = session.get(CPT)
    log_url = session.get(LOGIN_URL)
    print(f'Code for {CPT} is :', cpt.status_code)
    print(f'Code for {LOGIN_URL} is :', log_url.status_code)

Все видео, так или иначе, похожи на мой скрипт, но проблема в том, что у авторов выходит, а у меня - нет!
После логина есть промежуточная страница /wanna_captcha, код ответа которой 302. В form data там содержатся пароль, логин, utf8: ✓, запомнить меня и authenticity_token. Как я понимаю, это те данные что она пересылает на целевую страницу… Через скрипт код ответа с этой страницы 404.
Короче, подскажите пожалуйста.

Code for https//ресурс is : 200
Code for https//ресурс/wanna_captcha is : 404
Code for https//ресурс/login is : 200

Отредактировано Panzershracker (Дек. 10, 2018 17:06:14)

Офлайн

#2 Дек. 10, 2018 17:19:39

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

Panzershracker
После логина есть промежуточная страница /wanna_captcha, код ответа которой 302
кхм… капча…302.. Наверное кто то хочет что бы вы подтвердили что вы не от бездушный?
ЧТо такое капча понимаете?
ЧТо такое код 302 (редирект) понимаете? Что предполагается делать в этом случае?
В этом и ответ видимо



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Дек. 10, 2018 19:05:25

Panzershracker
Зарегистрирован: 2018-08-24
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

JOHN_16

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

Офлайн

#4 Дек. 11, 2018 13:48:37

Panzershracker
Зарегистрирован: 2018-08-24
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

Видимо, после одного сомнительного ответа помощь закончилась)

Офлайн

#5 Дек. 11, 2018 16:16:22

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

Panzershracker
ну ладно вам..
вот вы на страницу /wanna_captcha переходили? Мне просто не понятно насколько вы хорошо понимаете то что делаете.
P.S. если вы пишите бота как именно вы собрались капчу обходить?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Дек. 11, 2018 16:57:58

Panzershracker
Зарегистрирован: 2018-08-24
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

JOHN_16
Panzershrackerну ладно вам..вот вы на страницу /wanna_captcha переходили? Мне просто не понятно насколько вы хорошо понимаете то что делаете.P.S. если вы пишите бота как именно вы собрались капчу обходить?

Ну начну поэтапно…
- что я делаю - понимаю не до конца, тк я новичок.
- на капчу заходил (там сообщение, что такой страницы нет и веселая картинка), скрин приложу.
- ну вроде как это не совсем бот, пока пытаюсь просто авторизоваться методами реквеста, а дальше будет видно. Будем решать преблемы по мере возникновения

По поводу моего видения - это паттерн post/redirect/get, о нем я чисто случайно прочел вчера, и он очень походит на мою ситуацию. Заключается в недопущении повторной отправки формы (как то так), то есть, как я понимаю, сначала должен идти post потом get…как то так. И вот, этот метод, просто подразумевает редирект с кодом 302/303, который я собственно и получаю, и, как мне кажется, капчей там особо и не пахнет, просто я не до конца понимаю что делаю.
==============
Вру! вне авторизации страница выдает код 404. 302 выдает только при редиректе (почему? связано с куки, токеном, заголовками? с чем?)

Прикреплённый файлы:
attachment 404.jpg (156,7 KБ)

Офлайн

#7 Дек. 12, 2018 10:11:40

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Дек. 12, 2018 21:10:06

aiscy
Зарегистрирован: 2015-06-17
Сообщения: 52
Репутация: +  9  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

 import requests
from bs4 import BeautifulSoup as soup
from urllib.parse import urljoin
with requests.Session() as session:
    session.headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    session.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0'
    resp = session.get('https://geekbrains.ru/login')
    auth_token = soup(resp.text, 'lxml').select_one('input[name="authenticity_token"]')['value']
    resp = session.post(
        'https://geekbrains.ru/wanna_captcha',
        data={
            'user[email]': '',
            'user[password]': '',
            'user[remember_me]': 0,
            'authenticity_token': auth_token,
            'utf8': '✓'
        }
    )
    url_user_profile = soup(resp.text, 'lxml').select_one('li.gb-top-menu__item.dropdown > a')['href']
    resp = session.get(urljoin('https://geekbrains.ru', url_user_profile))
    user_name = soup(resp.text, 'lxml').select_one('div.user-info > div > span').text
    print('Logged as', user_name)

Офлайн

#9 Дек. 13, 2018 17:30:53

Panzershracker
Зарегистрирован: 2018-08-24
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Авторизация с помощью Requests

JOHN_16
ну нет, не повторная отправка формы, а подтверждения чт овы человек, для предотвращения программного захода.Вообще стандартный алгоритм такойзаходите на страницу авторизации, посылаете POST (обычно) запрос с данными формы.В ответе вам приходит какой нибудь либо все ок и перенаправление на страницу уже в статусе атворизированого пользователя, либо хотим капчу и перенаправление на страницу с капчей.На странице с капчей форма поля которой (включая скрытые) отправляются POST запросом и уже по этому результату либ все ок и перенаправление на страницу либо не ок.КОнкретная реализация этого алгоритма, как вы можете догадаться, различается от сайта к сайту.

Ясно, что ничего не ясно)

aiscy
ОДНАКО!!! Спасибо!
Кстати, есть какая либо рекомендация по тому, какие заголовки указывать? их там тьма, не знал что выбрать… Может есть какие-то боле-менее общие рекомендации?

Ребят, а есть рекомендация по литературе какой-нибудь чтоб лучше в теме разбираться? Готовый код - это конечно супер, но понимание важнее.
Заранее благодарен!

Отредактировано Panzershracker (Дек. 13, 2018 17:44:37)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version