Przewodnik po Pythonie · 2 min czytania

Jak rotować proxy w Pythonie (requests i aiohttp)

Rotacja to różnica między scraperem, który ma zbanowany jeden adres IP, a takim, który rozkłada obciążenie na wiele. Oto działający rotator zarówno dla synchronizowanych żądań, jak i asynchronicznego aiohttp, z kontrolą stanu i automatycznym wycofywaniem martwych wyjść.

Co rotacja faktycznie rozwiązuje

Serwisy ograniczają liczbę żądań i blokują po IP. Jeśli każde żądanie pochodzi z jednego adresu, szybko osiągasz limit, a pojedyncza blokada zatrzymuje całą pracę. Rotacja rozkłada żądania na pulę wyjść, dzięki czemu obciążenie na IP pozostaje poniżej progu, a jedno martwe lub zablokowane wyjście kosztuje cię tylko ponowne próby, a nie całą operację. Dwa projekty obejmują prawie wszystko: round-robin (cykl przez pulę w kolejności, przewidywalne i równe) oraz random (wybór na każde żądanie, proste i bezstanowe).

Pula sama w sobie może pochodzić z dwóch miejsc. Możesz wymienić kilka punktów końcowych s4m i portów i rotować między nimi, lub, dla szybkich testów o niskim ryzyku, pobierać na żywo wpisy z darmowej publicznej listy proxy — filtrowane według kraju, protokołu i anonimowości, chociaż te proxy zewnętrzne są używane na własne ryzyko i często padają. Rotacja produkcyjna powinna opierać się na uwierzytelnionych proxy z datacenter od s4m (SOCKS5 na 1080, HTTP na 3128, USER:PASS), które są stabilne i są mierzone, więc skalowanie puli jest tanie. To bezpośrednio opiera się na scrapingu z żądaniami.

Rotator dla żądań i aiohttp

Pula, która działa w trybie round-robin, ponawia próby w przypadku niepowodzenia i wycofuje wyjścia, które ciągle zawodzą. Wersje synchroniczne i asynchroniczne. Zastąp USER:PASS.

python
import asyncio, itertools, random
import requests, aiohttp
from aiohttp_socks import ProxyConnector  # pip install aiohttp-socks

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",
    f"http://{USER}:{PASS}@{HOST}:3128",
    # add more endpoints/ports here to widen the pool
]

# ---------- Synchronous: requests + round-robin + retirement ----------
class Rotator:
    def __init__(self, pool):
        self.alive = list(pool)
        self.fails = {p: 0 for p in pool}
        self._cycle = itertools.cycle(self.alive)

    def pick(self):
        return next(self._cycle)

    def retire(self, proxy):
        self.fails[proxy] += 1
        if self.fails[proxy] >= 3 and proxy in self.alive:
            self.alive.remove(proxy)
            self._cycle = itertools.cycle(self.alive or POOL)

def get(url, rot, retries=4):
    for _ in range(retries):
        proxy = rot.pick()
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy},
                             timeout=(5, 20))
            r.raise_for_status()
            return r
        except requests.RequestException:
            rot.retire(proxy)
    raise SystemExit("pool exhausted")

rot = Rotator(POOL)
print(get("https://api.ipify.org", rot).text)

# ---------- Async: aiohttp, one connector per proxy ----------
async def fetch(url, proxy):
    connector = ProxyConnector.from_url(proxy)
    async with aiohttp.ClientSession(connector=connector) as s:
        async with s.get(url, timeout=aiohttp.ClientTimeout(total=25)) as r:
            return await r.text()

async def main():
    tasks = [fetch("https://api.ipify.org", random.choice(POOL))
             for _ in range(5)]
    for ip in await asyncio.gather(*tasks, return_exceptions=True):
        print(ip)

asyncio.run(main())

Wybory projektowe, które mają znaczenie

Regulatory, które decydują, czy rotacja pomaga, czy tylko dodaje zamieszania.

Round-robin vs losowe

Round-robin równomiernie rozkłada obciążenie i jest łatwy do zrozumienia; losowy jest bezstanowy i prosty. Oba są lepsze niż jedno stałe wyjście — wybierz round-robin, gdy równomierne rozłożenie ma znaczenie.

Wycofaj martwe wyjścia

Zliczaj kolejne niepowodzenia dla każdego proxy i odrzucaj exit po kilku próbach, aby pula samoczynnie się regenerowała zamiast próbować w nieskończoność.

Sprawdzenie stanu przed użyciem

Okresowo uderzaj w punkt końcowy IP-echo przez każde proxy i zachowuj tylko te, które odpowiadają. Niezbędne, gdy pula zawiera zmienne wpisy z darmowej listy.

Cofnij się, nie sprintuj

Rotacja nie jest licencją na zalewanie. Dodaj opóźnienia na poziomie hosta i wykładnicze opóźnienie, aby pozostać poniżej limitów, zamiast walczyć z nimi na wielu IP.

Sticky sessions i szczere limity

Rotacja nie zawsze jest tym, czego chcesz. Niektóre przepływy — logowanie, koszyk, formularz wieloetapowy — potrzebują tego samego adresu IP przez całą sesję, w przeciwnym razie strona widzi użytkownika teleportującego się między adresami i blokuje to. To jest sesja trwała: rotuj między zadaniami, pozostawaj stały w jednym. Gdy przepływ pracy potrzebuje jednego gwarantowanego stabilnego adresu, dodaj dedykowany osobisty adres IP zamiast rotacji.

Bądź szczery co do ograniczeń. Proxies s4m są z centrum danych, więc ich rotacja pomaga w ograniczeniach prędkości i nawet obciążeniu, ale nie ukryje adresów IP z centrum danych przed systemem anty-botowym, który blokuje cały zakres. Rotacja również nic nie zmienia w kwestii odcisków przeglądarki czy wzorców żądań. Używaj tego jako jednej warstwy: połącz to z realistycznymi nagłówkami, opóźnieniem i poszanowaniem zasad każdej strony. Do asynchronicznych elementów będziesz potrzebować aiohttp-socks dla wsparcia SOCKS5; weryfikuj wyjścia za pomocą narzędzi i automatyzuj obsługę poświadczeń przez API.

FAQ

Pytania, odpowiedzi

Jak obracać proxy z żądaniami?

Zachowaj listę adresów URL proxy i wybierz jeden na każde żądanie — round-robin lub losowo — przekazując go jako argument proxy. Wycofaj wyjście po kilku kolejnych niepowodzeniach, aby pula mogła się samodzielnie naprawić. Powyższy przykład pokazuje kompletny rotator.

Jak rotować proxy z aiohttp?

aiohttp ustawia proxy na żądanie dla HTTP, ale dla SOCKS5 budujesz ProxyConnector (z aiohttp-socks) dla każdego proxy i tworzysz sesję z nim. Rozłóż zadania po puli za pomocą asyncio.gather.

Kiedy NIE powinienem rotować proxy?

Gdy workflow wymaga spójnej tożsamości — logowania, koszyków, formularzy wieloetapowych. Zmiana adresów IP w trakcie sesji wygląda podejrzanie i jest blokowana. Użyj sesji sticky lub dedykowanego IP dla tych przepływów.

Czy rotacyjne proxy w centrum danych unikną wszystkich blokad?

Nie. Rotacja rozkłada obciążenie i omija limity na IP, ale zakresy centrów danych mogą być nadal oznaczane hurtowo przez agresywne systemy anty-botowe, a rotacja nie zmienia twojego odcisku palca przeglądarki ani zachowania.

Rotuj przez prawdziwe wyjścia

Poszerz swoją pulę o uwierzytelnione datacenter SOCKS5 i HTTP proxy na proxy.s4m.online, rozliczane, więc skalowanie jest tanie. Dodaj dedykowany IP dla kroków z sesją sticky.

Ludzie znaleźli tę stronę, szukając

Rzeczywiste frazy wyszukiwania, na które ta strona odpowiada — powiązane otwierają stronę, która je szczegółowo omawia.