Scarnox · Blog

Rotating proxies สำหรับ scraping: การตั้งค่าและจุดที่ควรระวัง

rotating proxy จะเปลี่ยน IP address ที่ทราฟฟิกของคุณออกไป ไม่ว่าจะทุก request หรือหลังช่วงเวลาที่กำหนด มันเป็นเครื่องมือที่ใช้บ่อยที่สุดอย่างหนึ่งใน web scraping และถูกใช้ผิดบ่อยที่สุดเช่นกัน หมุนน้อยเกินไปและ address เดียวจะถูก rate limit หมุนมากเกินไปและทราฟฟิกจะดูไม่เหมือนผู้เข้าชมเลย คู่มือนี้อธิบายโมเดลการหมุนทั้งสองแบบ แสดงการตั้งค่า Python ที่ใช้งานได้พร้อม retry สำหรับ proxy ที่ตาย และอธิบายว่าฟิลด์ proxy เข้ากับการ solve captcha อย่างไร

การหมุนเทียบกับ sticky session

บริการ rotating proxy มีสองวิธีในการให้ address:

ผู้เข้าชมจริงใช้ address เดียวตลอดการเยี่ยมชมหนึ่งครั้ง Sticky session เลียนแบบพฤติกรรมนี้ จึงมักเป็นค่าเริ่มต้นที่ดีกว่าเมื่อเว็บไซต์ใช้ cookie หรือ session ใช้การหมุนต่อ request สำหรับการ crawl ที่ไม่มีสถานะ

pool ของ rotating proxy แบบพื้นฐานใน Python

ตัวอย่างด้านล่างเก็บ pool ของ URL proxy หมุนผ่านมัน และไปต่อเมื่อตัวใดตัวหนึ่งล้มเหลว เก็บ credential ไว้ในตัวแปรสภาพแวดล้อม ไม่ใช่ในซอร์สโค้ด

import itertools
import os
import requests

# URL ของ proxy มาจากสภาพแวดล้อม ตัวอย่างเช่น:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)

def fetch(url: str, max_tries: int = 3) -> requests.Response:
    last_error = None
    for _ in range(max_tries):
        proxy = next(rotation)
        try:
            r = requests.get(
                url,
                proxies={"http": proxy, "https": proxy},
                timeout=30,
            )
            if r.status_code == 407:  # การยืนยันตัวตนของ proxy ล้มเหลว
                raise requests.RequestException("proxy auth rejected")
            return r
        except requests.RequestException as exc:
            last_error = exc  # proxy ที่ตายหรือช้า: ลองตัวถัดไป
    raise RuntimeError(f"all attempts failed for {url}: {last_error}")

มีสองรายละเอียดที่สำคัญที่นี่ ประการแรก proxy ที่ตายควรถูก retry ผ่าน address อื่น ไม่ใช่ตัวเดิม ประการที่สอง request ที่ล้มเหลวด้วย error การยืนยันตัวตนควรหยุดและรายงาน แทนที่จะใช้ pool ทั้งหมดจนหมด

ติดตามสุขภาพของ proxy

round robin แบบธรรมดายังส่งทราฟฟิกไปยัง proxy ที่เริ่มล้มเหลวอยู่ ให้ติดตามคะแนนแบบง่ายสำหรับแต่ละ address: นับความล้มเหลวล่าสุด และนำ address ออกจาก pool ชั่วคราวเมื่อเกินเกณฑ์ จากนั้นนำกลับมาในภายหลังและเฝ้าดูอีกครั้ง scraper ของคุณจะใช้ request ไปกับส่วนที่แข็งแรงของ pool

บันทึก proxy ที่ใช้กับผลลัพธ์แต่ละรายการ เมื่อเว็บไซต์เริ่มส่งการบล็อก คุณจะอยากรู้ว่า address เดียว region เดียว หรือทั้ง pool เป็นต้นเหตุ

ควบคุมจังหวะของ pool

การหมุนกระจายภาระไปยัง address หลายตัว แต่ address แต่ละตัวยังมี rate ให้ตั้งการหน่วงเวลาต่อ address และเพดานรวมของจำนวน request ต่อวินาทีทั่ว pool การหมุนไม่ได้เป็นใบอนุญาตให้ส่งทราฟฟิกมากขึ้น แต่เป็นวิธีทำให้ทราฟฟิกจาก address หนึ่งอยู่ในขอบเขตที่สมเหตุสมผล

ความผิดพลาดที่พบบ่อย

ปัญหาการหมุนส่วนใหญ่มาจากนิสัยไม่กี่อย่าง การเปลี่ยน address กลางกระบวนการล็อกอินหรือ checkout ทำให้ session ขาดและทำให้เว็บไซต์เกิดความสงสัย การตอบกลับ 429 คือ rate limit ของเว็บไซต์ ไม่ใช่ proxy ที่เสีย ดังนั้นการสลับไป address ใหม่และ retry ทันทีเพียงทำให้ปัญหากระจายออกไป การเปลี่ยน address ทุก request ขณะที่ยังใช้ cookie เดิมก็ไม่สอดคล้องกัน เพราะ cookie นั้นออกให้กับผู้เข้าชมคนละคน สุดท้าย pool ที่ไม่เคยถูกตรวจสอบจะค่อย ๆ เต็มไปด้วย address ที่ตาย และอัตราความผิดพลาดของคุณจะเพิ่มขึ้นโดยไม่มีสาเหตุที่ชัดเจน ให้ตรวจ pool ตามตารางเวลาและลบสิ่งที่ล้มเหลวออก

Proxy และการ solve captcha

captcha task บางรูปแบบสามารถใช้ proxy เดียวกับที่ scraper ของคุณใช้ได้ คุณส่งมันในฟิลด์ proxy ที่เป็นตัวเลือก ในรูปแบบ http://user:pass@host:port และการ solve เกิดขึ้นผ่านเส้นทางเครือข่ายเดียวกับ request หน้าของคุณ task แบบ proxyless ข้ามฟิลด์นี้ไปเลย การเลือกขึ้นอยู่กับว่าเว็บไซต์ผูก captcha กับ address ของเครือข่ายหรือไม่ ซึ่งการแลกเปลี่ยนนั้นอธิบายไว้ใน proxy vs proxyless captcha

มีสองประเด็นในทางปฏิบัติ:

captcha ประเภทที่ใช้งานได้จริงบน Scarnox ในวันนี้คือ PopularCaptcha คู่มือ PopularCaptcha ด้วย Python แสดง request และวิธีส่ง token ที่ได้กลับมา

การเลือก proxy

ประเภทของ address ที่คุณหมุนสำคัญพอ ๆ กับการหมุนเอง address แบบ datacenter เร็วและถูกต่อ request แต่มักได้คะแนนต่ำ address แบบ residential ได้คะแนนดีกว่าแต่ช้ากว่า residential vs datacenter proxies เปรียบเทียบอย่างละเอียด และคำแนะนำที่นั่นใช้กับ pool ที่คุณสร้างที่นี่ด้วย

Scrape อย่างมีความรับผิดชอบ

ขั้นตอนถัดไป

เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต: สร้างบัญชี แล้วทดสอบ flow ของ PopularCaptcha ด้วย proxy ของคุณเอง ดูอัตราค่าบริการปัจจุบันได้ที่ หน้าราคา