Puppeteer - это библиотека Node.js, которая предоставляет высокоуровневый API для управления headless Chrome или Chromium. Она незаменима для парсинга современных сайтов на JavaScript (одностраничных приложений).
Интеграция прокси Catproxy с Puppeteer требует передачи специального аргумента --proxy-server при запуске браузера.
Базовая настройка
Вот как запустить экземпляр Puppeteer, который направляет весь свой трафик через наш прокси-шлюз.
Вам понадобится puppeteer, установленный в вашем проекте: npm install puppeteer
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();
})();
Важно: Puppeteer требует аутентификации для каждой страницы с помощью page.authenticate(). Вы должны вызывать этот метод для каждой новой страницы (browser.newPage()), которую вы открываете.
Пример из реальной практики: скриншот результатов поиска Amazon
Чаще всего Puppeteer используют для того, чтобы отобразить полную страницу с динамическим содержимым и сделать снимок экрана - например, для мониторинга рейтинга товаров или результатов поиска на крупном сайте электронной коммерции, таком как Amazon.
Давайте сделаем скриншот результатов поиска по запросу “web scraping books” на amazon.com, при этом запрос будет выглядеть так, как будто он поступает из США.
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.");
}
})();
Amazon - сложная цель! Они применяют продвинутые меры защиты от ботов. Хотя этот скрипт работает, для масштабного парсинга вам может потребоваться реализовать более продвинутые техники: ротацию User-Agents, обработку CAPTCHA и имитацию поведения реального пользователя (случайные задержки, движения мыши).
Что демонстрирует этот пример
- Парсинг реального сложного сайта: Как подойти к такому крупному объекту, как Amazon.
- Аутентификация через прокси в Puppeteer: Правильный двухэтапный процесс установки
--proxy-server и использования page.authenticate().
- Динамический геотаргетинг: Показывает, как изменить ваше видимое местоположение, изменив имя пользователя.
- Имитация реального пользователя: Демонстрирует лучшие практики, такие как установка реалистичного viewport и
User-Agent, чтобы снизить вероятность обнаружения анти-ботами.
- Обработка ошибок: Включает блок
try...catch и сохраняет HTML страницы при неудаче - важный прием для отладки проблем со парсингом.