Rotating Proxies sa Python: requests, httpx at aiohttp (2026 Gabay)

Na-publish noong 2 Hunyo 2026 · ≈10 min na pagbasa

Kung nag-i-scrape, nag-cra-crawl, o nag-a-automate ka ng kahit ano sa scale gamit ang Python, sooner or later mapapansin ng target site na ang bawat request ay nagmumula sa iisang IP at isasara ka. Ang rotating proxies sa Python ay nagkakalat ng iyong traffic sa maraming IP address kaya walang iisa ang tumatama sa rate limit o nakakakuha ng ban. Ipinapakita ng gabay na ito ang eksaktong code para sa requests, httpx, at aiohttp, kasama kung paano pumili sa pagitan ng rotating gateway at managed IP pool.

Dalawang cross-cutting na desisyon ang humuhubog sa lahat ng nasa ibaba. Una: rotating vs sticky sessions — bagong IP kada request, o isang IP na hinahawakan para sa multi-step na flow. Pangalawa: residential vs datacenter IPs — tingnan ang proxy-type decision matrix. Tamain mo ang dalawang iyon at ang code ang madaling bahagi.

Dalawang Paraan ng Pag-rotate

1. Gateway rotation (inirerekomenda). Kumokonekta ka sa iisang endpoint at binibigyan ka ng provider ng sariwang exit IP sa bawat bagong connection. Walang listahan na pamamahalaan, walang patay na IP na aalisin. Ganito gumagana ang dynamic residential pool ng JIBAO: parehong host at port, bagong IP kada request.

2. Self-managed IP list. Hinahawakan mo ang listahan ng mga host:port entry at pumipili ng isa kada request. Mas maraming kontrol, pero ikaw ang may-ari ng health-checking, retries, at ban-tracking. Kapaki-pakinabang sa dedicated datacenter IPs kapag kailangan mo ng kilala at stable na address.

Pag-rotate gamit ang requests

Ang pinakasimpleng kaso — iruta ang isang request sa pamamagitan ng gateway na nag-rorotate para sa iyo. Gamitin ang socks5h:// (ang nahuhuling h ay nangangahulugang ang DNS ay niri-resolve sa proxy side, na umiiwas sa pag-leak ng lookups):

import requests

# JIBAO rotating residential gateway: a new exit IP per connection
PROXY = "socks5h://USERNAME:[email protected]:10001"

proxies = {"http": PROXY, "https": PROXY}

for _ in range(5):
    r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=30)
    print(r.json()["origin"])   # a different IP each loop

Kailangan mong magsalita ang requests ng SOCKS5? I-install ang extra: pip install "requests[socks]". Kung mas gusto mo ang HTTP proxy endpoint, palitan ang scheme sa http:// — pareho ang natitira.

Pag-rotate mula sa sarili mong IP list

import random
import requests

PROXY_POOL = [
    "socks5h://USERNAME-country-us:[email protected]:10001",
    "socks5h://USERNAME-country-uk:[email protected]:10001",
    "socks5h://USERNAME-country-de:[email protected]:10001",
]

def fetch(url):
    proxy = random.choice(PROXY_POOL)
    return requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)

resp = fetch("https://example.com")
print(resp.status_code)

Sticky sessions kapag kailangan mong panatilihin ang isang IP

Ang login flows, carts, at paginated results ay nasisira kung magbago ang IP sa gitna ng task. I-pin ang isang IP sa pamamagitan ng pagdagdag ng session token sa username; gamitin muli ang parehong token para panatilihin ang parehong exit IP sa buong buhay nito:

import requests

SESSION_ID = "task-0001"
PROXY = f"socks5h://USERNAME-session-{SESSION_ID}:[email protected]:10001"

s = requests.Session()
s.proxies = {"http": PROXY, "https": PROXY}

s.post("https://example.com/login", data={"u": "me", "p": "secret"})
s.get("https://example.com/dashboard")   # same IP, session intact

Pag-rotate gamit ang httpx

Ang httpx ay nagbibigay sa iyo ng modernong client na may HTTP/2 at native async. Tandaan na ang mga bagong bersyon ay kumukuha ng iisang proxy= argument:

import httpx

PROXY = "socks5h://USERNAME:[email protected]:10001"

with httpx.Client(proxy=PROXY, timeout=30) as client:
    for _ in range(5):
        print(client.get("https://httpbin.org/ip").json()["origin"])

Ang SOCKS support sa httpx ay nangangailangan ng pip install "httpx[socks]". Para sa HTTP/2, idagdag ang http2=True sa client — pinapaitsura nito ang iyong traffic na mas parang tunay na browser, na bagay na bagay sa TLS fingerprint matching.

Concurrent rotation gamit ang aiohttp

Para sa high throughput, magpaputok ng maraming request nang sabay. Bawat connection sa pamamagitan ng gateway ay nakakakuha ng sariling exit IP, kaya magkasama ang concurrency at rotation:

import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector

PROXY = "socks5://USERNAME:[email protected]:10001"

async def fetch(url):
    connector = ProxyConnector.from_url(PROXY)
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get(url, timeout=aiohttp.ClientTimeout(total=30)) as r:
            return await r.text()

async def main():
    urls = ["https://httpbin.org/ip"] * 20
    results = await asyncio.gather(*(fetch(u) for u in urls))
    print(f"fetched {len(results)} pages")

asyncio.run(main())

I-install ang SOCKS connector gamit ang pip install aiohttp_socks. Bumuo ng bagong connector kada task para magbukas ang bawat request ng bagong proxied connection.

Retry Logic na Talagang Nakakatulong

Sulit lang ang rotation kung muli mong susubukan ang mga failure sa bagong IP. Mag-back off nang exponential at i-rotate ang session token sa bawat attempt:

import requests
from time import sleep

def fetch_with_retry(url, max_retries=4):
    for attempt in range(max_retries):
        proxy = f"socks5h://USERNAME-session-r{attempt}:[email protected]:10001"
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
            if r.status_code in (403, 429):
                raise requests.HTTPError(f"blocked: {r.status_code}")
            r.raise_for_status()
            return r.text
        except requests.RequestException:
            sleep(2 ** attempt)        # 1s, 2s, 4s, 8s
    raise RuntimeError(f"failed after {max_retries} tries: {url}")

I-verify na Gumagana ang Iyong Rotation

Bago ang malaking run, kumpirmahin na talagang nagbabago ang IP. I-hit ang isang echo endpoint nang ilang beses at i-check na magkaiba ang mga IP. Para kumpirmahin din na hindi ka ipinagkakanulo ng iyong TLS fingerprint, patakbuhin ang request laban sa libreng JA3/TLS fingerprint checker ng JIBAO — ang rotating IP na may halatang Python fingerprint ay nababara pa rin.

Best Practices

Kapag matatag na ang rotation, ang susunod na pader na haharapin mo ay kadalasang fingerprinting, hindi IP. Kung ang malinis na residential IPs ay nakakakuha pa rin ng 403, basahin ang kung paano i-bypass ang TLS fingerprinting gamit ang curl_cffi at ang buong Cloudflare bypass recipe.

Kumuha ng Rotating Residential Proxies

Kumuha ng 500MB ng libreng traffic at isang rotating residential gateway na nagbibigay sa iyo ng bagong IP sa bawat request.

Simulan ang Libreng Trial

Para sa lahat ng IP products · napakalaking pool ng nodes na available anumang oras

Magrehistro ngayon at makakuha ng hanggang 100% na rebate sa iyong recharge

Ang mga bagong user ay makakatanggap ng 500MB sa pagrehistro, kasama ang bonus sa unang recharge. Limitadong oras lang ang alok.