Browser fingerprinting для парсинга: как он работает
Browser fingerprinting — это идентификация посетителя по совокупности признаков его браузера, а не по cookie или аккаунту. Сайты используют его, чтобы узнавать вернувшихся посетителей, выявлять мошенничество и распознавать автоматизацию. Если вы парсите веб, вы с ним столкнётесь. Этот гайд объясняет, что именно измеряется, почему одно несовпадение создаёт проблемы и как вести один согласованный, добросовестный профиль для сбора публичных данных. Также он объясняет, в каких пределах настройка fingerprint вообще уместна.
Из чего состоит fingerprint
Ни одно значение по отдельности не идентифицирует браузер, но множество мелких значений вместе часто делают это. Типичные входные данные:
- User agent и client hints. Название браузера, его версия и операционная система, которые браузер сообщает.
- Геометрия экрана и окна. Размер экрана, глубина цвета, соотношение пикселей устройства и размер области просмотра.
- Язык и часовой пояс. Заголовок
Accept-Language,navigator.languagesи часовой пояс, который сообщает браузер. - Установленные шрифты. Шрифты, которые страница может определить; они различаются между операционными системами и установленным ПО.
- Вывод canvas, WebGL и аудио. Небольшие различия в том, как графический или аудиостек отрисовывает тестовое изображение или обрабатывает звук.
- Сетевые признаки. TLS-рукопожатие, настройки HTTP/2 и порядок заголовков запроса. Сервер видит их ещё до выполнения какого-либо JavaScript.
Скрипты fingerprinting объединяют эти данные в хеш или оценку. Чем больше стабильных и необычных сигналов, тем точнее идентификация.
Почему несовпадение бросается в глаза
Настоящий браузер внутренне согласован. Его операционная система соответствует его шрифтам, часовой пояс соответствует языковым настройкам, а размер экрана соответствует устройству, на котором он работает. Парсеры часто нарушают эту согласованность, даже не замечая этого:
- User agent, скопированный с десктопного браузера, отправляется с сервера, на котором не установлено ни одного шрифта.
- Немецкий заголовок
Accept-Languageна запросе, IP-адрес которого находится в другой стране, с часовым поясом, который не совпадает ни с тем, ни с другим. - Headless-окружение, которое сообщает размер окна, не используемый ни одним реальным монитором.
- Совершенно новый профиль при каждом запуске, поэтому cookie и история никогда не выглядят как у вернувшегося посетителя.
Каждое несовпадение — маленький сигнал. Вместе они могут перевести запрос из категории «обычный посетитель» в «нужно присмотреться».
Шаг 1: измерьте собственную настройку
Увидеть, что страница узнаёт о вашем клиенте, можно, загрузив тестовую страницу для fingerprint, которой вы управляете, или диагностическую страницу, которую запускаете локально. Посмотрите на значения и спросите себя, описывают ли они одну согласованную машину. Вот минимальный пример на Playwright, который выводит несколько из них:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
page = context.new_page()
page.goto("https://example.com") # замените на страницу, которой вы владеете
print(page.evaluate("""() => ({
language: navigator.language,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
platform: navigator.platform,
viewport: [innerWidth, innerHeight]
})"""))
browser.close()
Шаг 2: один профиль — одна идентичность
Самая полезная привычка — считать каждую идентичность для парсинга одним профилем. Задайте ему единый набор признаков и сохраняйте их на протяжении всего его существования:
- Одна сборка браузера, один user agent и одна операционная система.
- Локаль, язык и часовой пояс, которые соответствуют региону, откуда идёт трафик.
- Область просмотра и коэффициент масштабирования, которые соответствуют реальному экрану.
- Постоянное хранилище cookie, чтобы профиль вёл себя как вернувшийся посетитель.
Менять один из этих параметров для каждого запроса подозрительнее, чем держать их стабильными. Согласованность и делает профиль обычным.
Шаг 3: двигайте профиль, как посетитель
Fingerprinting — лишь один из входов. Сайты также следят за тем, как быстро один профиль проходит по сайту. Профиль, который открывает двести карточек товаров за минуту, — не человек, что бы ни говорил его fingerprint. Распределяйте запросы, кешируйте результаты и останавливайтесь, когда страница на это указывает. Подробнее о темпе — в чек-листе о том, как парсить без блокировок.
Шаг 4: знайте пределы
Настройка fingerprint не может сделать автоматизированный профиль похожим на человека, которого там нет. Сайты, которые полагаются на fingerprinting, обычно сочетают его с лимитами запросов, проверками аккаунтов и иногда с капчей. Когда появляется капча, нужен токен от решателя, а не очередная правка fingerprint. Живой тип капчи в Scarnox — PopularCaptcha; запрос показан в гайде по PopularCaptcha на Python. Более широкую картину того, какие виджеты существуют, дают типы капчи.
Важнее другое: обход fingerprinting — это не разрешение игнорировать правила сайта. Если владелец ограничил автоматический доступ, правильный шаг — остановиться, а не делать свой профиль менее заметным. Fingerprinting — ещё и вопрос приватности. Некоторые сайты используют его, чтобы отслеживать людей между визитами, и это ещё одна причина собирать только то, что нужно вашему проекту.
Парсите ответственно
- Прочитайте
robots.txtи условия использования, прежде чем парсить сайт. - Используйте меньше запросов и делайте их медленнее, а уже собранное кешируйте.
- Не создавайте профили, чтобы выдавать себя за реальных людей или обходить блокировку.
- Не храните персональные данные, которые вам не нужны, и обращайтесь с тем, что храните, аккуратно.
Куда двигаться дальше
Если ваша цель стоит за проверкой на уровне браузера, начните с обнаружения headless-браузера: там разобраны сигналы, специфичные для автоматизированных браузеров. Страницы, которым для показа контента нужен JavaScript, описаны в гайде парсинг сайтов на JavaScript.
Начните с пробного баланса, карта не нужна: создайте аккаунт и попробуйте поток PopularCaptcha на странице, которой вы владеете. Актуальные тарифы — на странице цен.