Scraping

การทำ Web Scraping ในระดับใหญ่: เมื่อใดและทำไมต้องใช้พร็อกซีสาธารณะ

5 min read Published Updated 993 words

การหมุนพร็อกซีเป็นเพียงไม้ค้ำยัน ไม่ใช่ทางออก ปัญหาส่วนใหญ่ของการขูดข้อมูลเว็บเกิดจากการมองว่าที่อยู่ IP เป็นสัญญาณเดียวที่ระบบป้องกันบอทตรวจวัด ความจริงคือระบบจัดการบอทสมัยใหม่ เช่น Akamai Bot Manager, Cloudflare Turnstile, Datadome เก็บลายนิ้วมือมากกว่าแค่ IP ต้นทางของคุณ การใช้พร็อกซีสาธารณะฟรีแบบหมุนเวียนแทบไม่ได้ช่วยอะไรกับระบบเหล่านี้ และมักจะทำให้สถานการณ์แย่ลง

ภาพลวงตาของการหมุน IP

เมื่อคุณหมุน IP ทุกครั้งที่ส่งคำขอ คุณกำลังประกาศตัวว่าเป็นสคริปต์ขูดข้อมูล รูปแบบการท่องเว็บของมนุษย์จะแสดงเซสชันแบบติดหนึบ — ใช้ IP เดียวเป็นนาทีหรือชั่วโมง มีลายนิ้วมือเบราว์เซอร์ที่สอดคล้องกัน และช่วงเวลาการร้องขอที่คาดเดาได้ เครื่องมืออย่าง requests ที่มีออบเจ็กต์ Session และรายการพร็อกซีแบบหมุนจะทำลายสัญญาณเหล่านั้นทั้งหมด ส่วนหัว X-Akamai-Device-Fingerprint ของ Akamai และการเชื่อมโยง cf-request-id ของ Cloudflare สามารถเชื่อมโยงคำขอจาก IP ต่างๆ เมื่อพารามิเตอร์ TLS, การตั้งค่า HTTP/2 และช่วงเวลายังคงเหมือนเดิม การท้าทาย JavaScript ของ Datadome จะตรวจสอบสิ่งประดิษฐ์ของเบราว์เซอร์ไร้หัวที่ยังคงอยู่แม้จะเปลี่ยนพร็อกซี การหมุน IP โดยไม่หมุนลายนิ้วมือไคลเอนต์ทั้งหมดก็เหมือนกับการเปลี่ยนป้ายทะเบียนแต่ขับรถคันเดิม — กล้องเก็บค่าผ่านทางยังคงแจ้งเตือนคุณอยู่ดี

สำหรับการขูดข้อมูลที่มีอัตราต่ำและปริมาณน้อย กับเว็บไซต์ที่ใช้เพียงการจำกัดอัตราตาม IP แบบพื้นฐาน (เช่น การจำกัด 10 คำขอต่อนาทีโดยไม่มีการท้าทาย JavaScript) IP ที่อยู่อาศัยเพียงตัวเดียวมักจะเพียงพอ ผมรันสคริปต์ขูดข้อมูลเป็นเวลาหลายปีกับพอร์ทัลข้อมูลรัฐบาลและ API สาธารณะโดยใช้ IP คงที่ตัวเดียวและ time.sleep(2) ที่สุภาพ ไม่จำเป็นต้องใช้พร็อกซี กฎง่ายๆ คือ ถ้าเว็บไซต์ไม่แสดงหน้า challenge หรือ CAPTCHA หลังจาก 50 คำขอ คุณก็ไม่จำเป็นต้องหมุน IP

เกินกว่า IP Address: การสร้างลายนิ้วมือ

ระบบป้องกันบอทในปัจจุบันเก็บสัญญาณหลายสิบสัญญาณต่อคำขอ สตริง User-Agent นั้นปลอมแปลงได้ง่าย แต่ Accept-Language, Sec-CH-UA, Connection และลำดับ Accept-Encoding นั้นไม่ใช่ ที่สำคัญกว่านั้น การสร้างลายนิ้วมือ TLS — ซึ่งได้มาตรฐานใน JA3 hash (ดู JA3) — ระบุไลบรารีไคลเอนต์จากลำดับชุดการเข้ารหัสและรายการส่วนขยาย TLS ไลบรารี requests ของ Python (ผ่าน urllib3) สร้าง JA3 hash ที่แตกต่างจาก Chrome 124 Cloudflare Turnstile และ Datadome ต่างก็ตรวจสอบ JA3 การหมุน IP ในขณะที่ยังคงสแต็ก TLS เดียวกันทำให้ทุกคำขอดูเหมือนไคลเอนต์อัตโนมัติตัวเดียวกัน แค่กระโดดระหว่างโหนดทางออก พร็อกซีฟรีทำให้เรื่องนี้แย่ลงเพราะมักใช้ OpenSSL เวอร์ชันเก่าหรือการกำหนดค่า TLS ที่เหมือนบอทซึ่งถูกขึ้นบัญชีดำอยู่แล้ว

การสร้างลายนิ้วมือ HTTP/2 ไปไกลกว่านั้น เฟรม SETTINGS, ค่า window update และพารามิเตอร์ stream concurrency ก่อให้เกิด "ลายนิ้วมือ HTTP/2" ที่ไม่ซ้ำกัน ซึ่ง Akamai Bot Manager ติดตามข้ามเซสชัน พูลพร็อกซีแบบหมุนที่ไม่หมุนการใช้งาน HTTP/2 ไปพร้อมกันนั้นแยกกลุ่มได้ง่าย วิธีเดียวที่จะหลบเลี่ยงการตรวจสอบเหล่านี้คือการใช้เครื่องมือเบราว์เซอร์จริง (Puppeteer, Playwright) หรือสแต็ก TLS/HTTP ที่สร้างขึ้นอย่างระมัดระวังซึ่งเลียนแบบเบราว์เซอร์รุ่นใดรุ่นหนึ่ง — และถึงอย่างนั้น คุณก็ต้องคงลายนิ้วมือเดิมไว้ข้ามคำขอจากเซสชันที่กำหนด

เศรษฐศาสตร์ของพูลพร็อกซีสาธารณะฟรี

รายการพร็อกซีสาธารณะฟรีมีอัตราความล้มเหลว 60–80 เปอร์เซ็นต์ในการทดสอบของผม พร็อกซีส่วนใหญ่ตายตั้งแต่เริ่มต้น ถูกโฮสต์จำกัด หรือถูกแบนโดยระบบจัดการบอทหลักๆ ไปแล้ว อายุเฉลี่ยของพร็อกซี SOCKS5 ฟรีที่ขูดจากไดเรกทอรีสาธารณะต่ำกว่า 15 นาที การรักษาพูลพร็อกซีหมุน 500 ตัวหมายความว่าคุณใช้ IP หลายพันตัวต่อชั่วโมง และ 80% ของคำขอของคุณจะหมดเวลาหรือคืนค่า 403 แบนด์วิดท์ไม่น่าเชื่อถือ ความหน่วงพุ่งสูงเป็นเรื่องปกติ และพร็อกซีฟรีหลายตัวแทรกโฆษณาหรือแก้ไขเนื้อหาการตอบกลับ เครือข่ายพร็อกซีที่อยู่อาศัยแบบเสียเงิน (เช่น Bright Data, Oxylabs) ให้อัตราความสำเร็จ 95%+ และตัวเลือกเซสชันแบบติดหนึบ แต่มีค่าใช้จ่าย $10–$20 ต่อ GB สำหรับการทำงานในระดับใหญ่ คณิตศาสตร์สนับสนุนพร็อกซีที่อยู่อาศัยเฉพาะเมื่อคุณต้องเลี่ยงการบล็อกตาม IP บนเป้าหมายที่มีมูลค่าสูง สำหรับอย่างอื่น IP สะอาดตัวเดียวที่มีการเว้นจังหวะคำขอที่เหมาะสมจะดีกว่าพูลฟรีที่ไร้ระเบียบ

เมื่อการหมุนใช้งานได้จริง

การหมุนพร็อกซีมีประสิทธิภาพต่อภัยคุกคามเฉพาะอย่างหนึ่ง: การจำกัดอัตราตาม IP ที่รีเซ็ตต่อ IP ถ้าเว็บไซต์ใช้การตรวจสอบ X-Forwarded-For แบบง่ายหรือ token bucket ต่อ IP การหมุนหลังแต่ละคำขอจะเลี่ยงการจำกัดได้ ซึ่งพบได้ทั่วไปในเว็บไซต์อีคอมเมิร์ซขนาดเล็กและ API รุ่นเก่าที่ไม่เคยอัปเดตการตรวจจับบอท ในกรณีเหล่านี้ แม้แต่พูลพร็อกซีฟรีก็ใช้ได้ — แต่เฉพาะเมื่อคุณใช้ตรรกะลองใหม่ที่ทิ้งพร็อกซีที่ล้มเหลวและหมุนเวียนพร็อกซีใหม่ได้อย่างรวดเร็ว

นี่คือตัวอย่าง Python ขั้นต่ำที่ใช้ requests และลูปลองใหม่พร้อมหมุน โดยสมมติว่ารายการ URL พร็อกซีอยู่ใน proxy_list และเป้าหมาย url:

import requests
from itertools import cycle

proxy_pool = cycle(proxy_list)
max_retries = 5

for attempt in range(max_retries):
    proxy = next(proxy_pool)
    try:
        resp = requests.get(
            url,
            proxies={"http": proxy, "https": proxy},
            timeout=10,
            headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."}
        )
        if resp.status_code == 200:
            break
    except (requests.ConnectionError, requests.Timeout):
        continue
else:
    raise RuntimeError("All proxies failed")

รูปแบบนี้ใช้ได้เฉพาะเมื่อการตรวจจับของเว็บไซต์เป็นแบบตาม IP ล้วนๆ เพิ่ม time.sleep(random.uniform(1,3)) ระหว่างคำขอเพื่อเลียนแบบจังหวะของมนุษย์ สำหรับเว็บไซต์ที่ใช้ Turnstile หรือ Datadome โค้ดนี้จะล้มเหลวทุกครั้ง — หน้า challenge จะคืนค่า 403 หรือ CAPTCHA ไม่ว่าจะใช้พร็อกซีใด ในกรณีนั้น คุณต้องใช้เบราว์เซอร์ไร้หัวที่มีลายนิ้วมือจริง ไม่ใช่รายการ IP แบบหมุน

เซสชันแบบติดหนึบ — การใช้ IP เดียวสำหรับชุดคำขอที่เกี่ยวข้อง — มักจะมีประสิทธิภาพมากกว่าการหมุนต่อคำขอ เว็บไซต์อีคอมเมิร์ซหลายแห่งคาดหวัง IP เดียวสำหรับเซสชันการท่องเว็บ (เช่น การเพิ่มสินค้าลงตะกร้า การชำระเงิน) การหมุนกลางเซสชันจะกระตุ้นธงการฉ้อโกง ใช้พูลพร็อกซีแต่กำหนด IP หนึ่งตัวต่อเซสชัน ไม่ใช่ต่อคำขอ พร็อกซีฟรีแทบไม่รองรับเซสชันแบบติดหนึบเพราะ IP เดียวถูกใช้ซ้ำโดยผู้ใช้หลายคน คุณจะเห็นการปนเปื้อนข้อมูลข้ามเซสชัน พร็อกซีที่อยู่อาศัยแบบเสียเงินมีระยะเวลาเซสชันแบบติดหนึบ (5–30 นาที) ที่สอดคล้องกับพฤติกรรมการท่องเว็บตามธรรมชาติ

เลือกการหมุนเฉพาะเมื่อคุณเข้าใจสแต็กการตรวจจับของเป้าหมาย ทดสอบด้วย IP เดียวก่อน เพิ่มการหมุนเฉพาะเมื่อคุณเจอการจำกัดอัตรา และอย่าพึ่งพาพร็อกซีฟรีสำหรับการทำงานจริง — อัตราความล้มเหลวของมันจะทำให้คุณเสียค่าใช้จ่ายด้านวิศวกรรมและข้อมูลที่สูญเสียมากกว่าแผนที่อยู่อาศัยราคาถูก