PerimeterX (теперь HUMAN Security) — одна из самых сложных антибот-систем на рынке, ориентированная в первую очередь на поведенческие сигналы. В отличие от Akamai Bot Manager, который сильнее опирается на TLS-фингерпринт и сигнатуры HTTP-заголовков, PerimeterX делает ставку на анализ того, как пользователь взаимодействует со страницей: движения мыши, тайминги ввода, скроллинг, фокус/блюр. Для инженеров скрапинга это означает, что простая подмена IP и User-Agent уже недостаточна — нужно воспроизводить реалистичный браузерный контекст целиком. Эта статья разбирает архитектуру PerimeterX, конкретные сигналы детекции, отличия от DataDome/Akamai, и показывает, как легитимно обходить PerimeterX через резидентные прокси ProxyHat в связке с Playwright stealth и правильным pacing.
PerimeterX (HUMAN): обзор и почему это важно для прокси-пользователей
PerimeterX был приобретён HUMAN Security в 2022 году и сейчас продаётся как часть платформы HUMAN Bot Defense. По данным пресс-релиза HUMAN, объединённая платформа защищает более 200 крупных брендов. PerimeterX особенно популярен на сайтах авиакомпаний (United, American Airlines, Delta), в премиальном US e-commerce (Neiman Marcus, Saks Fifth Avenue) и на ряде ticketing-платформ. Для скрапинга цен, наличия билетов или SERP-данных это означает, что встреча с PerimeterX — вопрос времени.
Ключевое отличие PerimeterX от DataDome и Akamai — упор на поведенческий анализ. DataDome сильнее использует IP-репутацию и сигнатуры заголовков; Akamai — sensor_data и TLS-фингерпринт. PerimeterX же собирает поток событий ввода/навигации и прогоняет их через ML-модель, которая оценивает «гуманность» сессии. Поэтому даже с идеальным IP-адресом и чистым браузером автоматизация, которая не двигает курсор и не делает случайных пауз, получит блок уже на 2–5 запросе.
Поток JS-челленджа и cookies _px3 / _pxhd
Когда браузер впервые заходит на защищённый PerimeterX сайт, сервер возвращает страницу с встроенным скриптом px.js (или pxCaptcha.js). Скрипт:
- Собирает фингерпринт устройства: Canvas, WebGL renderer, screen metrics, шрифты, плагины, navigator properties.
- Генерирует payload, шифрует его (AES + собственная обфускация) и отправляет POST-запросом на
/*.pxэндпоинт. - Получает в ответ cookies
_px,_px3,_pxhd,_px2,_pxde. - При подозрительной сессии редиректит на
/px/captcha— визуальную или невидимую капчу.
_px3 — основной сессионный cookie, содержит зашифрованный payload с фингерпринтом и риск-скорингом. _pxhd — идентификатор устройства, сохраняется надолго и используется для корреляции между визитами. _px — короткий идентификатор запроса. Если _px3 истекает или невалиден, PerimeterX перевыпускает его через повторный JS-челлендж — это и есть точка, где большинство наивных скраперов ломаются, потому что они не выполняют JS.
Сигналы детекции PerimeterX — конкретика
1. Device fingerprinting: Canvas, WebGL, screen
PerimeterX собирает Canvas-фингерпринт, рендеря скрытый текст с заданным шрифтом и измеряя итоговое изображение. WebGL-фингерпринт включает vendor, renderer (ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0)), расширения и параметры. Screen metrics: screen.width, screen.height, devicePixelRatio, availWidth. Если у вас navigator.webdriver === true или window.chrome отсутствует в headless Chrome — это мгновенный флаг.
Конкретные JS-сигналы, которые PerimeterX проверяет:
navigator.webdriver— должен бытьfalseили undefined.navigator.plugins.length— в реальном Chrome 3–5 плагинов (PDF Viewer, Chrome PDF Viewer).navigator.languages— массив вроде["en-US", "en"], не пустой.window.chrome— объект сruntimeв полноценном Chrome.Notification.permission— должно соответствовать реальному состоянию.- Canvas-хэш — должен совпадать с реальным рендером, не константой.
2. TLS / JA3 / JA4 фингерпринт
PerimeterX использует JA3/JA4 для проверки, что TLS-клиент соответствует заявленному User-Agent. Если вы шлёте UA Chrome 120, но JA3 соответствует Python requests или curl — это мгновенный блок. Реальный Chrome 120 на Windows имеет характерный порядок cipher suites: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 для TLS 1.3 и специфичный набор для TLS 1.2. Подробнее о JA3 — в статье Salesforce Engineering.
Решение — использовать реальный браузер (Playwright/Puppeteer с headed Chrome), а не HTTP-клиент. Тогда JA3 будет соответствовать настоящему Chrome автоматически.
3. IP reputation
PerimeterX сверяет IP с базами datacenter-диапазонов (AWS, GCP, Azure, DigitalOcean, OVH), ASN-репутацией и списками известных прокси-провайдеров. Datacenter-IP блокируется с высокой вероятностью ещё до JS-челленджа. Резидентные IP от Tier-1 ISP (Comcast, AT&T, Verizon) проходят IP-проверку, но если поведение нечеловеческое — блок всё равно прилетит. Поэтому IP — необходимое, но не достаточное условие.
4. Поведенческий анализ — главная сила PerimeterX
PerimeterX собирает события: mousemove, mousedown, mouseup, keydown, keyup, scroll, focus, blur, touchstart. Эти события отправляются в /*.px эндпоинт пакетами. ML-модель оценивает:
- Распределение интервалов между событиями — у людей оно логнормальное, у ботов — равномерное или слишком быстрое.
- Траектории мыши — у людей кривые с микроджиттером, у ботов — прямые линии или идеальные кривые Безье.
- Тайминги между загрузкой страницы и первым взаимодействием — 0ms = бот.
- Соотношение событий — если только
mousemoveбезscrollиfocus, подозрительно.
Именно поэтому PerimeterX труднее обойти, чем DataDome: DataDode чаще блокирует на уровне IP/заголовков, а PerimeterX ждёт, пока вы «поиграете» с страницей, и блокирует после анализа поведения.
PerimeterX vs DataDome vs Akamai — сравнение
| Свойство | PerimeterX (HUMAN) | DataDome | Akamai Bot Manager |
|---|---|---|---|
| Основной сигнал | Поведение (mouse/timing) | IP-репутация + заголовки | sensor_data + TLS |
| Cookie | _px3, _pxhd | datadome | _abck, bm_sz |
| JS-челлендж | Сложный, поведенческий | Средний | Очень сложный (sensor_data) |
| Реакция на datacenter IP | Жёсткая блокировка | Жёсткая блокировка | Блокировка |
| Реакция на резидентный IP + плохое поведение | Блок через 2–5 запросов | Может пропустить | Блок |
| Капча | PerimeterX PX-Captcha | DataDome CAPTCHA | Akamai CAPTCHA |
| Сложность обхода | Высокая (нужен реальный браузер + pacing) | Средняя (достаточно резидентных IP + заголовков) | Очень высокая |
Легитимный обход PerimeterX — практическая реализация
Важно: «обход» здесь означает корректное взаимодействие с сайтом в рамках его Terms of Service и применимого законодательства. Если сайт запрещает автоматический доступ в robots.txt или ToS — не скрейпите. Если разрешает (например, публичные цены для сравнения) — используйте нижеописанный подход.
Архитектура решения
- Резидентные прокси от ProxyHat — для IP-репутации Tier-1 ISP.
- Playwright с stealth-плагином — реальный Chrome, не headless по умолчанию.
- Реалистичный браузерный контекст — UA, viewport, languages, timezone, geolocation.
- Pacing — случайные задержки, движения мыши, скроллинг.
- Sticky-сессии — один IP на всю сессию, чтобы _pxhd не перевыпускался.
Шаг 1: Подключение через ProxyHat
Используем резидентные прокси с geo-targeting на US (для авиакомпаний) и sticky-сессией, чтобы один IP держался 10–30 минут:
# HTTP-прокси с US geo и sticky-сессией
HTTP_PROXY="http://user-country-US-session-flight001:pass@gate.proxyhat.com:8080"
# SOCKS5 (если нужен UDP или специфичный стек)
SOCKS5_PROXY="socks5://user-country-US-session-flight001:pass@gate.proxyhat.com:1080"
# Проверка
curl -x "$HTTP_PROXY" https://api.ipify.org
Шаг 2: Playwright + stealth + реалистичный контекст
from playwright.async_api import async_playwright
import asyncio, random, math
PROXY = "http://user-country-US-session-flight001:pass@gate.proxyhat.com:8080"
async def human_mouse_move(page):
# Логнормальное распределение интервалов, как у людей
for _ in range(random.randint(3, 8)):
x = random.gauss(400, 150)
y = random.gauss(300, 100)
await page.mouse.move(x, y, steps=random.randint(5, 15))
await asyncio.sleep(random.lognormvariate(-2, 0.5)) # ~50-200ms
async def scrape_with_px():
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
proxy={"server": PROXY},
args=[
"--disable-blink-features=AutomationControlled",
"--no-sandbox",
],
)
context = await browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York",
extra_http_headers={
"Accept-Language": "en-US,en;q=0.9",
"Sec-Ch-Ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
},
)
# Убираем navigator.webdriver
await context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
window.chrome = { runtime: {} };
""")
page = await context.new_page()
await page.goto("https://www.united.com/", wait_until="networkidle")
await human_mouse_move(page)
await asyncio.sleep(random.uniform(1.5, 3.0))
await page.mouse.wheel(0, random.randint(100, 400))
await asyncio.sleep(random.uniform(0.5, 1.5))
# ... дальнейшая навигация и сбор данных
await browser.close()
asyncio.run(scrape_with_px())
Шаг 3: Pacing и поведенческий профиль
Ключевая ошибка — слишком быстрая навигация. PerimeterX ждёт 500–2000ms между загрузкой страницы и первым mousemove. Если вы переходите по ссылкам без задержек — блок. Рекомендуемые параметры:
- Задержка перед первым взаимодействием: 1.5–4.0 секунды.
- Интервалы между кликами: 800–2500ms с логнормальным распределением.
- Скроллинг: 2–5 событий за раз, с паузами 200–600ms.
- Минимум 5–10
mousemoveсобытий на страницу. - Случайные
focus/blurна полях ввода.
Шаг 4: Node.js + Playwright (альтернатива)
const { chromium } = require('playwright');
const PROXY = 'http://user-country-US-session-flight002:pass@gate.proxyhat.com:8080';
(async () => {
const browser = await chromium.launch({
headless: false,
proxy: { server: PROXY },
args: ['--disable-blink-features=AutomationControlled'],
});
const ctx = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
+ '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
viewport: { width: 1920, height: 1080 },
locale: 'en-US',
timezoneId: 'America/Chicago',
});
await ctx.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
window.chrome = { runtime: {} };
});
const page = await ctx.newPage();
await page.goto('https://www.aa.com/', { waitUntil: 'networkidle' });
await page.waitForTimeout(1500 + Math.random() * 2000);
for (let i = 0; i < 8; i++) {
await page.mouse.move(
200 + Math.random() * 800,
150 + Math.random() * 500,
{ steps: 5 + Math.floor(Math.random() * 10) }
);
await page.waitForTimeout(50 + Math.random() * 150);
}
await page.mouse.wheel(0, 200 + Math.random() * 300);
await page.waitForTimeout(500 + Math.random() * 1000);
await browser.close();
})();
Типичные ошибки и edge cases
1. Headless Chrome без модификаций
Vanilla headless=True в Playwright/Puppeteer exposes navigator.webdriver=true и имеет отличающийся Canvas-фингерпринт. PerimeterX блокирует в 95%+ случаев. Решение: headless=False или headless="new" + stealth-патчи.
2. Слишком много запросов с одного IP
Даже резидентный IP получит блок, если делать 50+ запросов в минуту. PerimeterX учитывает частоту. Держите ≤10 запросов/мин на сессию и ротируйте session-ID через ProxyHat.
3. Несоответствие timezone и geo IP
Если IP из Нью-Йорка, а timezone_id="Europe/Berlin" — флаг. Всегда выравнивайте timezone с geo-таргетом прокси. См. доступные локации ProxyHat.
4. Переиспользование _pxhd между сессиями
_pxhd привязан к устройству. Если вы сохраняете cookies и переиспользуете с другим IP — PerimeterX видит несоответствие и блокирует. Используйте user-session-XXX в ProxyHat, чтобы IP был стабилен на всю сессию, и не переиспользуйте cookies между разными session-ID.
5. Отсутствие Sec-Ch-Ua заголовков
Chrome 120+ шлёт Sec-Ch-Ua, Sec-Ch-Ua-Mobile, Sec-Ch-Ua-Platform. Если их нет — PerimeterX считает, что вы не Chrome. Playwright шлёт их автоматически, но в raw HTTP-клиентах нужно добавлять вручную.
Настройка ProxyHat и внутренние ссылки
Для PerimeterX-защищённых сайтов рекомендуется:
- Тип прокси: резидентные (residential) — datacenter блокируется почти гарантированно.
- Geo: страна целевого сайта. Для US-авиакомпаний —
user-country-US. - Сессия: sticky на 10–30 минут через
user-session-XXX. - Порт: 8080 (HTTP) или 1080 (SOCKS5).
Полная документация по подключению — на docs.proxyhat.com. Цены — на странице тарифов. Примеры использования — в разделах web scraping и SERP tracking.
Этическая рамка и законность
Обход PerimeterX легитимен, когда:
- Вы собираете публично доступные данные (цены, наличие билетов) в рамках
robots.txtи ToS сайта. - Вы проводите авторизованный pentest с письменным разрешением владельца сайта.
- Вы делаете security research в рамках bug bounty.
Обход PerimeterX нелегитимен, когда:
- ToS прямо запрещают автоматический доступ.
- Вы скрейпите персональные данные в нарушение GDPR/CCPA.
- Вы перегружаете сайт (DoS-уровень нагрузки).
Всегда проверяйте robots.txt, читайте ToS и консультируйтесь с юристом при сомнениях. Подробнее о правовых аспектах — в руководстве FTC по онлайн-трекингу.
Key Takeaways
PerimeterX = поведение в первую очередь. IP и TLS — необходимые, но не достаточные. Без реалистичных движений мыши и таймингов блок прилетит даже с идеальным резидентным IP.
Используйте реальный браузер. Playwright/Puppeteer с headed Chrome даёт корректный JA3 и Canvas-фингерпринт. HTTP-клиенты (requests, axios) не пройдут.
Резидентные прокси обязательны. Datacenter-IP блокируются на этапе IP-репутации, до JS-челленджа. ProxyHat residential с geo-US и sticky-сессией — рабочий вариант.
Pacing критичен. 1.5–4 секунды до первого взаимодействия, логнормальные интервалы между кликами, 5–10 mousemove на страницу.
Не переиспользуйте cookies между IP. _pxhd привязан к устройству — меняйте session-ID в ProxyHat при новой сессии.
FAQ
Что такое PerimeterX (HUMAN)?
PerimeterX — антибот-система, ныне часть HUMAN Security, защищающая сайты от автоматизированного трафика через поведенческий анализ, фингерпринтинг устройства (Canvas, WebGL), TLS/JA3-проверки и IP-репутацию. Особенно популярна у авиакомпаний (United, American, Delta) и премиального e-commerce (Neiman Marcus, Saks). Ключевые cookies — _px3 (сессия) и _pxhd (устройство).
Почему PerimeterX важен для прокси-пользователей?
PerimeterX блокирует datacenter-IP ещё до JS-челленджа, а резидентные IP блокирует при нечеловеческом поведении. Это значит, что простой смены IP недостаточно — нужен реальный браузер с stealth-патчами, реалистичный браузерный контекст и pacing. Для скрапинга цен/наличия на PerimeterX-сайтах это определяет архитектуру всего решения.
Какой тип прокси лучше всего работает с PerimeterX?
Резидентные прокси (residential) от Tier-1 ISP. Datacenter-IP блокируются с вероятностью 95%+ на этапе IP-проверки. Мобильные прокси тоже работают, но дороже и реже нужны. Через ProxyHat используйте формат user-country-US-session-XXX:pass@gate.proxyhat.com:8080 с sticky-сессией 10–30 минут.
Как избежать блокировок при работе с PerimeterX?
Используйте Playwright с headed Chrome + stealth-патчами (убрать navigator.webdriver, добавить window.chrome), резидентные прокси с geo, выровненным с timezone, и соблюдайте pacing: 1.5–4 секунды до первого mousemove, логнормальные интервалы между кликами, 5–10 событий мыши на страницу, ≤10 запросов/мин на сессию.
Чем PerimeterX отличается от DataDome и Akamai?
PerimeterX делает упор на поведенческие сигналы (mouse, timing, scroll), DataDome — на IP-репутацию и сигнатуры заголовков, Akamai — на сложный sensor_data и TLS-фингерпринт. PerimeterX труднее обойти поведенчески, но проще по IP: резидентный IP + реальный браузер + pacing обычно достаточно, тогда как Akamai требует глубокого реверс-инжиниринга sensor_data.






