Как авторизаваться на сайте при помощи phyton?

Здравствуйте!

Изучаю питон, и при помощи него парсю сайты для анализа. Как можно зайти на сайты которые закрыты, т.е. на них нужно указать логин и пароль?

 

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

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

 

Как видим нам нужно ввести 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. Эта задача прекрасна иллюстрирует то , с чем мы можем столкнуться на практике

Источник: https://gadjimuradov.ru/post/python-requests-avtorizaciya-na-sajte/

Вы можете задать вопрос по статье специалисту.

Выполнение аудита и документирование Вашей информационной структуры.

Помните, что все действия вы выполняете на свой страх и риск — загрузка неверных данных может повлечь за собой крах системы и потерю информации.
Тестирование в тестовой среде никто не отменяет.
Администрация сайта не несет ответственность за ваши действия.
Вся информация на сайте носит исключительно справочный характер и не является публичной офертой, определяемой в Статье 437 Гражданского кодекса Российской Федерации.