В предыдущем учебнике я показал вам, как вы можете использовать запросы и библиотеки BeautifulSoup для сбора данных с веб-страницы. В этой статье мы пойдем еще дальше и попытаемся получить информацию, стоящую за логином.

Кроме того, веб-приложение, которое мы собираемся использовать, требует токена CRSF, что немного усложняет нашу работу. CSRF для краткости или подделка межсайтовых запросов — это уязвимость веб-безопасности, которая позволяет злоумышленнику побуждать пользователей выполнять действия, которые они не намерены выполнять.

Сам токен CSRF представляет собой уникальный фрагмент строки, который генерируется приложением на стороне сервера и передается клиенту таким образом, что он включается в последующий HTTP-запрос, сделанный клиентом. Когда делается более поздний запрос, приложение на стороне сервера проверяет, включает ли запрос ожидаемый маркер, и отклоняет запрос, если маркер отсутствует или недействителен.

Поскольку наше приложение создано с использованием Python и веб-фреймворка Django, такой механизм безопасности уже включен. Давайте испачкаем руки.

Во-первых, мы собираемся определить несколько параметров, которые необходимы для нашей программы — URL-адрес входа, по которому мы собираемся аутентифицироваться, и URL-адрес профиля, где хранится информация, которую мы ищем.

# main.py
import requests
from bs4 import BeautifulSoup
LOGIN_URL = 'http://localhost:8000/accounts/login/'
PROFILE_URL = 'http://localhost:8000/accounts/profile'

Теперь мы собираемся создать функцию входа в систему, которая будет аутентифицироваться по URL-адресу входа и получать информацию из нашего профиля. Функция входа показана ниже.

# main.py
# Request login page to retrieve CSRF token and cookies
def login(login_url, data_url):
    r = requests.get(login_url)
    bs = BeautifulSoup(r.text, 'html.parser')
    csrf_token = bs.find('input', attrs={'name': 'csrfmiddlewaretoken'})['value']

Первая задача — сделать запрос на получение, чтобы получить csrf_token со страницы входа. Токен CSRF является обязательным параметром POST, и мы не сможем войти в систему, если у нас его нет. Чтобы получить его, мы создадим объект BS, с помощью которого мы очистим страницу, найдем рассматриваемый токен и сохраним его в переменной. После извлечения токена мы готовы создать наш словарь данных POST.

# main.py
# Build credentials
credentials = {
    'username' = 'your-username',
    'password' = 'your-password',
    'csrfmiddlewaretoken': csrf_token
}

Наш словарь учетных данных имеет три параметра: имя пользователя, пароль и токен cstf, которые мы получили ранее. После того, как мы получили эту информацию, мы готовы сделать почтовый запрос и, надеюсь, пройти аутентификацию.

# main.py
# Make a post request to login page
session.post(login_url, cookies = r.cookies, data = credentials)

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

Наша функция входа заканчивается запросом данных профиля и возвратом объекта.

# main.py
profile = session.get(data_url)
return profile

Теперь мы готовы построить нашу основную функцию.

# main.py
if __name__ == '__main__':
    profile_page = login(LOGIN_URL, PROFILE_URL)
    print (profile_page.text)

Если все прошло гладко, мы должны быть в состоянии успешно и увидеть ответ html в нашем терминале.

На этом мы завершаем эту статью. Я надеюсь, что это было информативно для вас, и я хотел бы поблагодарить вас за чтение.

Удачного скрейпинга!