Python requests. Авторизация на сайте
Иногда при парсинге страниц нужно получить данные , которые недоступны незарегистрированным пользователям. Для этого нужно авторизоваться на сайте. И в этой статье я покажу как с помощью замечательной библиотеки requests это реализовать.
В качестве примера попробуем залогиниться на сайте hh.ru.
Как видим нам нужно ввести Email или Телефонный номер в качестве ЛОГИНА и ПАРОЛЬ и нажать кнопку Войти в личный кабинет.
Установка библиотеки Requests
Устанавливаем библиотеку 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({'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