Python requests. Авторизация на сайте

27 Июл 2019 , 51604

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

В качестве примера попробуем залогиниться на сайте hh.ru.

Python авторизация

Как видим нам нужно ввести Email или Телефонный номер в качестве ЛОГИНА и ПАРОЛЬ и нажать кнопку Войти в личный кабинет.

Установка библиотеки Requests

Устанавливаем библиотеку requests


pip install requests

Указываем User-Agent

Казалось бы , нам нужно просто реализовать метод post этой библиотеки , передав все необходимые данные. Но не так просто , так как нам нужно указать правильный User-Agent и вытащить из кукис файлов значение _xsrf.

User-agent ? И что за значение _xsrf ? Что ты несешь , чувак? Наверно, такие вопросы у вас возникли читая предыдущие строки.Попробую объяснить о чем речь

Попытаемся просто сделать GET запрос на сайт hh.ru и посмотреть какой ответ он возвращает.

Python авторизация

Как мы видим сервер нам возвращает ОТВЕТ 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({'Referer':url})

#Хотя , мы ранее указывали наш user-agent и запрос удачно прошел и вернул 
# нам нужный ответ, но user-agent изменился на тот , который был 
# по умолчанию. И поэтому мы обновляем его.
session.headers.update({'User-Agent':user_agent_val})

# Получаем значение _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

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги