Skip to content
Advanced / 4 min read

Как ротировать резидентные прокси IPRoyal с Playwright на Linux для веб-скрапинга

Используйте резидентные прокси IPRoyal с Playwright на Linux для скрапинга через браузер. Это продвинутое руководство охватывает HTTP- и SOCKS5-эндпоинты, липкие сессии, таргетинг по странам, ротацию и проверку.

Linux SOCKS5 HTTP(S) Веб-скрейпинг

Как ротировать резидентные прокси IPRoyal с Playwright на Linux для веб-скрапинга

Обзор

Playwright — это фреймворк для автоматизации браузера, который может управлять Chromium, Firefox и WebKit. Для веб-скрапинга автоматизация браузера полезна, когда целевой сайт зависит от JavaScript, cookie или динамического рендеринга. Резидентные прокси IPRoyal дают вам ротацию IP из большого пула, а IPRoyal также предлагает датацентровые и ISP-прокси с разными компромиссами. Это руководство показывает, как подключить Playwright на Linux к резидентным прокси IPRoyal через HTTP или SOCKS5, ротировать сессии, использовать липкие сессии, применять геотаргетинг и проверять выходной IP. Оно написано для продвинутой работы с автоматизацией браузера, где вы уже понимаете Python, асинхронный код и базовую аутентификацию прокси.

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

  • Машина или сервер Linux с графической средой или безголовым окружением.
  • Python 3.10 или новее.
  • Аккаунт IPRoyal с учётными данными резидентного прокси из панели IPRoyal.
  • Хост, порт, имя пользователя и пароль для вашего прокси-эндпоинта IPRoyal.
  • Базовое знакомство с Python, async/await и Playwright.
  • Разрешение на скрапинг целевого сайта и ознакомление с его условиями и robots.txt.

Как Playwright использует прокси IPRoyal

Playwright может отправлять трафик через прокси на уровне запуска браузера или на уровне контекста браузера. Резидентные прокси IPRoyal используют аутентификацию по имени пользователя и паролю. Точные параметры хоста, порта и имени пользователя берутся из вашей панели IPRoyal.

Используйте следующую таблицу, чтобы выбрать значение server в Playwright:

Тип прокси IPRoyal Значение server в Playwright Примечания
Резидентный HTTP/HTTPS http://HOST:PORT Обычный выбор для автоматизации браузера; работает с HTTPS-целями.
Резидентный SOCKS5 socks5://HOST:PORT Используйте, если ваш тариф IPRoyal предоставляет SOCKS5-эндпоинт или у вас включён SOCKS5.
Датацентровый http://HOST:PORT или socks5://HOST:PORT Быстрее и дешевле, но чаще блокируется на чувствительных целях.
ISP http://HOST:PORT или socks5://HOST:PORT Статические или липкие IP могут помочь в сценариях с авторизацией.
Shadowsocks Локальный SOCKS5-слушатель Playwright не поддерживает Shadowsocks напрямую. Запустите локальный клиент Shadowsocks и укажите Playwright на его SOCKS5-порт.

IPRoyal указывает HTTP, SOCKS5 и Shadowsocks среди поддерживаемых протоколов, так что позже вы сможете сочетать автоматизацию браузера с другими инструментами.

Шаги

1. Установите Playwright и Chromium на Linux

Создайте изолированное окружение Python и установите Playwright с Chromium.

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install playwright python-dotenv
python -m playwright install --with-deps chromium

Флаг --with-deps устанавливает системные библиотеки, необходимые Chromium в Debian и Ubuntu. В других дистрибутивах установите эквивалентные зависимости Chromium или используйте Docker-образ Playwright.

2. Безопасно храните учётные данные прокси IPRoyal

Создайте файл .env в каталоге проекта. Не добавляйте его в систему контроля версий.

IPROYAL_PROXY_HOST=your-iproyal-host
IPROYAL_PROXY_PORT=your-iproyal-port
IPROYAL_PROXY_USER=your-iproyal-username
IPROYAL_PROXY_PASS=your-iproyal-password
IPROYAL_PROXY_SCHEME=http

Используйте точные значения из вашей панели IPRoyal. Установите IPROYAL_PROXY_SCHEME в http для HTTP/HTTPS-эндпоинтов или socks5 для SOCKS5-эндпоинтов.

3. Создайте переиспользуемый помощник для прокси

Создайте proxy_config.py. Этот помощник читает ваши учётные данные и создаёт словарь, который ожидает Playwright.

import os
from dataclasses import dataclass
from dotenv import load_dotenv

load_dotenv()

@dataclass(frozen=True)
class ProxyConfig:
    server: str
    username: str
    password: str

def iproyal_proxy(
    session_id: str | None = None,
    country: str | None = None,
) -> ProxyConfig:
    '''
    Создаёт словарь прокси Playwright для IPRoyal.

    Синтаксис session и country должен совпадать с вашей панелью IPRoyal.
    Примеры ниже показывают только распространённые шаблоны. Замените f-строки
    на точный формат, который даёт IPRoyal.
    '''
    host = os.environ['IPROYAL_PROXY_HOST']
    port = os.environ['IPROYAL_PROXY_PORT']
    scheme = os.environ.get('IPROYAL_PROXY_SCHEME', 'http')
    username = os.environ['IPROYAL_PROXY_USER']
    password = os.environ['IPROYAL_PROXY_PASS']

    if country:
        # Только пример шаблона. Проверьте точный синтаксис в панели IPRoyal.
        username = f'{username}-country-{country}'
    if session_id:
        # Только пример шаблона. Липкие сессии обычно добавляют токен сессии.
        username = f'{username}-session-{session_id}'

    return ProxyConfig(
        server=f'{scheme}://{host}:{port}',
        username=username,
        password=password,
    )

Если ваше имя пользователя IPRoyal уже содержит параметры таргетинга, не дублируйте их. Используйте формат, показанный в панели, и адаптируйте помощник.

4. Запустите Playwright с ротируемым прокси IPRoyal

Создайте browser_check.py. Запустите Chromium с прокси и проверьте выходной IP.

import asyncio
from playwright.async_api import async_playwright
from proxy_config import iproyal_proxy

async def main() -> None:
    proxy = iproyal_proxy()
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            proxy={
                'server': proxy.server,
                'username': proxy.username,
                'password': proxy.password,
            },
        )
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
        print(await page.locator('body').inner_text())
        await browser.close()

if __name__ == '__main__':
    asyncio.run(main())

Запустите так:

python browser_check.py

Если JSON-ответ показывает IP, который не ваш, прокси работает. Если вы не указываете session ID, ротируемый резидентный эндпоинт должен возвращать разные IP при новых запросах или новых сессиях.

5. Добавьте липкие сессии для многошаговых сценариев

Некоторые сценарии, например заполнение корзины или прохождение многошаговой формы, требуют одного и того же выходного IP для нескольких запросов. Используйте токен липкой сессии из вашей панели IPRoyal.

async def sticky_session_example() -> None:
    proxy = iproyal_proxy(session_id='checkout-001')
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            proxy={
                'server': proxy.server,
                'username': proxy.username,
                'password': proxy.password,
            },
        )
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
        print(await page.locator('body').inner_text())
        await browser.close()

Сохраняйте один и тот же session_id для всего сценария. Используйте новый session ID, когда хотите получить новый выходной IP. Время жизни и доступность липкой сессии зависят от вашего тарифа IPRoyal и настроек панели.

6. Применяйте таргетинг по стране и городу

Таргетинг по стране обычно передаётся через имя пользователя прокси. Используйте точный код страны и формат параметра из вашей панели IPRoyal.

proxy = iproyal_proxy(country='us')

Если IPRoyal предоставляет таргетинг по городу для вашего тарифа, добавьте его туда же, где вы добавляете параметр страны. Не угадывайте формат; скопируйте его из панели. Проверьте результат, проверив выходной IP через сервис геолокации IP.

7. Ротация между параллельными контекстами браузера

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

import asyncio
from playwright.async_api import async_playwright
from proxy_config import iproyal_proxy

async def scrape_with_contexts(urls: list[str]) -> list[str]:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)

        async def one(url: str, idx: int) -> str:
            proxy = iproyal_proxy(session_id=f'job-{idx}')
            context = await browser.new_context(
                proxy={
                    'server': proxy.server,
                    'username': proxy.username,
                    'password': proxy.password,
                }
            )
            page = await context.new_page()
            await page.goto(url, wait_until='domcontentloaded', timeout=60000)
            title = await page.title()
            await context.close()
            return title

        results = await asyncio.gather(*(one(url, i) for i, url in enumerate(urls)))
        await browser.close()
        return results

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

8. Проверяйте выходной IP перед каждой крупной задачей

Добавьте небольшой шаг проверки в ваш скрапер. Проверяйте выходной IP в начале задачи и сравнивайте его с ожидаемой страной или поведением сессии.

async def verify_exit_ip(page) -> str:
    await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
    body = await page.locator('body').inner_text()
    print(body)
    return body

Если IP неверный, исправьте имя пользователя прокси или параметры сессии перед запуском полного обхода.

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

Симптом Вероятная причина Исправление
407 Proxy Authentication Required Неверное имя пользователя, неверный пароль или учётные данные переданы неправильно Подтвердите имя пользователя и пароль IPRoyal. Используйте поля username и password в Playwright, вместо встраивания учётных данных в URL сервера.
net::ERR_PROXY_CONNECTION_FAILED Неверный хост, порт или схема; брандмауэр блокирует порт прокси Проверьте хост и порт в панели IPRoyal. Попробуйте HTTP и SOCKS5 по отдельности. Протестируйте с помощью curl перед использованием Playwright.
Один и тот же выходной IP при каждом запросе Активна липкая сессия или эндпоинт не ротируется Удалите session ID, создайте новую сессию или проверьте настройки ротации IPRoyal.
SOCKS5 не работает, но HTTP работает Неверная схема или порт Используйте socks5://HOST:PORT и SOCKS5-порт из панели.
Ошибка подключения Shadowsocks Playwright не поддерживает Shadowsocks нативно Запустите локальный клиент Shadowsocks и укажите Playwright на его локальный SOCKS5-слушатель.
Сайт показывает капчи или блокировки Слишком много запросов на IP, несоответствие отпечатка браузера или датацентровые IP на чувствительной цели Замедлитесь, используйте резидентные прокси, ротируйте сессии, переиспользуйте реалистичные контексты и соблюдайте правила целевого сайта.

Быстрая проверка из командной строки может отделить проблемы прокси от проблем Playwright:

curl -x 'http://USERNAME:PASSWORD@HOST:PORT' https://httpbin.org/ip

Если пароль содержит специальные символы, закодируйте его в URL или используйте опцию --proxy-user в curl.

Итог

Вы можете использовать резидентные прокси IPRoyal с Playwright на Linux, сохраняя учётные данные в .env, создавая переиспользуемый помощник для прокси, запуская Chromium или контекст браузера со словарём прокси и ротируя сессии или используя липкие сессии по мере необходимости. Используйте HTTP для простоты, SOCKS5 — когда он нужен, и локальный клиент Shadowsocks — только когда ваш сценарий требует туннелирования в стиле Shadowsocks. Проверяйте выходной IP перед крупными задачами, начинайте с низкой параллельности и настраивайте ротацию и геотаргетинг, используя точный синтаксис из вашей панели IPRoyal. IPRoyal — предлагаемый провайдер резидентных, датацентровых и ISP-прокси, но всегда сравнивайте размер пула, цену и совместимость с целями, прежде чем останавливаться на стеке для скрапинга.