Playwright - это современная библиотека Node.js для автоматизации браузеров, которая поддерживает Chromium, Firefox и WebKit. Надежный набор функций и простой API делают ее отличным выбором для парсинга сложных интерактивных веб-сайтов.
Интеграция прокси Catproxy с Playwright осуществляется путем передачи настроек прокси непосредственно в метод browser.newContext() или browser.newPage().
Базовая настройка
Вот как запустить экземпляр браузера Playwright, который направляет весь трафик через наш прокси-шлюз.
Вам понадобится playwright, установленный в вашем проекте: npm install playwright
const { chromium } = require('playwright');
// 1. Скопируйте их со страницы «Настройки прокси» вашего прокси
const proxyHost = "proxy.catproxy.net";
const proxyPort = 5555;
const proxyUser = "PROXY_USERNAME";
const proxyPass = "PROXY_PASSWORD";
(async () => {
console.log('Launching browser with proxy...');
const browser = await chromium.launch({
// 2. Укажите настройки прокси в параметрах запуска браузера
proxy: {
server: `http://${proxyHost}:${proxyPort}`,
username: proxyUser,
password: proxyPass
},
headless: false // Для production используйте true
});
const context = await browser.newContext();
const page = await context.newPage();
console.log('Navigating to IP checker...');
await page.goto('https://api.ipify.org?format=json');
// 3. Получите содержимое страницы и проверьте IP-адрес
const content = await page.textContent('body');
console.log('Success! Your proxy IP is:', JSON.parse(content).ip);
await browser.close();
})();
В Playwright учётные данные прокси задаются на уровне браузера или контекста. Все новые страницы в этом контексте будут автоматически использовать те же настройки прокси, что проще, чем аутентификация для каждой страницы в Puppeteer.
Пример из реальной практики: проверка цен на авиабилеты в Google Flights
Цены на авиабилеты - классический пример геозависимых данных. Давайте создадим скрипт для проверки стоимости перелета в одну сторону из Берлина в Лондон на определённую дату, при этом запрос будет выглядеть так, как будто он поступает из Германии (DE).
const { chromium } = require('playwright');
// --- Your Base Credentials ---
const BASE_USERNAME = "PROXY_USERNAME";
const PASSWORD = "PROXY_PASSWORD";
const PROXY_HOST = "proxy.catproxy.net";
const PROXY_PORT = 5555;
// --- Target Information ---
const DEPARTURE_AIRPORT = "BER"; // Berlin
const ARRIVAL_AIRPORT = "LHR"; // London Heathrow
const DEPARTURE_DATE = "2025-11-07"; // YYYY-MM-DD format
const TARGET_URL = `https://www.google.com/travel/flights/search?tfs=CBwQAhoeEgoyMDI1LTExLTA3agcIARIDQkVScgcIARIDTEhSQAFIAXABggELCP___________wGYAQI`; // Note: This is a complex, pre-generated URL for BER-LHR on 2025-08-15
const REGION = "de"; // Germany
(async () => {
// Dynamically construct the username for the target region
const proxyUsername = `${BASE_USERNAME}-country-${REGION}`;
console.log("Launching Playwright browser...");
const browser = await chromium.launch({
proxy: {
server: `http://${PROXY_HOST}:${PROXY_PORT}`,
username: proxyUsername,
password: PASSWORD
}
});
const context = await browser.newContext({
// Set a realistic User-Agent and viewport
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
viewport: { width: 1920, height: 1080 },
});
const page = await context.newPage();
console.log(`Navigating to Google Flights via a ${REGION.toUpperCase()} proxy...`);
try {
// Navigate and wait for the results to load
await page.goto(TARGET_URL, { waitUntil: 'load', timeout: 60000 });
// Selector to find the price of the first non-stop flight
// This is a complex selector that may change!
const priceSelector = 'div[role="main"] li[role="listitem"] .YMlIz > div > div:last-child';
// Wait for the price element to be visible
await page.waitForSelector(priceSelector, { timeout: 20000 });
const price = await page.locator(priceSelector).first().textContent();
console.log(`Success! The cheapest non-stop flight price found is: ${price}`);
await page.screenshot({ path: `google_flights_${REGION}.png` });
console.log(`Screenshot saved as 'google_flights_${REGION}.png'`);
} catch (error) {
console.error(`An error occurred: ${error.message}`);
await page.screenshot({ path: 'error_flights.png' });
console.log("Saved an error screenshot to error_flights.png for debugging.");
} finally {
await browser.close();
console.log("Browser closed.");
}
})();
Google - очень сложная цель! Структура URL и CSS-селекторы в Google Flights сложны и часто меняются. Этот скрипт демонстрирует техническую интеграцию, но для надёжного крупномасштабного парсинга Google вам потребуется реализовать очень надёжную обработку ошибок и регулярно адаптировать селекторы.
Что демонстрирует этот пример
- Кросс-браузерная автоматизация: Как использовать мощный API Playwright для управления браузером.
- Упрощенная настройка прокси в Playwright: Современный подход к установке учётных данных прокси на уровне запуска браузера.
- Парсинг динамического контента: Как дождаться появления определённых элементов (
page.waitForSelector) на странице с интенсивным использованием JavaScript перед извлечением данных.
- Продвинутые локаторы: Использование API
locator в Playwright для более гибкого выбора элементов.