หมุนพร็อกซีใน Python: requests, httpx และ aiohttp (คู่มือ 2026)

เผยแพร่เมื่อ 2 มิถุนายน 2026 · อ่าน ≈10 นาที

ถ้าคุณสแครป คลอว์ล หรือทำงานอัตโนมัติอะไรก็ตามในระดับใหญ่ด้วย Python ไม่ช้าก็เร็วเว็บไซต์เป้าหมายจะสังเกตว่าทุกคำขอมาจาก IP เดียวและตัดคุณทิ้ง การหมุนพร็อกซีใน Python กระจายทราฟฟิกของคุณไปทั่วที่อยู่ IP หลายตัว เพื่อไม่ให้ตัวใดตัวหนึ่งสะดุดลิมิตอัตราหรือโดนแบน คู่มือนี้แสดงโค้ดที่แม่นยำสำหรับ requests, httpx และ aiohttp พร้อมวิธีเลือกระหว่าง gateway แบบหมุนกับพูล IP ที่มีการจัดการ

การตัดสินใจที่ตัดขวางสองข้อกำหนดทุกอย่างด้านล่างนี้ ข้อแรก: เซสชันแบบหมุน vs sticky — IP ใหม่ต่อคำขอ หรือ IP เดียวที่คงไว้สำหรับโฟลว์หลายขั้นตอน ข้อสอง: IP แบบ residential vs datacenter — ดู เมทริกซ์การตัดสินใจประเภทพร็อกซี ทำสองข้อนี้ให้ถูก แล้วโค้ดก็เป็นส่วนที่ง่าย

สองวิธีในการหมุน

1. การหมุนผ่าน gateway (แนะนำ) คุณเชื่อมต่อกับ endpoint เดียวและผู้ให้บริการมอบ exit IP ที่สดใหม่ให้คุณในทุกการเชื่อมต่อใหม่ ไม่มีรายการให้จัดการ ไม่มี IP ตายให้ตัดทิ้ง พูล dynamic residential ของ JIBAO ทำงานแบบนี้: โฮสต์และพอร์ตเดียวกัน IP ใหม่ในทุกคำขอ

2. รายการ IP ที่จัดการเอง คุณถือรายการของรายการ host:port และเลือกตัวหนึ่งต่อคำขอ ควบคุมได้มากกว่า แต่คุณต้องรับผิดชอบการตรวจสุขภาพ การลองซ้ำ และการติดตามการแบนเอง มีประโยชน์กับ IP datacenter เฉพาะ เมื่อคุณต้องการที่อยู่ที่รู้จักและเสถียร

การหมุนด้วย requests

กรณีที่ง่ายที่สุด — จัดเส้นทางคำขอหนึ่งผ่าน gateway ที่หมุนให้คุณ ใช้ socks5h:// (ตัว h ท้ายหมายความว่า DNS ถูก resolve ที่ฝั่งพร็อกซี ซึ่งช่วยหลีกเลี่ยงการรั่วของการ lookup):

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

ต้องการให้ requests พูด SOCKS5 ได้ไหม? ติดตั้งส่วนเสริม: pip install "requests[socks]" ถ้าคุณชอบ endpoint พร็อกซี HTTP มากกว่า ให้สลับสคีมเป็น http:// — ที่เหลือเหมือนกันทุกประการ

การหมุนจากรายการ IP ของคุณเอง

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 session เมื่อคุณต้องคง IP เดียวไว้

โฟลว์ล็อกอิน ตะกร้าสินค้า และผลลัพธ์แบบแบ่งหน้าจะพังถ้า IP เปลี่ยนกลางงาน ปักหมุด IP ด้วยการเพิ่ม session token ลงในชื่อผู้ใช้ ใช้ token เดิมซ้ำเพื่อคง exit IP เดิมไว้ตลอดอายุของมัน:

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

การหมุนด้วย httpx

httpx มอบไคลเอนต์สมัยใหม่ที่มี HTTP/2 และ async โดยกำเนิด โปรดสังเกตว่าเวอร์ชันใหม่กว่ารับอาร์กิวเมนต์ proxy= เดียว:

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"])

การรองรับ SOCKS ใน httpx ต้องใช้ pip install "httpx[socks]" สำหรับ HTTP/2 ให้เพิ่ม http2=True ลงในไคลเอนต์ — มันทำให้ทราฟฟิกของคุณดูเหมือนเบราว์เซอร์จริงมากขึ้น ซึ่งเข้าคู่ได้ดีกับ การจับคู่ลายนิ้วมือ TLS

การหมุนแบบพร้อมกันด้วย aiohttp

สำหรับ throughput สูง ยิงหลายคำขอพร้อมกัน ทุกการเชื่อมต่อผ่าน gateway ได้ exit IP ของตัวเอง ดังนั้นการทำงานพร้อมกันและการหมุนจึงมาด้วยกัน:

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())

ติดตั้ง SOCKS connector ด้วย pip install aiohttp_socks สร้าง connector ใหม่ต่องานเพื่อให้ทุกคำขอเปิดการเชื่อมต่อผ่านพร็อกซีใหม่

ตรรกะการลองซ้ำที่ช่วยได้จริง

การหมุนจะคุ้มก็ต่อเมื่อคุณลองซ้ำความล้มเหลวบน IP ที่สดใหม่ ถอยแบบ exponential และหมุน session token ในทุกความพยายาม:

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}")

ตรวจสอบว่าการหมุนของคุณทำงานอยู่จริง

ก่อนการรันใหญ่ ยืนยันว่า IP เปลี่ยนจริง ยิงไปที่ echo endpoint สองสามครั้งแล้วเช็กว่า IP ต่างกัน เพื่อยืนยันด้วยว่าลายนิ้วมือ TLS ของคุณไม่ได้เผยตัวคุณ ให้รันคำขอกับ เครื่องตรวจลายนิ้วมือ JA3/TLS ฟรี ของ JIBAO — IP ที่หมุนพร้อมลายนิ้วมือ Python ที่เผยตัวชัดเจนก็ยังถูกบล็อกอยู่ดี

แนวปฏิบัติที่ดีที่สุด

เมื่อการหมุนมั่นคงแล้ว กำแพงถัดไปที่คุณชนมักเป็นเรื่องลายนิ้วมือ ไม่ใช่ IP ถ้า IP residential สะอาดยังได้ 403 ให้อ่าน วิธีเลี่ยงการพิมพ์ลายนิ้วมือ TLS ด้วย curl_cffi และ สูตรเลี่ยง Cloudflare แบบเต็ม

รับพร็อกซี residential แบบหมุน

รับ500MB ทราฟฟิกฟรี และ gateway residential แบบหมุนที่มอบ IP ใหม่ให้คุณในทุกคำขอ

เริ่มทดลองใช้ฟรี

สำหรับผลิตภัณฑ์ IP ทุกประเภท · พูลโหนดขนาดมหึมาพร้อมใช้งานได้ทุกเมื่อ

สมัครสมาชิกตอนนี้และรับเงินคืนการเติมเงินสูงสุด 100%

ผู้ใช้ใหม่รับ 500MB เมื่อสมัครสมาชิก พร้อมโบนัสในการเติมเงินครั้งแรก ข้อเสนอมีระยะเวลาจำกัด