Puppeteer предоставляет мощный инструмент для автоматизации браузера, который часто используется для тестирования веб-приложений, парсинга данных и выполнения различных задач, связанных с взаимодействием с браузером. Однако при работе с реальными веб-сайтами может возникнуть необходимость обойти различные блокировки, такие как CAPTCHA, блокировки по IP-адресу, защита от ботов и другие механизмы, которые могут ограничивать доступ или искажать поведение. В этой статье рассматриваются способы обхода этих блокировок.
Один из самых распространённых способов обхода блокировок — использование прокси-серверов. С помощью прокси можно скрыть свой реальный IP-адрес и тем самым избежать блокировки на основе IP. Puppeteer предоставляет возможность использовать прокси-серверы при запуске браузера или для конкретных запросов.
Для настройки прокси в Puppeteer при запуске браузера достаточно указать
параметр –proxy-server:
const browser = await puppeteer.launch({
args: [&
});
Кроме того, можно проксировать только определённые страницы или запросы,
используя метод page.setRequestInterception(true) для
перехвата запросов и их модификации. Это даёт больше гибкости, если
требуется использовать прокси только для определённого трафика.
Вопрос обхода CAPTCHA в тестировании веб-сайтов — один из самых сложных, поскольку такие системы предназначены для выявления автоматических действий и защиты от ботов. Несмотря на это, существуют подходы, позволяющие минимизировать влияние 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();
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 });
В некоторых случаях блокировки могут быть связаны с сохранением кукис на стороне сервера или сессии пользователя. Для обхода таких блокировок важно уметь манипулировать кукис в Puppeteer.
const cookies = await page.cookies();
await page.setCookie(...cookies);
Также можно использовать cookies для обхода блокировок, связанных с авторизацией или сессиями, которые могут вызывать проблемы при повторном посещении страниц.
Веб-сайты часто используют системы защиты от ботов, отслеживая поведение пользователя. Использование Puppeteer с минимальными настройками по умолчанию может привести к выявлению автоматизации. Для того чтобы избежать этого, необходимо сделать автоматическое поведение как можно более похожим на реальное.
const randomDelay = (min, max) => Math.random() * (max - min) + min;
await page.click('#button');
await page.waitForTimeout(randomDelay(1000, 3000)); // случайная задержка между 1 и 3 секундами
await page.mouse.move(100, 100);
await page.mouse.move(200, 200);
await page.mouse.click(200, 200);
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-режиме, который по умолчанию используется 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 — это лишь часть методов, которые можно применить для обхода блокировок.