Обход блокировок

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

Использование Proxy-серверов

Один из самых распространённых способов обхода блокировок — использование прокси-серверов. С помощью прокси можно скрыть свой реальный IP-адрес и тем самым избежать блокировки на основе IP. Puppeteer предоставляет возможность использовать прокси-серверы при запуске браузера или для конкретных запросов.

Для настройки прокси в Puppeteer при запуске браузера достаточно указать параметр –proxy-server:

const browser = await puppeteer.launch({
  args: [&
});

Кроме того, можно проксировать только определённые страницы или запросы, используя метод page.setRequestInterception(true) для перехвата запросов и их модификации. Это даёт больше гибкости, если требуется использовать прокси только для определённого трафика.

Работа с CAPTCHA

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

  1. Использование внешних сервисов для решения CAPTCHA. Существует множество сервисов, таких как 2Captcha, AntiCaptcha и другие, которые предлагают API для автоматического решения CAPTCHA. В Puppeteer можно интегрировать решение CAPTCHA через API этих сервисов, отправляя изображение CAPTCHA на сервер и получая ответ, который затем вводится в форму.
const axios = require('axios');
const form = await page.$('form');
const captchaImage = await page.$eval('#captcha-image', img => img.src);

const response = await axios.post('https://2captcha.com/in.php', {
  method: 'base64',
  body: captchaImage,
  key: 'YOUR_API_KEY'
});

const captchaSolution = response.data;

await page.type('#captcha-input', captchaSolution);
await form.submit();
  1. Использование Puppeteer с настройками браузера для обхода. В некоторых случаях CAPTCHA не срабатывает, если браузер работает с определёнными параметрами. Например, отключение JavaScript, изменение заголовков User-Agent или имитация реального поведения пользователя (например, задержки в кликах или движении мыши) могут снизить вероятность появления CAPTCHA.
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
await page.setViewport({ width: 1280, height: 800 });

Управление Cookies

В некоторых случаях блокировки могут быть связаны с сохранением кукис на стороне сервера или сессии пользователя. Для обхода таких блокировок важно уметь манипулировать кукис в Puppeteer.

  1. Чтение и установка cookies. Puppeteer предоставляет возможность читать и устанавливать cookies для страниц. Это может быть полезно, например, если требуется сохранить сессию или работать с ранее авторизованными страницами.
const cookies = await page.cookies();
await page.setCookie(...cookies);

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

Эмуляция реальных пользователей

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

  1. Установка таймаутов и случайных задержек. Чтобы эмулировать поведение человека, полезно добавить случайные задержки между действиями, такими как клики и прокрутка страниц. Это может снизить вероятность блокировки.
const randomDelay = (min, max) => Math.random() * (max - min) + min;

await page.click('#button');
await page.waitForTimeout(randomDelay(1000, 3000)); // случайная задержка между 1 и 3 секундами
  1. Имитация движения мыши. В некоторых случаях может помочь имитация движения мыши по экрану, что делает автоматизацию более естественной.
await page.mouse.move(100, 100);
await page.mouse.move(200, 200);
await page.mouse.click(200, 200);
  1. Использование различных типов устройств. Один из методов обхода блокировок — это подмена устройства или платформы, на котором выполняется тест. Puppeteer позволяет эмулировать различные устройства, включая мобильные телефоны, планшеты и другие устройства, что помогает имитировать реальное поведение пользователей.
const iphone = puppeteer.devices['iPhone 6'];
await page.emulate(iphone);

Ожидание появления элементов

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

await page.waitForSelector('#login-form');
await page.type('#username', 'user');
await page.type('#password', 'password');
await page.click('#submit-button');

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

Использование Headless-режима

Некоторые сайты могут обнаруживать использование автоматических инструментов по признакам работы в headless-режиме, который по умолчанию используется Puppeteer. Чтобы обойти такую проверку, можно использовать режим с интерфейсом или скрывать признаки использования headless-режима.

const browser = await puppeteer.launch({
  headless: false,
  args: ['--disable-gpu', '--window-size=1920x1080']
});

Кроме того, можно скрыть следы использования Puppeteer, изменяя различные параметры браузера, такие как navigator.webdriver, который указывает, что браузер управляется скриптом.

await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
});

Заключение

Обход блокировок в Puppeteer — это важная часть работы с реальными веб-сайтами, где защита от ботов становится всё более сложной. Важно понимать, что, несмотря на наличие множества методов обхода, они могут не всегда работать в зависимости от сложности механизмов защиты. Использование прокси, работа с CAPTCHA, эмуляция поведения реального пользователя и настройка работы с cookies — это лишь часть методов, которые можно применить для обхода блокировок.