Rotating proxies สำหรับ scraping: การตั้งค่าและจุดที่ควรระวัง
rotating proxy จะเปลี่ยน IP address ที่ทราฟฟิกของคุณออกไป ไม่ว่าจะทุก request หรือหลังช่วงเวลาที่กำหนด มันเป็นเครื่องมือที่ใช้บ่อยที่สุดอย่างหนึ่งใน web scraping และถูกใช้ผิดบ่อยที่สุดเช่นกัน หมุนน้อยเกินไปและ address เดียวจะถูก rate limit หมุนมากเกินไปและทราฟฟิกจะดูไม่เหมือนผู้เข้าชมเลย คู่มือนี้อธิบายโมเดลการหมุนทั้งสองแบบ แสดงการตั้งค่า Python ที่ใช้งานได้พร้อม retry สำหรับ proxy ที่ตาย และอธิบายว่าฟิลด์ proxy เข้ากับการ solve captcha อย่างไร
การหมุนเทียบกับ sticky session
บริการ rotating proxy มีสองวิธีในการให้ address:
- การหมุนต่อ request ทุก request ได้ exit address ใหม่ วิธีนี้เหมาะกับการ crawl จำนวนมากของหน้าที่ไม่เกี่ยวข้องกัน ที่หน้าใดไม่ต้องพึ่งหน้าก่อนหน้า
- Sticky session address หนึ่งถูกเก็บไว้เป็นเวลาที่กำหนด มักเป็นไม่กี่นาที หรือจนกว่าคุณจะปล่อย วิธีนี้เหมาะกับงานที่ต้องการสถานะ เช่น การล็อกอิน ตะกร้าสินค้า หรือรายการแบ่งหน้าที่ cookie มีความสำคัญ
ผู้เข้าชมจริงใช้ 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
มีสองประเด็นในทางปฏิบัติ:
- ใช้ proxy เดียวกันสำหรับ request หน้าและการ solve captcha เมื่อเว็บไซต์ตรวจ address การผสม address อาจทำให้ token ล้มเหลว
- token หมดอายุเร็ว ให้ขอ token ก่อนส่งฟอร์มไม่นาน ไม่ใช่ก่อนหน้านั้นนาน ดู การหมดอายุของ captcha token
captcha ประเภทที่ใช้งานได้จริงบน Scarnox ในวันนี้คือ PopularCaptcha คู่มือ PopularCaptcha ด้วย Python แสดง request และวิธีส่ง token ที่ได้กลับมา
การเลือก proxy
ประเภทของ address ที่คุณหมุนสำคัญพอ ๆ กับการหมุนเอง address แบบ datacenter เร็วและถูกต่อ request แต่มักได้คะแนนต่ำ address แบบ residential ได้คะแนนดีกว่าแต่ช้ากว่า residential vs datacenter proxies เปรียบเทียบอย่างละเอียด และคำแนะนำที่นั่นใช้กับ pool ที่คุณสร้างที่นี่ด้วย
Scrape อย่างมีความรับผิดชอบ
- อ่าน
robots.txtและข้อกำหนดการใช้งานของเว็บไซต์ที่คุณ scrape - ใช้ proxy เพื่อกระจายภาระที่ชอบด้วยกฎหมาย ไม่ใช่เพื่อเลี่ยงข้อจำกัดที่เจ้าของตั้งไว้
- ใช้เฉพาะบริการ proxy ที่จัดหา address ด้วยความยินยอม การส่งทราฟฟิกผ่านอุปกรณ์ของคนที่ไม่ได้ตกลงด้วยนั้นยอมรับไม่ได้
- เก็บ credential ให้พ้นจากโค้ดและ log
ขั้นตอนถัดไป
- Residential vs datacenter proxies
- Scrape โดยไม่ถูกบล็อก
- Proxy vs proxyless captcha
- Retry และการจัดการ error ที่ใช้ได้จริงในโปรดักชัน
เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต: สร้างบัญชี แล้วทดสอบ flow ของ PopularCaptcha ด้วย proxy ของคุณเอง ดูอัตราค่าบริการปัจจุบันได้ที่ หน้าราคา