Автоматична ротація проксі: посібник
Як працює ротація зі стабільними 4G-проксі: змінюйте IP на вимогу, перемикайтеся між кількома проксі у власному коді та знайте, коли краще залишити той самий IP.
Ротація розподіляє запити між IP-адресами. Ви можете змінювати IP на вимогу у кабінеті або перемикатися між кількома проксі у власному коді. У цьому посібнику розглянуто обидва способи.
«Ротація проксі» може означати кілька різних речей, і плутанина між ними призводить до розірваних сесій і зайвого трафіку. Нижче — що робить кожна модель, коли її застосовувати, а також код на Python для ротації між кількома проксі з відстеженням стану та окремим темпом для кожного проксі.
- Ваш IP лишається тим самим, поки ви працюєте. Це правильний режим за замовчуванням для входу в акаунт, оформлення замовлень і довгих сесій. Після перерви близько 10 хвилин без підключень наступне підключення може отримати інший IP.
- Змінюйте IP на вимогу між завданнями, а не посеред завдання.
- Щоб розподілити навантаження, замовте кілька проксі та перемикайтеся між ними у власному коді.
- Перемикайтеся після помилок і за планом, який ви обрали, і ніколи швидше, ніж дозволяє сайт.
- Ротація не дає права перевищувати ліміти запитів сайту чи ігнорувати його правила.
1.Три моделі ротації
Провайдери вживають слово «ротація» для різних речей. Ця таблиця розділяє їх і показує, що ви отримуєте в Xameleon.
| Модель | Як це працює | Підходить для | У Xameleon |
|---|---|---|---|
| Sticky IP | IP лишається, поки ви працюєте | Входу в акаунт, оформлення замовлень, довгих сесій, моніторингу з порівнянням результатів у часі | Так, саме так працює кожен проксі |
| Зміна на вимогу | Ви просите новий 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 one6.Задайте ліміти для ротації проксі
Обмежте паралельність на один проксі, додайте затримки та дотримуйтесь лімітів частоти запитів цільових сайтів.
Три обмеження роблять ротацію коректною. Задайте окремий темп для кожного проксі, не запускайте більше потоків, ніж дозволяє кількість одночасних з’єднань вашого тарифу, і стежте за використаним трафіком. Кілька проксі розподіляють навантаження, але правила сайту стосуються всього навантаження.
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 proxy7.Збираємо все разом
Ця функція 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 щоб отримати детальні відповіді, або зверніться до нашої підтримки — ми допоможемо.