🔥 Все резидентские и мобильные прокси — всего1$. Попробуйте сейчас!

Как использовать прокси в Puppeteer

Как использовать прокси в Puppeteer

Puppeteer — одна из самых популярных библиотек Node.js и мощный инструмент для автоматизации таких задач, как веб-скрейпинг, тестирование, SEO-исследования или отслеживание цен через браузеры Chrome или Chromium. Если вы хоть раз работали с автоматизированным процессом на масштабе, вам уже знакома эта боль — сайты ограничивают скорость и пропускную способность вашего соединения, блокируют запросы на месте или вовсе заносят ваш IP в чёрный список.

Эти сложности не только стоят вам драгоценного времени и денег, но и могут серьёзно повлиять на репутацию вашего личного адреса, а значит — и на любые будущие онлайн-начинания. К счастью, есть способ, который решает эти проблемы без особых усилий, одновременно помогая обходить гео-ограничения и распределять автоматические запросы для повышения успешности и скорости соединения. Речь, конечно же, о прокси.

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

Что такое прокси для Puppeteer и зачем он нужен?

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

Тем не менее, маскировка IP — это лишь верхушка айсберга. Вот полный список преимуществ, которые прокси даёт вашему рабочему процессу с Puppeteer:

  • Избежание IP-банов, ограничения скорости и троттлинга: сайты часто ограничивают доступ IP-адресам, с которых поступает большое количество последовательных запросов. Если соединение не блокируется полностью, оно может сильно замедлиться или начать бомбардироваться CAPTCHA. Хорошо настроенный пул ротирующихся прокси решает эту проблему — даже если один из ваших IP забанят, на его место придёт другой, обеспечивая бесперебойную работу.
  • Обход гео-ограничений: значительная часть интернет-контента скрыта за географическими ограничениями или иначе изменяется в зависимости от того, откуда идёт запрос. Резидентные прокси позволяют получить адрес из любой точки мира с высокой точностью (конкретный штат, город или почтовый индекс) и просматривать сайты так, будто вы физически находитесь в этом регионе.
  • Повышение успешности запросов: распределение запросов по пулу прокси значительно снижает количество неудачных подключений и таймаутов, особенно при агрессивных задачах скрейпинга.

Это становится чрезвычайно полезным, если не критически важным, при:

  • Массовом веб-скрейпинге
  • Проверке рекламы
  • Мониторинге SEO
  • Контроле качества и тестировании
  • Локализации

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

VPN или прокси для Puppeteer: что выбрать?

Когда речь заходит об инструментах обхода ограничений, неизменно возникает один вопрос: что лучше — прокси или VPN? У обоих есть свои сильные и слабые стороны, и оба дают отличные результаты при правильном использовании и подходящем сценарии. Поскольку эта статья посвящена именно автоматизации с Puppeteer, давайте разберёмся, какой инструмент лучше подходит для этих рабочих процессов.

С точки зрения пользователя VPN и прокси довольно похожи — оба маскируют ваш IP, выдавая новый. Однако на этом сходство заканчивается. VPN направляет весь трафик с вашего устройства через зашифрованный туннель, подключая вас к серверу провайдера. Оттуда вы можете свободно просматривать весь интернет по своему усмотрению.

Прокси же скрывают ваш IP только от одного сайта или приложения (того, к которому вы подключаетесь) за раз, а уровень шифрования определяется выбранным протоколом — HTTP не даёт шифрования вообще, HTTPS обеспечивает базовое шифрование, а SOCKS5 — максимальное.

Почему это важно?

Именно эти два ключевых различия сильнее всего разделяют инструменты обхода ограничений при практическом использовании. Шифрование VPN делает его отличным выбором для личной приватности и анонимности в сети, тогда как более низкая нагрузка на прокси позволяет им поддерживать высокую скорость и одновременно обрабатывать огромные объёмы пользовательского трафика. Кроме того, направляя весь ваш трафик через себя, VPN может дать вам только один IP за раз, тогда как прокси предлагают столько одновременных подключений, сколько вам нужно.

Вот сравнительная таблица для наглядности:

VPN Прокси
Маскировка IP Да Да
Шифрование Да, весь трафик устройства Только с протоколом SOCKS5, для каждого сайта/приложения отдельно
Скорость Средняя Высокая
Одновременные подключения Один IP за раз Несколько IP одновременно
Управление ротацией Ограниченное Встроенное
Точность гео-таргетинга Ограниченная (уровень страны) Город, штат, почтовый индекс, ASN (зависит от провайдера)
Обработка CAPTCHA/блокировок Требуется ручное вмешательство Обрабатывается автоматической ротацией
Масштабируемость Ограниченная Высокая масштабируемость
Лучше всего для Личного использования Автоматизации в масштабе

Хотя VPN потенциально можно интегрировать в скрипт Puppeteer, результат такой затеи далёк от идеала. Другими словами, VPN лучше подходит для индивидуального просмотра сайтов, а прокси создан именно для автоматизации, скрейпинга, тестирования и сбора данных в больших масштабах.

Как использовать прокси в Puppeteer: базовая настройка с Floppydata

Теперь перейдём к разделу статьи о настройке прокси и интеграции с Puppeteer. Для настройки и демонстрации я буду использовать Floppydata.

Floppydata уже давно является моим основным провайдером прокси. Сервис обеспечивает стабильный аптайм 99,99% и высокий уровень доверия, предлагая бесперебойное соединение для любого автоматизированного пайплайна. Помимо отличной производительности, Floppydata предлагает одни из лучших цен на рынке — всего $1/ГБ для ротирующихся IP и $5/IP для ISP-прокси. Это делает сервис идеальным выбором для тех, кто ведёт масштабные операции с большим объёмом данных, но при этом следит за бюджетом.

Web data access service homepage

Первый шаг интеграции прокси в ваш скрипт Puppeteer — это получение самого прокси. С Floppydata это занимает пару кликов.

После входа вы попадёте в панель управления Floppydata. Сначала выберите подходящий тариф и перейдите к оплате. Для задач автоматизации я рекомендую тариф «Rotating proxy», который включает три типа IP (резидентные, мобильные и датацентр), между которыми можно переключаться по своему усмотрению.

Дальнейшие шаги предельно просты — даже если вы не очень хорошо знакомы с прокси-сервисами, чистый интерфейс Floppydata не даст вам заблудиться.

Перейдите на вкладку «Get proxy credentials» в левой боковой панели. Там вам выдадут логин и соответствующий пароль для вашего аккаунта, но для этой демонстрации давайте создадим отдельный профиль для Puppeteer — это сгенерирует новый прокси с уже встроенной аутентификацией. Как видите, вы можете создать сколько угодно отдельных субпользователей, что сильно упрощает дальнейшее управление.

Затем просто выберите нужные параметры из предложенных выпадающих списков. По мере заполнения деталей они сразу же встраиваются в строку прокси. Как только параметры вас устроят, можно просто скопировать сниппет кода или саму строку прокси.

В этой демонстрации сосредоточимся на том, как работает базовая настройка со строкой прокси. Вот сниппет кода для интеграции одного прокси:

Прокси Puppeteer с аутентификацией — метод page.authenticate

Установка:

bash
npm install puppeteer

Базовая настройка:

javascript
const puppeteer = require('puppeteer');

(async () => {
    const PROXY_USER = 'user123-type-residential-country-US-session-pup01';
    const PROXY_PASS = 'your_password';
    const PROXY_SERVER = 'geo.g-w.info:10080';

    const browser = await puppeteer.launch({
        args: [`--proxy-server=${PROXY_SERVER}`]
    });

    const page = await browser.newPage();

    // Authenticate
    await page.authenticate({
        username: PROXY_USER,
        password: PROXY_PASS
    });

    // Navigate
    await page.goto('https://httpbin.org/ip');

    const content = await page.content();
    console.log(content);

    await browser.close();
})();

После того как код настроен, просто скопируйте и вставьте свои данные прокси из панели управления Floppydata в соответствующие поля — ваш логин (всю строку, которую мы скопировали на GIF выше) в PROXY_USER, пароль в PROXY_PASS. PROXY_SERVER задаётся в простом формате hostname:port, где имя хоста — geo.g-w.info, а диапазон портов определяется выбранным протоколом — 10080 для HTTP, 10443 для HTTPS и 10800 для SOCKS5.

Этот метод также включает нативную аутентификацию с поддержкой как HTTP, так и HTTPS — введите логин и пароль в page.authenticate, чтобы сразу же подключить прокси с аутентификацией — без дополнительных настроек и новых страниц.

Аутентификация через proxy-chain

Ещё один способ аутентификации прокси, используемый в основном для кастомных сообщений об ошибках, кастомных ответов и сбора статистики трафика, а также если нужно встроить учётные данные прямо в URL прокси — это npm-пакет proxy-chain. Ключевая часть этого метода — anonymizeProxy(proxy), которая запускает локальный прокси-сервер.

Установка:

bash
npm install proxy-chain

Настройка:

javascript
const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');

const PROXY_SERVER = 'geo.g-w.info:10080';
const PROXY_USER = 'user123-type-residential-country-US-session-pup01';
const PROXY_PASS = 'your_password';

(async () => {
    const proxy = `http://${PROXY_USER}:${PROXY_PASS}@${PROXY_SERVER}`;

    const anonymizedProxy = await proxyChain.anonymizeProxy(proxy);

    const browser = await puppeteer.launch({
        args: [`--proxy-server=${anonymizedProxy}`],
    });

    const page = await browser.newPage();
    await page.goto('https://httpbin.org/ip');
    await page.screenshot({ path: 'example2.png' });

    await browser.close();
    await proxyChain.closeAnonymizedProxy(anonymizedProxy, true);
})();

Для этого метода понадобятся те же данные, что и раньше, плюс URL прокси в формате Protocol://Username:Password@Hostname:Port. Готовую строку можно найти в панели управления Floppydata прямо под настройками прокси — нажмите «Proxy strings», затем «As list» и выберите нужный формат из выпадающего списка.

Interface for proxy settings configuration

Использование прокси с Puppeteer в масштабе: лучшие практики интеграции

Когда базовая настройка прокси заработала, можно переходить к расширению пайплайна для продакшена. Здесь одного статического прокси уже недостаточно — разберёмся, как настроить пул ротирующихся прокси в Puppeteer.

Случайная ротация

Установка:

bash
npm install puppeteer

Настройка:

javascript
const puppeteer = require('puppeteer');

const PROXY_PASS = 'your_password';
const PROXY_SERVER = 'geo.g-w.info:10080';
const PROXY_POOL = [
    'user123-type-residential-country-US-session-pup01',
    'user123-type-residential-country-US-session-pup02',
    'user123-type-residential-country-US-session-pup03',
    'user123-type-residential-country-US-session-pup04',
];
const getRandomProxy = () => PROXY_POOL[Math.floor(Math.random() * PROXY_POOL.length)];

const urls = [
    'https://httpbin.org/ip',
    'https://httpbin.org/ip',
    'https://httpbin.org/ip',
];

(async () => {
    for (const url of urls) {
        const PROXY_USER = getRandomProxy();

        const browser = await puppeteer.launch({
            args: [`--proxy-server=${PROXY_SERVER}`]
        });

        const page = await browser.newPage();

        await page.authenticate({
            username: PROXY_USER,
            password: PROXY_PASS
        });

        await page.goto(url);
        const content = await page.content();
        console.log(`Request via ${PROXY_USER}:`, content);

        await browser.close();
    }
})();

Как видите, главное отличие здесь в том, что вместо PROXY_USER мы используем PROXY_POOL. Одновременно мы добавляем логику случайной ротации через Math.floor(Math.random() * PROXY_POOL.length).

Последовательная ротация

Установка:

bash
npm install puppeteer

Настройка:

javascript
const puppeteer = require('puppeteer');

const PROXY_PASS = 'your_password';
const PROXY_SERVER = 'geo.g-w.info:10080';
const PROXY_POOL = [
    'user123-type-residential-country-US-session-pup01',
    'user123-type-residential-country-US-session-pup02',
    'user123-type-residential-country-US-session-pup03',
    'user123-type-residential-country-US-session-pup04',
];

let proxyIndex = 0;
const getNextProxy = () => {
    const proxy = PROXY_POOL[proxyIndex % PROXY_POOL.length];
    proxyIndex++;
    return proxy;
};

const urls = [
    'https://httpbin.org/ip',
    'https://httpbin.org/ip',
    'https://httpbin.org/ip',
];

(async () => {
    for (const url of urls) {
        const PROXY_USER = getNextProxy();

        const browser = await puppeteer.launch({
            args: [`--proxy-server=${PROXY_SERVER}`]
        });

        const page = await browser.newPage();

        await page.authenticate({
            username: PROXY_USER,
            password: PROXY_PASS
        });

        await page.goto(url);
        const content = await page.content();
        console.log(`Request via ${PROXY_USER}:`, content);

        await browser.close();
    }
})();

Здесь мы используем функцию getNextProxy(), которая использует счётчик proxyIndex с оператором остатка от деления (%), чтобы циклично проходить по пулу.

SOCKS-прокси в Puppeteer: что нужно знать

Протокол Socket Secure (SOCKS), и в частности прокси SOCKS5, работают на более низком сетевом уровне, чем HTTP/HTTPS-прокси. Их отличает от других протоколов способность обрабатывать любой тип трафика — от обычного просмотра сайтов до email, передачи файлов, P2P-соединений и потоков данных в реальном времени. Это возможно благодаря тому, что протокол SOCKS не интерпретирует и не фильтрует трафик, как это делают HTTP-прокси, а просто пропускает необработанные пакеты TCP и UDP без каких-либо изменений. Кроме того, прокси SOCKS5 обеспечивают максимальный уровень шифрования, какой вообще может обеспечить сам прокси-слой.

В контексте Puppeteer прокси SOCKS5 имеют пару явных преимуществ. Их низкоуровневая пересылка пакетов означает меньше ошибок и меньшую задержку под высокой нагрузкой, что сильно помогает при запуске масштабных пайплайнов скрейпинга. Поскольку Puppeteer способен работать с широким спектром задач за пределами обычного просмотра сайтов — включая медиа, WebSocket-соединения и не-HTTP-трафик, — прокси SOCKS5 отлично подходят именно благодаря способности обрабатывать несколько протоколов, а не ограничиваться только веб-трафиком.

Однако есть загвоздка. Движок Puppeteer, Chromium, изначально не поддерживает аутентификацию SOCKS5-прокси, которую требует большинство коммерческих прокси, включая Floppydata. Попытка использовать обычный метод page.authenticate, скорее всего, приведёт к ошибке ERR_NO_SUPPORTED_PROXIES или к тому, что браузер откатится на прямое соединение, раскрыв ваш реальный IP.

Тем не менее, SOCKS5-адреса всё же можно интегрировать в скрипт Puppeteer и аутентифицировать через метод proxy-chain. proxy-chain работает здесь потому, что поднимает локальный HTTP-туннель, который берёт аутентификацию SOCKS5 на себя — Chromium вообще не приходится с ней взаимодействовать напрямую. Настройка в этом случае выглядит немного иначе:

Установка:

bash
npm install proxy-chain

Настройка:

javascript
const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');

const PROXY_USER = 'user123-type-residential-country-US-session-pup01';
const PROXY_PASS = 'your_password';
const PROXY_HOST = 'geo.g-w.info';
const PROXY_PORT = '10800';

(async () => {
    const proxy = `socks5://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`;

    const anonymizedProxy = await proxyChain.anonymizeProxy(proxy);

    const browser = await puppeteer.launch({
        args: [`--proxy-server=${anonymizedProxy}`],
    });

    const page = await browser.newPage();
    await page.goto('https://httpbin.org/ip');
    const content = await page.content();
    console.log(content);

    await browser.close();
    await proxyChain.closeAnonymizedProxy(anonymizedProxy, true);
})();

Важно отметить, что в этом случае PROXY_PORT меняется на 10800 для протокола SOCKS5, а сама строка прокси начинается с socks5://, а не с http://.

Заключение

Прокси — неотъемлемая часть любой серьёзной настройки автоматизации на Puppeteer. В этом руководстве мы разобрали основные причины их использования, сравнили с VPN и прошлись по всем основным методам интеграции — от базовой аутентификации до ротирующихся пулов и настройки SOCKS5 через proxy-chain. С надёжным провайдером вроде Floppydata и правильной настройкой под ваш сценарий использования у вас будет отказоустойчивый, масштабируемый пайплайн, способный справиться с любыми требованиями вашего рабочего процесса.

Попробуйте прокси-серверы Floppydata прямо сейчас - всего за $1/Гб

Поделиться этой статьей:

Содержание

Прокси по цене $1
Получите неограниченные возможности

Вам также может понравиться:
Готовы ли вы испытать прозрачный и надежный прокси-сервис?
Быстрые, безопасные и удобные прокси, адаптированные под ваши потребности