Время прочтения: 5мин.

Прямой запрос “get” из библиотеки “requests” – это то, с чего начинал каждый, кто пытался разобрать веб-сайт на Python. Запрос “get” выдает HTML-код страницы, которую можно разобрать.

Иногда доступ к данным возможен только после авторизации ресурса. Я продемонстрирую, как присоединиться к сети “запросов”.

Разбор данных и отсутствие блокировки учетных записей являются опциями для сессий. Сайты, которые разгружены, будут создавать сессии и страницы только один раз.

Возьмем сайт https://ivi.ru/ и попытаемся залогиниться.

Как парсером авторизироваться на сайте? — Хабр Q&A

Для авторизации необходимы пароль и адрес электронной почты. Метод “POST” библиотеки requests – это способ отправки данных на сервер. “requests.post(url, headers)” означает отправку запроса, где “url” – ссылка на ресурс, а “headers” – данные и заголовки запроса.

Импорт, разрешение и начальные параметры

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

pip install requests

Сначала мы должны выяснить источник данных “headers” и “data”. Начнем с запуска инструмента разработчика. Обновите страницу, выбрав вкладку NETWORK. Здесь отображается вся активность сети.

Как парсером авторизироваться на сайте? — Хабр Q&A

Мы заходим на страницу профиля с главной страницы сайта. Нажимаем кнопку LOG IN после ввода информации для входа и открытия формы авторизации. Находим нашу ссылку.

Добавьте поле “Метод” в сопоставление полей, затем отсортируйте столбец, чтобы найти нужную строку. Информация, полученная из запросов “POST”, отправляется для авторизации.

Ищите строку V5/

Как парсером авторизироваться на сайте? — Хабр Q&A

Посмотрите на эту строку, если вы видите это сообщение.

Как парсером авторизироваться на сайте? — Хабр Q&A

На вкладке “Общие” под вкладкой “Заголовки” мы вводим URL; нас интересует только поле “User-Agent”, которое мы создаем самостоятельно.

import requests
url = 'https://api.ivi.ru/mobileapi/user/login/ivi/v5/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
data = {
    'email': '[email protected]',
    'password': 'testTEST123',
    'device': 'OS X Chrome v.89.0.4389.90 3a7a0',
    'app_version': '870'
}

Создайте сессию, чтобы мы могли сотрудничать, сохраняя соединение с сайтом.

session = requests.Session()
session.headers.update(headers)
response =  session.post(url, data=data)

Смотрите статус ответа

response
<Response [200]>

Код ответа 200 означает успешный ответ от сервера.

Посмотрим, что ответил наш клиент

response.json()
{'result': {'id': 1852143028,
  'gender': 0,
  'birthday': None,
  'session': 'ea85a1001852143028_1634027028-388944532m_RoMwwuIDe_NMcbmefXmw',
  'expiration': '2021-10-12T08:23:48Z',
  'firstname': None,
  'lastname': None,
  'subscribed': True,
  'origin_app_version': 870,
  'actual_app_version': 870,
  'payment_credentials': {},
  'email': '[email protected]',
  'email_real': 1,
  'msisdn': '',
  'confirmed': 1,
  'storageless': False,
  'is_debug': False,
  'children': [],
  'basic': '0.0000',
  'bonus': '0.0000'}}

Компоненты строки “session” отображают номер сессии. Вы увидите, что мы не могли изменить данные без установления сеанса.

Попробуем изменить информацию профиля. Измените имя, нажав кнопку редактирования.

Как парсером авторизироваться на сайте? — Хабр Q&A

Найдите строку в инструменте разработчика. Запрос “POST” на изменение пойдет первым, если вы нажмете сохранить, чтобы остановить загрузку страницы, а новая версия информации будет установлена только после этого.

Как парсером авторизироваться на сайте? — Хабр Q&A

Скопируйте “данные” и напишите “url”. Для этого обратите пристальное внимание на слово “session”, где необходимо передать номер сессии. Ответ сервера используется для определения номера сервера.

url_change_nick = 'https://api.ivi.ru/mobileapi/user/info/v5/'
session_id = response.json()['result']['session']
data = {
'nick': 'test-test',
'kind': 'adult',
'lang': 'ru',
'tz': ' 03:00',
'app_version': '870',
'session': session_id
}
response =  session.post(url_change_nick, data=data)

Мы перезагружаем страницу браузера для проверки работоспособности нашего кода.

Как парсером авторизироваться на сайте? — Хабр Q&A

Наш код сработал.

W INDOWS составляет отчеты, используя данные бухгалтерского учета.

Для получения пароля входа в учетную запись Windows иногда требуется ввести пароль. Для этого используйте библиотеку “requests-negotiate”. Когда вы часто меняете пароль для своей учетной записи, это очень полезно.

Устанавливаем и импортируем библиотеку, нам нужен метод «HttpNegotiateAuth»

pip install requests_negotiate_sspi
from requests_negotiate_sspi import HttpNegotiateAuth

Все, что мы делали ранее, активируется: мы пишем “заголовки”, заполняем данные и входим в сессию. Давайте попробуем определить время и дату сервера.

Для начала запросим данные авторизации.

xml_request = '''<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetServerDateTime xmlns="http://Server/" />
  </soap:Body>
</soap:Envelope>'''

headers = {
    'Host': host_name,
    'Content-Type': 'text/xml; charset=utf-8',
    'Content-Length': str(len(xml_request))
}

session.headers = headers
response = session.post('http://'   host_name   '/ServerService.asmx?WSDL', data=xml_request)
response
<Response [401]>

Посмотрите текст ответа

response.text
<title>401 - Unauthorized: Access is denied due to invalid credentials.</title>

Как видите, когда мы попытались войти в систему, отобразилась ошибка входа.

Используйте следующую команду для повторной отправки запроса с помощью “HttpNegotiateAuth”:

response = session.post('http://'   host_name   '/ServerService.asmx?WSDL', auth=HttpNegotiateAuth(), data=xml_request)
response.text
<curDateTime>44298.576980902777</curDateTime>

Ответ получен успешно.

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