Python-сообщество
- Начало
- » Python для новичков
- » Авторизация на сайте
#1 Окт. 1, 2017 06:15:22
roggerg Зарегистрирован: 2015-03-12 Сообщения: 61 Репутация: 0 Профиль Отправить e-mail
Авторизация на сайте
Мне надо реализовать автризацию на mail.ru для парсинга почты.
Но для начала решил попробовать на сайте python.su
import requests url = 'http://python.su/account/signin/' email = 'email' password = 'password' user_data = 'email': email, 'password': password> response = requests.post(url, data=user_data)
Приходит 403 ответ. Почему не проходит авторизация?
Использую питон 3.5
Отредактировано roggerg (Окт. 1, 2017 06:16:20)
#2 Окт. 1, 2017 08:32:56
scidam Зарегистрирован: 2016-06-15 Сообщения: 288 Репутация: 35 Профиль Отправить e-mail
Авторизация на сайте
Нужно запомнить csrftoken, который передается в cookie и передать его в post запросе при авторизации.
mysession = requests.session() mysession.get(url) user_data.update('csrfmiddlewaretoken': mysession.cookies['csrftoken']>) response = mysession.post(url, data=user_data)
И, конечно, парсить почту через web-интерфейс mail.ru будет очень не просто; Поэтому, скорее всего вы бы хотели использовать общение с почтовым сервером по протоколу IMAP (есть для этого Python библиотека)…
Отредактировано scidam (Окт. 1, 2017 08:39:12)
#3 Окт. 1, 2017 20:37:27
roggerg Зарегистрирован: 2015-03-12 Сообщения: 61 Репутация: 0 Профиль Отправить e-mail
Авторизация на сайте
scidam
Нужно запомнить csrftoken, который передается в cookie и передать его в post запросе при авторизации.Попробуйте следующее:
Спасибо, с вашими рекомендациями авторизация прошла. Не могли бы вы объяснить что делает эта строчка, я понимаю что идет запрос на получение страницы но почему она не присвоена какой-нибудь переменной.
mysession.get(url)
Этот способ авторизации будет работать для всех сайтов с http?
Так а для общения с сервером про протоколу IMAP мне ведь нужно подобную авторизацию сделать? Или для этого использовать возможности библиотеки IMAP
Отредактировано roggerg (Окт. 1, 2017 21:50:44)
#4 Окт. 2, 2017 03:38:07
scidam Зарегистрирован: 2016-06-15 Сообщения: 288 Репутация: 35 Профиль Отправить e-mail
Авторизация на сайте
Строчка “mysession.get(url)” нужна, чтобы получить текущее значение csrf токена. csrf токен сохраняется в mysession.cookies, и его нам нужно отдать при отсылке формы, иначе запрос не пройдет (сайт-то работает на django и использует стандартную защиту от csrf-атак).
> Этот способ авторизации будет работать для всех сайтов с http?
Конечно нет. Сервер может иметь хитрые способы проверить кто пытается авторизоваться/зарегистрироваться робот или человек. Начиная от простой проверки заголовков запроса и/или использования javascript скриптов на странице, чтобы оценить по поведению на странице не робот ли выполняет запросы.
#5 Окт. 2, 2017 06:52:33
roggerg Зарегистрирован: 2015-03-12 Сообщения: 61 Репутация: 0 Профиль Отправить e-mail
Авторизация на сайте
scidam
Строчка “mysession.get(url)” нужна, чтобы получить текущее значение csrf токена. csrf токен сохраняется в mysession.cookies, и его нам нужно отдать при отсылке формы, иначе запрос не пройдет (сайт-то работает на django и использует стандартную защиту от csrf-атак).> Этот способ авторизации будет работать для всех сайтов с http?Конечно нет. Сервер может иметь хитрые способы проверить кто пытается авторизоваться/зарегистрироваться робот или человек. Начиная от простой проверки заголовков запроса и/или использования javascript скриптов на странице, чтобы оценить по поведению на странице не робот ли выполняет запросы.
Python requests. Авторизация на сайте
Иногда при парсинге страниц нужно получить данные , которые недоступны незарегистрированным пользователям. Для этого нужно авторизоваться на сайте. И в этой статье я покажу как с помощью замечательной библиотеки requests это реализовать.
В качестве примера попробуем залогиниться на сайте hh.ru.

Как видим нам нужно ввести Email или Телефонный номер в качестве ЛОГИНА и ПАРОЛЬ и нажать кнопку Войти в личный кабинет.
Установка библиотеки Requests
pip install requests
Указываем User-Agent
Казалось бы , нам нужно просто реализовать метод post этой библиотеки , передав все необходимые данные. Но не так просто , так как нам нужно указать правильный User-Agent и вытащить из кукис файлов значение _xsrf.
User-agent ? И что за значение _xsrf ? Что ты несешь , чувак? Наверно, такие вопросы у вас возникли читая предыдущие строки.Попробую объяснить о чем речь
Попытаемся просто сделать GET запрос на сайт hh.ru и посмотреть какой ответ он возвращает.

Как мы видим сервер нам возвращает ОТВЕТ 404 , который говорит , что нет такой страницы. Но если мы выполним запрос через браузер , то все нормально.
Такая ошибка происходит из-за того , что сервер думает , что мы робот , так по умолчанию User-Agent отправляемого запроса равен python-requests/2.22.0. Чтобы сервер нам возвращал нормальный ответ , нужно указать правильный User-Agent, который эмулирует действия пользователя.
import requests headers = < 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' >r = requests.get("https://hh.ru", headers=headers) print(r)
Объект Session
Теперь разберемся для чего нужен _xsrf . Когда мы логинимся на сайте hh.ru , то мы просто вводим логин и пароль и все. Но при этом при POST запросе на сервер кроме введенных нами значений передается и параметр _xsrf, который нужен для защиты от CSRF-атак. Так вот значение этого параметра сервер hh.ru генерирует автоматически и хранит его в кукис файлах в браузере и чтобы получить это значение , нам нужно использовать объект Session библиотеки requests.
Объект Session позволяет сохранять определенные параметры в запросах.Он также сохраняет файлы COOKIE во всех запросах.
Здесь я привожу полный текст скрипта с подробными комментариями, который осуществляет авторизаицю на сайте hh.ru.
import requests url = 'https://moscow.hh.ru/account/login' # Важно. По умолчанию requests отправляет вот такой # заголовок 'User-Agent': 'python-requests/2.22.0 , а это приводит к тому , что Nginx # отправляет 404 ответ. Поэтому нам нужно сообщить серверу, что запрос идет от браузера user_agent_val = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' # Создаем сессию и указываем ему наш user-agent session = requests.Session() r = session.get(url, headers = < 'User-Agent': user_agent_val >) # Указываем referer. Иногда , если не указать , то приводит к ошибкам. session.headers.update() #Хотя , мы ранее указывали наш user-agent и запрос удачно прошел и вернул # нам нужный ответ, но user-agent изменился на тот , который был # по умолчанию. И поэтому мы обновляем его. session.headers.update() # Получаем значение _xsrf из cookies _xsrf = session.cookies.get('_xsrf', domain=".hh.ru") # Осуществляем вход с помощью метода POST с указанием необходимых данных post_request = session.post(url, < 'backUrl': 'https://moscow.hh.ru/', 'username': 'yourlogin', 'password': 'yourpassword', '_xsrf':_xsrf, 'remember':'yes', >) #Вход успешно воспроизведен и мы сохраняем страницу в html файл with open("hh_success.html","w",encoding="utf-8") as f: f.write(post_request.text)
Заключение
В этой статье реализована практическая задача , которая осуществляет авторизацию на сайте hh.ru. Эта задача прекрасна иллюстрирует то , с чем мы можем столкнуться на практике
Обновлено(1 декабря 2020 года)
Когда писалась данная статья , то капчи(CAPTCHA) не было на сайте hh.ru и авторизация происходила успешно. Для обхода капчи нужны более сложные решения. А для авторизации на страницах , где нет капчи можно использовать вышеописанный метод. Также у меня есть статья , где рассмотрена авторизация на сайте вконтакте с помощью логина и пароля , c использованием библиотеки vk_api
Как пройти форму авторизации на сайте с помощью Python?
Я являюсь новичком в Python, и пока не очень хорошо разбираюсь в вебе. Расскажите, пожалуйста, как проходить авторизацию в такой форме с помощью Python? Я пытался отследить, какие файлы cookie передаются в момент авторизации и передать их через selenium, но получил ошибку selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain при том, что все данные cookie верны (я отслеживал их автоматически командой driver.get_cookies() ).
def authorise(): driver = webdriver.ChromiumEdge() driver.get(url) cookies = [] for cookie in cookies: driver.add_cookie(cookie)

Возможно, нужно как-то взаимодействовать с самим браузером?
Отслеживать
user481396
задан 23 июн 2022 в 18:40
user481396 user481396
1 3 3 бронзовых знака
23 июн 2022 в 19:10
Я уже читал документацию к этой функции до написания вопроса здесь, спасибо. Хотелось бы получить несколько более развернутый ответ, верна ли моя логика с файлами cookie в принципе и, если нет, то как это должно работать?
23 июн 2022 в 19:21
С cookies = <'domain': domain, 'httpOnly': True, 'name': name, 'path': '/', 'secure': True, 'value': value>результат тот же, т. к. как я уже писал, изначальный цикл дает то же) Короче говоря, в данном участке ошибки нет, все передается в соответствии с документацией, но этот метод не рабочий. Меня интересует, как реализуется прохождение подобных окон: работает ли в данном случае в принципе передача файлов cookie, и есть ли какой-либо другой способ взаимодействия с ним (как самостоятельным окном, например, или лучше пытаться через get- и post-запросы)?'domain':>
Как авторизоваться на сайте с помощью python requests?
Я наверное упускаю что-то фундаментальное. Я уже пробовал на разных сайтах — результат один и тот же — код страницы без авторизации.
Хочу авторизоваться, получить куки и работать с сайтом передавая куки.
- Вопрос задан более трёх лет назад
- 58228 просмотров
Комментировать
Решения вопроса 2

Lorem Ipsum @nobodynoone
requests.auth это компонент, который используется для авторизации по методу `Basic\Digital access authentication`, если у вас на сайте форма с авторизацией, то надо отправлять форму. Короче, учите матчасть.
session = requests.Session() session.post('http://example.com/auth/login', < 'username': 'admin', 'password': 'password', 'remember': 1, >)
