Настройка прокси в Puppeteer для Node.js осуществляется путем передачи аргумента --proxy-server при запуске браузера, что позволяет направлять сетевой трафик через указанный прокси-сервер, а для прокси с аутентификацией используются методы page.authenticate() или включение учетных данных в URL прокси.
Зачем использовать прокси с Puppeteer?
Использование прокси-серверов с Puppeteer позволяет управлять сетевым трафиком, обеспечивать анонимность и обходить географические или сетевые ограничения. Основные сценарии применения включают:
- Ротация IP-адресов: Распределение запросов между множеством IP-адресов для предотвращения блокировок или превышения лимитов запросов на целевых веб-сайтах.
- Обход географических ограничений: Доступ к контенту, доступному только в определенных регионах, путем маршрутизации трафика через прокси-сервер, расположенный в нужной стране.
- Повышение анонимности: Скрытие реального IP-адреса клиента.
- Тестирование: Симуляция различных сетевых условий или проверка доступности ресурса из разных точек мира.
- Защита от блокировок: Маскировка активности автоматизированных ботов.
Типы прокси-серверов
Puppeteer поддерживает различные типы прокси-серверов, каждый из которых имеет свои особенности:
- HTTP/HTTPS прокси: Работают на прикладном уровне (Layer 7). Предназначены для обработки HTTP и HTTPS трафика. Они могут изменять заголовки запросов.
- SOCKS прокси (SOCKS4/SOCKS5): Работают на сессионном уровне (Layer 5). SOCKS5 является более универсальным, поддерживая любой тип TCP-трафика (и UDP), а также различные методы аутентификации. SOCKS4 поддерживает только TCP. SOCKS-прокси не модифицируют заголовки запросов, что делает их более "прозрачными".
Для Puppeteer, SOCKS5 прокси часто предпочтительнее из-за их универсальности и способности обрабатывать различные виды трафика без глубокого анализа содержимого.
Базовая настройка прокси
Базовая настройка прокси в Puppeteer выполняется путем передачи аргумента --proxy-server при запуске браузера Chromium.
Синтаксис аргумента --proxy-server
Формат аргумента зависит от типа прокси:
- HTTP/HTTPS прокси:
http://<IP_адрес>:<порт> - SOCKS4/SOCKS5 прокси:
socks4://<IP_адрес>:<порт>илиsocks5://<IP_адрес>:<порт>
Пример настройки HTTP/HTTPS прокси
const puppeteer = require('puppeteer');
async function launchWithHttpProxy(proxyAddress) {
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyAddress}`],
headless: true, // Режим без головы
});
const page = await browser.newPage();
await page.goto('https://checkip.amazonaws.com'); // Сайт для проверки IP
const ip = await page.evaluate(() => document.body.textContent.trim());
console.log(`IP-адрес, видимый сайтом: ${ip}`);
await browser.close();
}
// Запуск с HTTP прокси
launchWithHttpProxy('http://192.168.1.100:8080');
Пример настройки SOCKS5 прокси
const puppeteer = require('puppeteer');
async function launchWithSocks5Proxy(proxyAddress) {
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyAddress}`],
headless: true,
});
const page = await browser.newPage();
await page.goto('https://checkip.amazonaws.com');
const ip = await page.evaluate(() => document.body.textContent.trim());
console.log(`IP-адрес, видимый сайтом: ${ip}`);
await browser.close();
}
// Запуск с SOCKS5 прокси
launchWithSocks5Proxy('socks5://192.168.1.101:1080');
Настройка прокси с аутентификацией
Для прокси-серверов, требующих аутентификацию, Puppeteer предлагает два основных метода:
- Включение учетных данных непосредственно в URL прокси (только для HTTP/HTTPS).
- Использование метода
page.authenticate().
Метод 1: Аутентификация через URL (только для HTTP/HTTPS)
Этот метод подходит для HTTP/HTTPS прокси, где учетные данные (логин и пароль) могут быть включены в URL прокси.
const puppeteer = require('puppeteer');
async function launchWithAuthenticatedHttpProxy(username, password, proxyHost, proxyPort) {
const proxyAddress = `http://${username}:${password}@${proxyHost}:${proxyPort}`;
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyAddress}`],
headless: true,
});
const page = await browser.newPage();
await page.goto('https://checkip.amazonaws.com');
const ip = await page.evaluate(() => document.body.textContent.trim());
console.log(`IP-адрес, видимый сайтом: ${ip}`);
await browser.close();
}
// Запуск с HTTP прокси и аутентификацией
launchWithAuthenticatedHttpProxy('myuser', 'mypassword', '192.168.1.102', 8080);
Примечание: Использование учетных данных в URL может быть менее безопасным, так как они могут быть видны в логах или системных процессах.
Метод 2: Аутентификация через page.authenticate()
Этот метод является более безопасным и рекомендованным, особенно для SOCKS5 прокси, так как page.authenticate() работает на уровне страницы и не раскрывает учетные данные в аргументах запуска браузера.
const puppeteer = require('puppeteer');
async function launchWithAuthenticatedProxy(username, password, proxyAddress) {
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyAddress}`],
headless: true,
});
const page = await browser.newPage();
// Установка учетных данных для прокси
await page.authenticate({ username: username, password: password });
await page.goto('https://checkip.amazonaws.com');
const ip = await page.evaluate(() => document.body.textContent.trim());
console.log(`IP-адрес, видимый сайтом: ${ip}`);
await browser.close();
}
// Запуск с прокси (HTTP или SOCKS5) и аутентификацией
// Пример для HTTP:
launchWithAuthenticatedProxy('myuser', 'mypassword', 'http://192.168.1.103:8080');
// Пример для SOCKS5:
// launchWithAuthenticatedProxy('myuser', 'mypassword', 'socks5://192.168.1.104:1080');
Ротация прокси-серверов
Для крупномасштабного веб-скрейпинга или задач, требующих частой смены IP-адресов, применяется ротация прокси.
Ручная ротация прокси из списка
Простейший метод — поддерживать массив прокси-серверов и выбирать их по очереди.
const puppeteer = require('puppeteer');
const proxyList = [
{ address: 'http://proxy1.example.com:8080', auth: { username: 'user1', password: 'pass1' } },
{ address: 'socks5://proxy2.example.com:1080', auth: { username: 'user2', password: 'pass2' } },
{ address: 'http://proxy3.example.com:8080' }, // Прокси без аутентификации
];
let currentProxyIndex = 0;
async function getNextProxy() {
const proxy = proxyList[currentProxyIndex];
currentProxyIndex = (currentProxyIndex + 1) % proxyList.length;
return proxy;
}
async function performTaskWithRotation(url) {
const proxy = await getNextProxy();
console.log(`Используем прокси: ${proxy.address}`);
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxy.address}`],
headless: true,
});
const page = await browser.newPage();
if (proxy.auth) {
await page.authenticate(proxy.auth);
}
try {
await page.goto(url, { waitUntil: 'networkidle2' });
const title = await page.title();
console.log(`Заголовок страницы "${url}": ${title}`);
} catch (error) {
console.error(`Ошибка при доступе к ${url} через прокси ${proxy.address}:`, error.message);
} finally {
await browser.close();
}
}
// Пример использования ротации прокси для нескольких задач
(async () => {
await performTaskWithRotation('https://www.google.com');
await performTaskWithRotation('https://www.bing.com');
await performTaskWithRotation('https://www.yahoo.com');
})();
Для более сложных сценариев ротации, таких как использование пулов прокси с проверкой работоспособности и автоматическим переключением, рекомендуется использовать специализированные библиотеки или сервисы прокси-менеджеров.
Продвинутые сценарии
Исключение доменов из проксирования
Иногда требуется, чтобы определенные домены или локальные адреса не проходили через прокси. Это можно настроить с помощью аргумента --proxy-bypass-list.
const puppeteer = require('puppeteer');
async function launchWithProxyBypass(proxyAddress, bypassList) {
const browser = await puppeteer.launch({
args: [
`--proxy-server=${proxyAddress}`,
`--proxy-bypass-list=${bypassList}` // Например: "localhost,*.local,127.0.0.1"
],
headless: true,
});
const page = await browser.newPage();
// Запрос к сайту через прокси
await page.goto('https://checkip.amazonaws.com');
const proxyIp = await page.evaluate(() => document.body.textContent.trim());
console.log(`IP через прокси: ${proxyIp}`);
// Запрос к локальному хосту (должен обойти прокси)
// Для демонстрации, предположим, что localhost не проксируется
// В реальном сценарии нужен локальный веб-сервер
await page.goto('http://localhost:8000'); // Этот запрос обойдет прокси
console.log('Запрос к localhost обошел прокси.');
await browser.close();
}
launchWithProxyBypass('http://your_proxy_ip:port', 'localhost,127.0.0.1,*.example.com');
Обработка SSL/TLS ошибок
Некоторые прокси-серверы могут вызывать ошибки SSL/TLS, особенно если они перехватывают и повторно подписывают трафик HTTPS (например, для инспекции). В таких случаях можно использовать опцию ignoreHTTPSErrors.
const puppeteer = require('puppeteer');
async function launchWithIgnoreSSLErrors(proxyAddress) {
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyAddress}`],
ignoreHTTPSErrors: true, // Игнорировать ошибки SSL/TLS
headless: true,
});
const page = await browser.newPage();
await page.goto('https://example.com'); // Сайт, который может вызвать ошибку SSL с прокси
console.log('Страница загружена, ошибки SSL игнорированы.');
await browser.close();
}
launchWithIgnoreSSLErrors('http://your_proxy_ip:port');
Предупреждение: Использование ignoreHTTPSErrors: true снижает безопасность, так как браузер перестает проверять подлинность SSL-сертификатов. Применяйте эту опцию с осторожностью и только для доверенных прокси или в контролируемых средах.
Сравнение типов прокси для Puppeteer
| Характеристика | HTTP/HTTPS Прокси | SOCKS5 Прокси |
|---|---|---|
| Уровень работы | Прикладной (Layer 7) | Сессионный (Layer 5) |
| Типы трафика | HTTP, HTTPS | TCP, UDP (более универсальный) |
| Модификация заголовков | Может модифицировать HTTP-заголовки | Не модифицирует заголовки, "прозрачный" |
| Аутентификация | Basic, Digest (через URL или page.authenticate()) |
Username/Password (page.authenticate() рекомендуется) |
| Производительность | Зависит от реализации, может быть медленнее из-за парсинга HTTP | Обычно быстрее для низкоуровневого трафика |
| Синтаксис в Puppeteer | http://host:port |
socks5://host:port |
| Применимость | Веб-скрейпинг, обход региональных блокировок | Более гибкий, для любого сетевого взаимодействия |
Устранение распространенных проблем
- Прокси не работает / Ошибка соединения:
- Проверьте правильность IP-адреса и порта прокси-сервера.
- Убедитесь, что прокси-сервер доступен из вашей сети (нет блокировок фаерволом).
- Проверьте, что прокси-сервер активен и функционирует.
- Ошибка аутентификации:
- Проверьте правильность логина и пароля.
- Убедитесь, что используемый метод аутентификации (URL или
page.authenticate()) соответствует типу прокси-сервера. SOCKS5 прокси обычно требуютpage.authenticate().
- SSL/TLS ошибки:
- Если прокси перехватывает HTTPS трафик, может потребоваться
ignoreHTTPSErrors: true. - Убедитесь, что корневой сертификат прокси-сервера установлен в системе, если это корпоративный прокси.
- Если прокси перехватывает HTTPS трафик, может потребоваться
- Медленная работа / Тайм-ауты:
- Производительность прокси-сервера может быть низкой. Попробуйте другой прокси.
- Целевой сайт может блокировать IP-адрес прокси или ограничивать скорость.
- Прокси игнорируется:
- Убедитесь, что аргумент
--proxy-serverпередан корректно при запуске браузера. - Проверьте, не используется ли
--no-proxy-serverили другие конфликтующие аргументы.
- Убедитесь, что аргумент