перейти к содержанию

Получить и проанализировать HTML-код страницы входа.

Если вы когда-нибудь пытались получить данные с веб-сайта, требующего сначала входа в систему, вы знаете, что это может быть сложно. Многие сайты используют различные меры безопасности, чтобы предотвратить автоматический вход ботов. Но при наличии правильных инструментов и методов можно программно войти на большинство веб-сайтов, чтобы получить доступ к нужным вам данным.

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

Вот что мы рассмотрим:

  • Почему для многих проектов парсинга веб-страниц необходим вход в систему
  • Различные типы систем аутентификации, используемые веб-сайтами
  • Пошаговый процесс поиска и заполнения форм входа
  • Работа с CAPTCHA и другими мерами по борьбе с ботами
  • Сохранение файлов cookie для поддержания сеанса входа в систему
  • Пример кода для очистки популярных сайтов, требующих входа в систему
  • Лучшие практики безопасности и этики

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

Почему для парсинга веб-страниц необходим вход в систему

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

Чтобы получить эти закрытые данные, вашему инструменту парсинга сначала необходимо войти на сайт, как это сделал бы настоящий пользователь. Только тогда он получит те же HTML-ответы, которые получает браузер, когда пользователь войдет в систему.

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

Распространенные методы аутентификации веб-сайтов

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

Формы входа

Самый простой и распространенный метод аутентификации — форма входа, предлагающая пользователю ввести имя пользователя/адрес электронной почты и пароль. После отправки формы сервер возвращает файл cookie сеанса, который идентифицирует пользователя при будущих запросах.

Токены CSRF

В качестве меры безопасности против подделки межсайтовых запросов многие формы входа включают скрытое поле, называемое токеном CSRF. Это уникальная случайная строка, которую необходимо отправить вместе с именем пользователя и паролем. Значение токена обычно устанавливается в файле cookie и действительно только для одного сеанса.

Многоэтапный вход в систему

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

Сторонний единый вход

Вместо реализации собственной системы входа в систему многие веб-сайты позволяют вам проходить аутентификацию через стороннего поставщика удостоверений, такого как Google, Facebook, Twitter, GitHub и т. д. Это делается с использованием таких протоколов, как OAuth, OpenID или SAML. После входа в домен провайдера вы будете перенаправлены обратно на исходный сайт с токеном доступа, который служит доказательством аутентификации.

Базовая HTTP-аутентификация

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

Чтобы очистить эти различные типы защищенных страниц, нам нужен систематический способ обнаружения механизма аутентификации и создания правильных HTTP-запросов для входа в систему. Далее мы рассмотрим, как это сделать.

Поиск и отправка форм входа

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

  1. Загрузите URL-адрес страницы входа в парсер или безголовый браузер.
  2. Проанализируйте HTML, чтобы найти первый <input type="password"> поле
  3. Найдите ближайший предыдущий <input> поле, которое не скрыто – скорее всего, это поле имени пользователя или адреса электронной почты.
  4. Установите значения имени пользователя и пароля в этих двух полях ввода.
  5. Найдите <form> элемент, содержащий поле пароля
  6. Отправьте форму, нажав кнопку отправки или отправив POST-запрос на URL-адрес действия формы.
  7. Сохраните все файлы cookie, возвращенные в ответе, поскольку они часто содержат токены сеанса, которые позволяют вам войти в систему.

Вот пример кода Python, использующего библиотеки Requests и BeautifulSoup для реализации этого процесса:

import requests
from bs4 import BeautifulSoup

LOGIN_URL = ‘https://example.com/login‘ USERNAME = ‘yourusername‘ PASSWORD = ‘yourpassword‘

session = requests.Session()

login_page = session.get(LOGIN_URL) soup = BeautifulSoup(login_page.content, ‘html.parser‘)

password_input = soup.find(‘input‘, {‘type‘: ‘password‘}) username_input = password_input.find_previous_sibling(‘input‘, {‘type‘: {‘!=‘: ‘hidden‘}})

username_input[‘value‘] = USERNAME password_input[‘value‘] = PASSWORD

login_form = password_input.find_parent(‘form‘) response = session.post(login_form[‘action‘], data=login_form.form_values())

print(‘Logged in successfully:‘, response.url)

Этот скрипт загружает страницу входа, анализирует поля имени пользователя и пароля, заполняет предоставленные учетные данные и отправляет форму. Объект Session сохраняет файлы cookie во всех запросах, позволяя нам оставаться в системе для последующих загрузок страниц.

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

На некоторых страницах входа поля имени пользователя и пароля разбросаны по разным <form> элементы. В этом случае вам нужно будет собрать и объединить значения полей перед отправкой.

Обработка CAPTCHA и другие проблемы

CAPTCHA — частый камень преткновения для парсеров. Это тесты «запрос-ответ», предназначенные для предотвращения автоматической отправки форм ботами. Обычно они выглядят как изображения искаженного текста, который пользователь должен расшифровать и ввести в поле ввода.

Если вы столкнулись с CAPTCHA в форме входа, у вас есть несколько вариантов:

  1. Используйте службу решения CAPTCHA, например 2Captcha или DeathByCaptcha. Эти API используют людей для решения CAPTCHA и возврата ответа на ваш скрипт за небольшую плату.

  2. Попробуйте библиотеку OCR, например pytesseract, для автоматического обнаружения текста CAPTCHA. Это работает только с простыми CAPTCHA и не очень надежно.

  3. Посмотрите, можно ли обойти CAPTCHA, изменив заголовки запросов так, чтобы они выглядели как в реальном браузере. Это может включать установление законного User-Agent строка, создающая реалистичные шаблоны движения мыши и рандомизирующая время между запросами.

  4. В крайнем случае, вам может потребоваться вручную войти в систему через браузер и извлечь файлы cookie сеанса, а затем загрузить эти файлы cookie в свой парсер, чтобы «возобновить» аутентифицированный сеанс без повторного обнаружения CAPTCHA.

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

Сохранение файлов cookie, чтобы оставаться в системе

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

Например, используя запросы Python:

import pickle
import requests

with open(‘cookies.pkl‘, ‘wb‘) as file: pickle.dump(session.cookies, file)

with open(‘cookies.pkl‘, ‘rb‘) as file: session.cookies.update(pickle.load(file))

Имейте в виду, что срок действия файлов cookie может истечь, поэтому вам все равно придется периодически входить в систему снова, чтобы обновить их. Хорошей идеей является создание логики обработки ошибок и повторных попыток аутентификации для восстановления после сбоев.

Пример: очистка ленты Reddit при входе в систему

Давайте рассмотрим полный пример входа в Reddit через Python, чтобы очистить личный канал, публикации и сообщения пользователя. Reddit использует стандартную форму входа с токеном CSRF. Мы будем использовать библиотеки Requests и BeautifulSoup.

import requests 
from bs4 import BeautifulSoup

REDDIT_LOGIN_URL = ‘https://www.reddit.com/login‘ REDDIT_USERNAME = ‘your_username‘ REDDIT_PASSWORD = ‘your_password‘

session = requests.Session()

login_page = session.get(REDDIT_LOGIN_URL) soup = BeautifulSoup(login_page.content, ‘html.parser‘)

login_form = soup.find(‘form‘, {‘action‘: ‘/login‘}) csrf_token = login_form.find(‘input‘, {‘name‘: ‘csrf_token‘})[‘value‘] username_input = login_form.find(‘input‘, {‘name‘: ‘username‘}) password_input = login_form.find(‘input‘, {‘name‘: ‘password‘})

form_data = {
‘csrf_token‘: csrf_token, ‘username‘: REDDIT_USERNAME, ‘password‘: REDDIT_PASSWORD } response = session.post(REDDIT_LOGIN_URL, data=form_data)

if ‘reddit_session‘ in session.cookies: print(‘Logged in successfully!‘)

# Example: Fetch the user‘s feed while authenticated
feed_response = session.get(‘https://www.reddit.com/‘)     
print(‘Feed HTML:‘, feed_response.text)

else:
print(‘Login failed!‘)

Этот скрипт демонстрирует полный процесс загрузки страницы входа, извлечения токена CSRF, заполнения имени пользователя и пароля и отправки формы для аутентификации. Затем мы проверяем вход в систему, пытаясь получить личный канал пользователя, для которого требуется войти в систему.

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

Соображения этики и безопасности

При парсинге веб-сайтов, требующих аутентификации, всегда помните об условиях обслуживания сайта и директивах robots.txt. Многие вообще запрещают скрапинг. Другие допускают это с определенными ограничениями. Соблюдайте любые ограничения скорости, чтобы избежать перегрузки серверов сайта.

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

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

Дополнительные инструменты и ресурсы

Вот несколько других полезных библиотек и инструментов для программного входа на веб-сайты и очистки аутентифицированных страниц:

  • Механизировать: Библиотека Python для автоматизации взаимодействия с веб-сайтами, обработки файлов cookie и отправки форм.
  • Кукольник: Библиотека Node.js для управления автономным браузером Chrome, полезная для потоков входа в систему с большим количеством JavaScript.
  • Селен: Межъязыковой инструмент для написания сценариев веб-браузеров с мощной поддержкой аутентификации.
  • Автоматическая авторизация: Утилита JavaScript для автоматического обнаружения и заполнения форм входа.
  • логинx: Пакет Python, который управляет и хранит учетные данные веб-сайта для повторного использования в веб-сборщиках.

Благодаря знаниям и инструментам, описанным в этом руководстве, теперь вы сможете создать веб-скребок, который сможет входить на большинство сайтов для получения защищенных данных. Те же методы применимы независимо от того, используете ли вы Python, Node.js, Ruby или любой другой язык.

Я рекомендую вам попрактиковаться на реальных веб-сайтах, чтобы освоиться с процессом входа в систему. Начните с простых случаев и переходите к более сложным многостраничным последовательностям аутентификации и CAPTCHA. Со временем и опытом вы сможете освоить даже самые сложные формы входа!

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

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *