Skip to content
Advanced / 2 min read

Продвинутый веб-скрапинг с резидентными прокси ChangeMyIP и Playwright

Объедините ротационные резидентные прокси ChangeMyIP с Playwright, чтобы масштабно собирать данные с динамических сайтов. Этот продвинутый туториал охватывает ротацию IP для каждого запроса, обход отпечатков браузера и надёжную обработку ошибок.

SOCKS5 Веб-скрейпинг Приватность/Анонимность

Обзор

Playwright — это мощная библиотека автоматизации браузера, поддерживающая Chromium, Firefox и WebKit. В сочетании с резидентными прокси ChangeMyIP она становится надёжным инструментом для продвинутого веб-скрапинга, обхода географических ограничений и лимитов скорости. Этот туториал охватывает настройку Playwright с ротационными резидентными прокси ChangeMyIP, реализацию ротации IP для каждого запроса, управление отпечатками браузера и обработку динамического контента.

Предварительные требования

  • Node.js 16+ и npm
  • Аккаунт ChangeMyIP с доступом к резидентным прокси (или датацентр, если предпочитаете)
  • Базовые знания JavaScript/Node.js

Понимание конечных точек резидентных прокси ChangeMyIP

ChangeMyIP предоставляет резидентные прокси более чем в 40 странах. Вы можете аутентифицироваться с помощью имени пользователя/пароля. Формат конечной точки для HTTP-прокси:

http://<username>:<password>@<proxy-host>:<port>

Для SOCKS5:

socks5://<username>:<password>@<proxy-host>:<port>

Замените заполнители на учётные данные из вашей панели управления ChangeMyIP. Ротационные резидентные прокси по умолчанию назначают новый IP для каждого запроса, или вы можете поддерживать липкую сессию, используя ID сессии в имени пользователя (см. документацию ChangeMyIP). В этом туториале мы предполагаем ротацию.

Шаг 1: Настройка проекта Playwright

  1. Создайте новый каталог и инициализируйте npm:
mkdir changeMyIP-playwright-scraper
cd changeMyIP-playwright-scraper
npm init -y
  1. Установите Playwright и его зависимости:
npm install playwright
npx playwright install

Шаг 2: Настройка Playwright для использования прокси ChangeMyIP

Создайте файл scraper.js и добавьте следующий код. Он запускает браузер Chromium с вашим прокси ChangeMyIP:

const { chromium } = require('playwright');

const proxyUrl = 'http://username:password@proxy-host:port'; // Замените на ваши данные ChangeMyIP

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: proxyUrl,
    },
  });
  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  const content = await page.textContent('body');
  console.log(content);
  await browser.close();
})();

Запустите его с помощью node scraper.js. Вы должны увидеть IP прокси, а не ваш реальный IP.

Шаг 3: Реализация ротации прокси для каждого запроса

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

Вот функция, которая скрапит URL с новым IP каждый раз:

async function scrapeWithNewIP(url) {
  const browser = await chromium.launch({
    proxy: { server: proxyUrl },
  });
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: 'networkidle' });
  const data = await page.evaluate(() => document.body.innerText);
  await browser.close();
  return data;
}

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

Шаг 4: Управление отпечатками браузера для избежания блокировок

Антибот-системы обнаруживают автоматизацию. Рандомизируйте свойства браузера для каждой сессии. Playwright позволяет задавать user agent, viewport, часовой пояс и многое другое. Используйте библиотеку вроде playwright-extra с puppeteer-extra-plugin-stealth (совместимо с Playwright через playwright-extra). Или задавайте заголовки вручную.

Пример: запуск с кастомным user agent и viewport:

const browser = await chromium.launch({
  proxy: { server: proxyUrl },
});
const context = await browser.newContext({
  userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
  viewport: { width: 1920, height: 1080 },
  locale: 'en-US',
  timezoneId: 'America/New_York',
});

Ротируйте user agent из списка для каждой сессии.

Шаг 5: Скрапинг динамического контента и обработка пагинации

Playwright автоматически ожидает элементы. Используйте page.waitForSelector для динамического контента. Для бесконечной прокрутки прокручивайте, пока не загрузятся новые элементы.

Пример: скрапинг названий товаров с страницы интернет-магазина с бесконечной прокруткой:

async function scrapeProducts(page) {
  await page.goto('https://example.com/products', { waitUntil: 'networkidle' });
  let previousHeight = 0;
  while (true) {
    const currentHeight = await page.evaluate(() => document.body.scrollHeight);
    if (currentHeight === previousHeight) break;
    previousHeight = currentHeight;
    await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
    await page.waitForTimeout(2000);
  }
  const products = await page.evaluate(() => {
    return Array.from(document.querySelectorAll('.product-title')).map(el => el.innerText);
  });
  return products;
}

Шаг 6: Реализация логики повторных попыток со свежими IP

Когда запрос терпит неудачу (например, CAPTCHA, таймаут), повторите с новым IP. Поскольку ротационные прокси меняют IP при каждом запросе, простого повтора может быть достаточно. Для липких сессий вы можете изменить ID сессии.

async function scrapeWithRetry(url, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const browser = await chromium.launch({ proxy: { server: proxyUrl } });
    try {
      const page = await browser.newPage();
      await page.goto(url, { timeout: 30000 });
      const data = await page.content();
      await browser.close();
      return data;
    } catch (error) {
      console.error(`Attempt ${i + 1} failed: ${error.message}`);
      await browser.close();
    }
  }
  throw new Error(`Failed after ${maxRetries} retries`);
}

Устранение неполадок

  • Ошибка аутентификации: Перепроверьте имя пользователя и пароль. Убедитесь, что они закодированы в URL, если содержат специальные символы.
  • Соединение с прокси отклонено: Проверьте хост и порт прокси. Убедитесь, что ваш IP внесён в белый список, если используете IP-аутентификацию (ChangeMyIP поддерживает имя пользователя/пароль, так что используйте его).
  • CAPTCHA или блокировка: Ротируйте user agents и вводите случайные задержки. Используйте резидентные прокси для лучшей успешности.
  • Низкая производительность: Уменьшите количество экземпляров браузера, используйте headless-режим и блокируйте ненужные ресурсы (изображения, CSS) с помощью page.route.
  • Липкая сессия не работает: Обратитесь к документации ChangeMyIP для правильного формата ID сессии в имени пользователя.

Итог

Вы узнали, как интегрировать резидентные прокси ChangeMyIP с Playwright для продвинутого веб-скрапинга. Ротируя IP, управляя отпечатками браузера и обрабатывая динамический контент, вы можете скрапить в масштабе, избегая блокировок. Не забывайте уважать условия обслуживания веб-сайтов и robots.txt. Сеть резидентных прокси ChangeMyIP предлагает более 40 стран и множество протоколов, что делает её подходящим выбором для этих задач.