> ## Documentation Index
> Fetch the complete documentation index at: https://docs.catproxy.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Node.js: Puppeteer

> Узнайте, как интегрировать прокси Catproxy с Puppeteer для парсинга динамических веб-сайтов с интенсивным использованием JavaScript, которым требуется реальная среда браузера.

Puppeteer - это библиотека Node.js, которая предоставляет высокоуровневый API для управления headless Chrome или Chromium. Она незаменима для парсинга современных сайтов на JavaScript (одностраничных приложений).

Интеграция прокси Catproxy с Puppeteer требует передачи специального аргумента `--proxy-server` при запуске браузера.

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

Вот как запустить экземпляр Puppeteer, который направляет весь свой трафик через наш прокси-шлюз.

<Info>
  Вам понадобится `puppeteer`, установленный в вашем проекте: `npm install puppeteer`
</Info>

```javascript basic_setup.js icon="js" lines wrap theme={null}
const puppeteer = require('puppeteer');

// 1. Скопируйте их со страницы «Настройки прокси» вашего прокси
const proxyHost = "proxy.catproxy.net";
const proxyPort = 5555;
const proxyUser = "PROXY_USERNAME";
const proxyPass = "PROXY_PASSWORD";

const proxyServer = `http://${proxyHost}:${proxyPort}`;

(async () => {
  console.log('Launching browser with proxy...');
  const browser = await puppeteer.launch({
    headless: false, // Установите true для production, false для отладки
    // 2. Укажите URL прокси-сервера
    args: [`--proxy-server=${proxyServer}`]
  });

  const page = await browser.newPage();

  // 3. Выполните аутентификацию прокси для этой страницы
  await page.authenticate({
    username: proxyUser,
    password: proxyPass
  });

  console.log('Navigating to IP checker...');
  await page.goto('https://api.ipify.org?format=json', { waitUntil: 'networkidle0' });

  // 4. Получите содержимое страницы и проверьте IP-адрес
  const content = await page.evaluate(() => document.body.textContent);
  console.log('Success! Your proxy IP is:', JSON.parse(content).ip);

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

<Warning>
  **Важно:** Puppeteer требует аутентификации для каждой страницы с помощью `page.authenticate()`. Вы должны вызывать этот метод для каждой новой страницы (`browser.newPage()`), которую вы открываете.
</Warning>

### Пример из реальной практики: скриншот результатов поиска Amazon

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

Давайте сделаем скриншот результатов поиска по запросу **"web scraping books"** на `amazon.com`, при этом запрос будет выглядеть так, как будто он поступает из **США**.

```javascript amazon_scraper.js icon="js" lines wrap theme={null}
const puppeteer = require('puppeteer');

// --- Your Base Credentials ---
const BASE_USERNAME = "PROXY_USERNAME";
const PASSWORD = "PROXY_PASSWORD";
const PROXY_HOST = "proxy.catproxy.net";
const PROXY_PORT = 5555;

const proxyServer = `http://${PROXY_HOST}:${PROXY_PORT}`;

// --- Target Information ---
const SEARCH_QUERY = "web scraping books";
const TARGET_URL = `https://www.amazon.com/s?k=${encodeURIComponent(SEARCH_QUERY)}`;
const REGION = "us"; // United States

(async () => {
  console.log("Launching Puppeteer browser...");
  const browser = await puppeteer.launch({
    headless: true, // Use true for automated scripts
    args: [`--proxy-server=${proxyServer}`]
  });

  const page = await browser.newPage();

  // Dynamically construct the username for the target region
  const proxyUsername = `${BASE_USERNAME}-country-${REGION}`;

  // Authenticate using the dynamically created username
  await page.authenticate({
    username: proxyUsername,
    password: PASSWORD
  });

  // Set a realistic viewport and user agent to mimic a real user
  await page.setViewport({ width: 1920, height: 1080 });
  await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36');

  console.log(`Navigating to Amazon search results for "${SEARCH_QUERY}" via a ${REGION.toUpperCase()} proxy...`);

  try {
    // Navigate to the page and wait for the network to be mostly idle
    await page.goto(TARGET_URL, { waitUntil: 'networkidle2', timeout: 60000 });

    // (Optional) A small delay to ensure all dynamic content loads
    await new Promise(resolve => setTimeout(resolve, 2000));

    // Take a screenshot and save it
    await page.screenshot({ path: `amazon_search_${REGION}.png`, fullPage: true });

    console.log(`Success! Screenshot saved as 'amazon_search_${REGION}.png'`);

  } catch (error) {
    console.error(`An error occurred: ${error.message}`);
    // In case of an error, it's useful to save the HTML for debugging
    const errorHtml = await page.content();
    require('fs').writeFileSync('error.html', errorHtml);
    console.log("Saved the page's HTML to error.html for debugging.");
  } finally {
    await browser.close();
    console.log("Browser closed.");
  }
})();
```

<Warning>
  **Amazon - сложная цель!** Они применяют продвинутые меры защиты от ботов. Хотя этот скрипт работает, для масштабного парсинга вам может потребоваться реализовать более продвинутые техники: ротацию User-Agents, обработку CAPTCHA и имитацию поведения реального пользователя (случайные задержки, движения мыши).
</Warning>

### Что демонстрирует этот пример

* **Парсинг реального сложного сайта:** Как подойти к такому крупному объекту, как Amazon.
* **Аутентификация через прокси в Puppeteer:** Правильный двухэтапный процесс установки `--proxy-server` и использования `page.authenticate()`.
* **Динамический геотаргетинг:** Показывает, как изменить ваше видимое местоположение, изменив имя пользователя.
* **Имитация реального пользователя:** Демонстрирует лучшие практики, такие как установка реалистичного viewport и `User-Agent`, чтобы снизить вероятность обнаружения анти-ботами.
* **Обработка ошибок:** Включает блок `try...catch` и сохраняет HTML страницы при неудаче - важный прием для отладки проблем со парсингом.
