Посилання скопійовано!
ПродуктиЦіниСценаріїРішенняРесурсиКомпаніяFAQ
Почати
Головна Блог Автоматична ротація проксі
Гайди

Автоматична ротація проксі: посібник

Як працює ротація зі стабільними 4G-проксі: змінюйте IP на вимогу, перемикайтеся між кількома проксі у власному коді та знайте, коли краще залишити той самий IP.

Ротація розподіляє запити між IP-адресами. Ви можете змінювати IP на вимогу у кабінеті або перемикатися між кількома проксі у власному коді. У цьому посібнику розглянуто обидва способи.

«Ротація проксі» може означати кілька різних речей, і плутанина між ними призводить до розірваних сесій і зайвого трафіку. Нижче — що робить кожна модель, коли її застосовувати, а також код на Python для ротації між кількома проксі з відстеженням стану та окремим темпом для кожного проксі.

Головне
  • Ваш IP лишається тим самим, поки ви працюєте. Це правильний режим за замовчуванням для входу в акаунт, оформлення замовлень і довгих сесій. Після перерви близько 10 хвилин без підключень наступне підключення може отримати інший IP.
  • Змінюйте IP на вимогу між завданнями, а не посеред завдання.
  • Щоб розподілити навантаження, замовте кілька проксі та перемикайтеся між ними у власному коді.
  • Перемикайтеся після помилок і за планом, який ви обрали, і ніколи швидше, ніж дозволяє сайт.
  • Ротація не дає права перевищувати ліміти запитів сайту чи ігнорувати його правила.

1.Три моделі ротації

Провайдери вживають слово «ротація» для різних речей. Ця таблиця розділяє їх і показує, що ви отримуєте в Xameleon.

МодельЯк це працюєПідходить дляУ Xameleon
Sticky IPIP лишається, поки ви працюєтеВходу в акаунт, оформлення замовлень, довгих сесій, моніторингу з порівнянням результатів у часіТак, саме так працює кожен проксі
Зміна на вимогуВи просите новий IP, коли він вам потрібенЧистого старту між завданнямиТак, кнопкою «Змінити IP» у кабінеті; керування через API заплановане
Ротація між вашими проксіВаш код обирає наступний із кількох проксіРозподілу рівномірного навантаження між кількома з’єднаннямиТак, замовте більше одного проксі й перемикайтеся у своєму коді
Ротація за таймером чи з кожним запитомПровайдер сам змінює IP автоматичноНезалежних завдань, де кожен запит може виходити з іншої адресиНе пропонується: IP не змінюється, якщо ви його не змінюєте

Отже, «автоматична ротація проксі» в Xameleon — це ваш власний код, що обирає між кількома проксі, та зміна на вимогу, коли потрібен новий IP. Далі в посібнику показано, як робити і те, і те добре.

2.Зміна IP на вимогу

Ваш IP лишається тим самим, поки ви працюєте, тож вхід чи оформлення замовлення проходять з однієї адреси. Коли потрібен новий IP, натисніть «Змінити IP» у кабінеті: у спільних проксі вас переносять на інший модем тієї самої країни, а в ексклюзивних змінюється IP вашого власного модема. Заплановане API дозволить робити те саме з вашого коду.

Відкриті з’єднання можуть розірватися під час зміни адреси, а новий IP може з’явитися через кілька секунд. Ця функція чекає, поки вихідний IP справді зміниться, перш ніж ваше завдання продовжиться:

import time
import requests

def exit_ip(proxies):
    r = requests.get("https://xameleon.cloud/api/tools/ip", proxies=proxies, timeout=(5, 20))
    r.raise_for_status()
    return r.json()["ip"]

def wait_for_new_ip(proxies, old_ip, attempts=12, pause=5):
    for _ in range(attempts):
        time.sleep(pause)
        try:
            ip = exit_ip(proxies)
        except requests.exceptions.RequestException:
            continue                    # the connection may drop for a moment while the IP changes
        if ip != old_ip:
            return ip
    return None

proxy = "http://USERNAME:PASSWORD@HOST:PORT"
proxies = {"http": proxy, "https": proxy}

old_ip = exit_ip(proxies)
input("Press Change IP in your account, then press Enter... ")
print("New IP:", wait_for_new_ip(proxies, old_ip))

Кожен виклик створює нове з’єднання, тож ніщо не вказує на стару адресу. Якщо ви використовуєте сесії, закрийте їх і відкрийте нові після зміни.

3.Ротація на боці клієнта

Якщо у вас кілька проксі, перебирайте їх у коді по колу.

У кожного проксі в кабінеті власні дані підключення, тому ними можна користуватися одночасно. Найпростіша ротація бере їх по черзі:

from itertools import cycle
import requests

proxy_urls = [
    "http://USER1:PASS1@HOST1:PORT1",
    "http://USER2:PASS2@HOST2:PORT2",
    "http://USER3:PASS3@HOST3:PORT3",
]
turns = cycle(proxy_urls)

urls = ["https://example.com/page/1", "https://example.com/page/2", "https://example.com/page/3"]

for url in urls:
    proxy = next(turns)
    r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=(5, 20))
    print(url, r.status_code)

Закодуйте спеціальні символи в логіні й паролі кожного проксі відсотковим кодуванням, як у посібнику з проксі в Python. У ньому також розглянуто сесії, тайм-аути та повторні спроби.

Хочете побачити, як це працює для вашого проєкту?
Розкажіть про свій сценарій, і ми запропонуємо налаштування.
Переглянути ціни

4.Змінюйте проксі через помилки, а не без причини

Переходьте до наступного проксі після збою чи відповіді про перевищення ліміту й чекайте перед повтором. Швидша ротація, ніж дозволяє сайт, не робить надмірний трафік прийнятним.

Що ви отримуєтеЩо це означаєЩо робити
200Запит виконаноПродовжуйте з тим самим проксі
429 або 503, часто з Retry-AfterСайт просить вас зменшити темпДайте цьому проксі перепочити, зачекайте щонайменше вказаний у Retry-After час і зменште темп
403Сайт відмовляє в запитіЗупиніться й прочитайте умови сайту та robots.txt. Більше проксі — не вихід
407Проксі відхилив ваші облікові даніВиправте облікові дані: ротація не допоможе
Помилка з’єднання або тайм-аутПроблема з проксі чи мережеюДайте проксі перепочити й повторіть запит через інший після короткої паузи
5xxУ сайту проблемаПовторіть пізніше зі зростаючою затримкою

Невеликий клас-пул веде облік. Він видає проксі по черзі й дає тому, що збоїть, перепочити:

import itertools
import time

class ProxyPool:
    """Hands out proxies in turn and lets the ones that fail rest for a while."""

    def __init__(self, proxy_urls, cooldown=60):
        self.urls = list(proxy_urls)
        self.cooldown = cooldown
        self.resting_until = {}                     # proxy URL -> time it may be used again
        self._turns = itertools.cycle(self.urls)

    def get(self):
        for _ in range(len(self.urls)):
            url = next(self._turns)
            if self.resting_until.get(url, 0) <= time.monotonic():
                return url
        raise RuntimeError("every proxy is resting: wait or add more proxies")

    def rest(self, url):
        self.resting_until[url] = time.monotonic() + self.cooldown

pool = ProxyPool(proxy_urls, cooldown=60)

5.Sticky-сесії для багатокрокових процесів

Залишайте той самий IP на весь процес входу чи оформлення замовлення й змінюйте його лише після завершення. Зміна IP посеред процесу може розірвати сесію.

Дайте кожному процесу власну сесію, прив’язану до одного проксі. Тоді cookie та IP лишаються разом, і між проксі нічого не перетікає:

def run_flow(proxy_url, steps):
    """Runs every step of one flow through the same proxy, the same IP and the same cookies."""
    with requests.Session() as session:
        session.proxies.update({"http": proxy_url, "https": proxy_url})
        for step in steps:
            step(session)

def open_home(session):
    session.get("https://example.com/", timeout=(5, 20))

def open_account(session):
    session.get("https://example.com/account", timeout=(5, 20))

flows = [[open_home, open_account], [open_home, open_account]]

for flow in flows:
    run_flow(pool.get(), flow)           # rotate between flows, never inside one

6.Задайте ліміти для ротації проксі

Обмежте паралельність на один проксі, додайте затримки та дотримуйтесь лімітів частоти запитів цільових сайтів.

Три обмеження роблять ротацію коректною. Задайте окремий темп для кожного проксі, не запускайте більше потоків, ніж дозволяє кількість одночасних з’єднань вашого тарифу, і стежте за використаним трафіком. Кілька проксі розподіляють навантаження, але правила сайту стосуються всього навантаження.

import threading
import time

class RateLimiter:
    """Lets one request through every <interval> seconds for each key (a proxy or a site)."""

    def __init__(self, interval):
        self.interval = interval
        self.next_slot = {}
        self.lock = threading.Lock()

    def wait(self, key):
        with self.lock:
            now = time.monotonic()
            slot = max(self.next_slot.get(key, now), now)
            self.next_slot[key] = slot + self.interval
        time.sleep(slot - now)

limiter = RateLimiter(interval=2.0)      # one request every 2 seconds per proxy

7.Збираємо все разом

Ця функція fetch бере наступний проксі, що не відпочиває, чекає черги цього проксі, дає йому перепочити в разі проблем і пробує інший. Пул потоків виконує її із заданою кількістю потоків:

from concurrent.futures import ThreadPoolExecutor
import requests

def fetch(url, attempts=3):
    for _ in range(attempts):
        proxy = pool.get()
        limiter.wait(proxy)                                  # pace every proxy separately
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=(5, 20))
        except requests.exceptions.RequestException:
            pool.rest(proxy)                                 # a connection problem: let this proxy rest
            continue
        if r.status_code in (407, 429, 503):                 # wrong credentials, or the site asks us to slow down
            pool.rest(proxy)
            continue
        return r
    return None

urls = [f"https://example.com/page/{i}" for i in range(1, 7)]

with ThreadPoolExecutor(max_workers=3) as workers:           # no more workers than your plan allows
    for url, r in zip(urls, workers.map(fetch, urls)):
        print(url, r.status_code if r else "gave up")

Пул спільний для потоків, що нормально для кількох виконавців. Для великого краулера додайте навколо нього м’ютекс або скористайтеся чергою. Як задати бюджет запитів на все завдання, показано в матеріалі про веб-скрейпінг у великому масштабі.

8.Типові помилки

  • Зміна IP посеред процесу. Вхід в акаунт і оформлення замовлення можуть зламатися, коли адреса змінюється просто під ними.
  • Ротація на кожен запит без причини. Вона додає з’єднання, ламає cookie й не підвищує ліміти сайту.
  • Одна сесія на кілька проксі. Cookie, отримані через один IP, потрапляють у запити, що виходять з іншого. Використовуйте одну сесію на проксі.
  • Нескінченні повтори. Зупиняйтеся після кількох спроб і давайте проксі перепочити. Ніколи не повторюйте 407 чи 403 у циклі.
  • Ігнорування Retry-After. Коли сайт каже, скільки чекати, чекайте.
  • Відсутність перевірки результату. Після зміни переконайтеся, що вихідний IP новий, перш ніж продовжувати.

9.Часті запитання

Чи змінює Xameleon мій IP автоматично?

Ні. Ваш IP лишається тим самим, поки ви працюєте, що добре для входу в акаунт і довгих завдань. Змінюйте його на вимогу в кабінеті; керування через API заплановане. Автоматична ротація в цьому посібнику означає, що ваш власний код обирає між кількома проксі.

Скільки проксі мені потрібно?

Розділіть потрібну кількість запитів на хвилину на темп, який один проксі може безпечно витримувати в межах лімітів сайту. Наприклад, для 120 запитів на хвилину з одним запитом кожні 2 секунди на проксі (30 на хвилину) потрібно чотири проксі. Почніть з малого й вимірюйте.

Чи потрібно змінювати проксі на кожен запит?

Зазвичай ні. Залишайте один проксі на весь процес чи пакет запитів, а перемикайтеся між процесами.

Чи підвищує ротація ліміти запитів сайту?

Ні. Ротація розподіляє законне навантаження між вашими з’єднаннями. Вона не дає права перевищувати ліміти запитів сайту чи ігнорувати його правила.

Як дізнатися, що IP змінився?

Викличте ендпоінт IP до й після зміни та порівняйте результати. Саме це робить функція wait_for_new_ip вище.

Що буде з відкритими з’єднаннями, коли я змінюю IP?

Вони можуть розірватися. Закрийте старі сесії й почніть нові після зміни.

Лишилися запитання про мобільні проксі? Відвідайте нашу сторінку FAQ щоб отримати детальні відповіді, або зверніться до нашої підтримки — ми допоможемо.

Автоматична ротація проксі: головне та наступні кроки

Щоб налаштувати автоматичну ротацію проксі, спершу визначте, де саме вона відбувається. Коли ви змінюєте IP на вимогу, ви натискаєте «Змінити IP» у кабінеті, а ваш код лишається простим. За ротації на стороні клієнта скрипт перебирає список проксі й сам вирішує, коли перемикатися.

Який спосіб ротації обрати?

Змінюйте IP на вимогу між незалежними завданнями, наприклад, коли перевіряєте багато карток товарів окремими запусками. Ротацію на стороні клієнта — коли самі керуєте кількома проксі й хочете перемикатися після невдалого запиту, зробивши паузу перед повтором. Обидва способи можна поєднувати. 4G мобільні проксі Xameleon зберігають ваш IP, поки ви працюєте, і дають змогу змінити його на вимогу, а REST API з керуванням ротацією заплановано: долучайтеся до списку очікування на сторінці API для керування проксі.

Як sticky-сесії вписуються в ротацію?

Ротація підходить для незалежних запитів. Коли завдання складається з кількох кроків, наприклад із входу й перегляду кількох сторінок, залишайте весь процес на тому самому IP і змінюйте його, коли процес завершиться. Ротація не змінює того, який обсяг запитів сайт вважає прийнятним, тому обмежте паралельність на проксі, додайте затримки й дотримуйтесь лімітів кожного цільового сайту, як описано в матеріалі про веб-скрейпінг у масштабі. Для коду почніть із посібника з проксі в Python.