Scarnox · Blog

Web scraping captcha: ทำไมจึงปรากฏและควรทำอย่างไร

captcha จะปรากฏระหว่าง scraping เมื่อเว็บไซต์ตัดสินว่า request ดูเหมือนอัตโนมัติ ตัวกระตุ้นที่พบบ่อยคือส่ง request มากเกินไปในเวลาสั้น ๆ IP address ที่มีชื่อเสียงไม่ดี ขาดสัญญาณของเบราว์เซอร์ หรือเข้าหน้าที่เว็บไซต์ป้องกันอย่างเข้มงวดกว่าหน้าอื่น แนวทางปฏิบัติมีสามขั้นตอน เรียงตามลำดับนี้: ลดตัวกระตุ้น ตรวจจับ captcha ในโค้ด และ solve captcha ที่หลีกเลี่ยงไม่ได้ คู่มือนี้ครอบคลุมแต่ละขั้นตอน และชี้ไปยังคู่มือโดยละเอียดสำหรับส่วนที่เหลือ

ทำไมเว็บไซต์จึงแสดง captcha ให้ scraper

เว็บไซต์มีวิธีแยกคนออกจากสคริปต์ในขณะที่ขอหน้าได้น้อยมาก มันจึงดูรูปแบบ scraper มักโดดเด่นเพราะ:

สิ่งใดสิ่งหนึ่งก็อาจเพียงพอ captcha คือวิธีที่เว็บไซต์ขอให้มีขั้นตอนคล้ายมนุษย์ก่อนจะเสิร์ฟหน้าเพิ่ม การลดรูปแบบมักลด captcha ได้ ซึ่งถูกกว่าการ solve

ตรวจจับ captcha ในโค้ด

ก่อน solve อะไร ให้ตรวจว่าหน้าที่คุณได้รับเป็นหน้า captcha หรือไม่ การทดสอบแบบง่ายมองหา markup ของ widget และอ่าน sitekey:

import re
import requests

SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')

def fetch(url: str) -> dict:
    resp = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
    )
    html = resp.text
    if "h-captcha" in html or "g-recaptcha" in html:
        match = SITEKEY_RE.search(html)
        return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
    return {"captcha": False, "sitekey": None, "html": html}

page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
    print("captcha found, sitekey:", page["sitekey"])

สตริง h-captcha และ g-recaptcha เป็นเพียง markup ที่หน้าใช้ ดังนั้นนี่คือสัญญาณ ไม่ใช่การรับประกัน หากไม่พบ sitekey ให้ดู วิธีหา sitekey ของ captcha

Solve เมื่อหลีกเลี่ยงไม่ได้

เมื่อมี PopularCaptcha widget อยู่บนหน้าและคุณมี sitekey ของมัน คุณสามารถขอ token จาก Scarnox API ด้วย POST request หนึ่งครั้ง แล้วส่งใน h-captcha-response field ฟังก์ชันเต็มพร้อม error handling อยู่ใน solve captcha จาก Python ด้วย request เดียว ใช้ token ทันที เพราะมันหมดอายุในประมาณสองนาที รายละเอียดเรื่องเวลาอยู่ใน token captcha หมดอายุ

การรองรับ captcha แบบใช้งานจริงของ Scarnox ในวันนี้คือ PopularCaptcha ทั้งแบบ proxyless และใช้ proxy ของคุณเอง reCAPTCHA v2 และ v3, Cloudflare Turnstile, GeeTest, AWS WAF และ Arkose กำลังจะมาเร็ว ๆ นี้ หากเป้าหมายของคุณใช้ตัวใดตัวหนึ่ง คู่มือ captcha จะอธิบายทางเลือกทั่วไป แต่อย่าสร้าง flow โปรดักชันบนการ solve ที่ยังไม่เปิดใช้งาน

ผังการตัดสินใจสำหรับทุกหน้าที่ถูกบล็อก

เมื่อ scraper ของคุณเจอ captcha ลำดับการตัดสินใจง่าย ๆ ช่วยให้งานซื่อตรงและปริมาณ request ต่ำ:

  1. มีแหล่งข้อมูลอื่นที่ใช้ได้หรือไม่ หาก API, feed หรือการส่งออกครอบคลุมฟิลด์ที่คุณต้องการ ให้เปลี่ยนไปใช้แทนและหยุดขอหน้านั้น
  2. robots.txt อนุญาต path นี้หรือไม่ ถ้าไม่ ให้ข้าม อย่า solve captcha บนหน้าที่คุณถูกขอให้ไม่แตะต้อง
  3. คุณส่งมากเกินไปเร็วเกินไปหรือไม่ หยุดนานขึ้น ลดอัตรา และตรวจอีกครั้งภายหลัง captcha หลายอันจะหายไปเมื่อจังหวะช้าลง
  4. captcha นี้เป็นประเภทที่ใช้งานได้จริงหรือไม่ หากเป็น PopularCaptcha การ solve ในคู่มือนี้ใช้ได้ หากเป็นประเภทที่กำลังจะมาเร็ว ๆ นี้ ให้หยุดงานไว้และติดตามการเปิดตัว
  5. หน้านี้เป็นหน้าที่คุณได้รับอนุญาตให้ automate หรือไม่ หากคำตอบไม่ชัด ให้ถามเจ้าของเว็บไซต์ก่อนดำเนินการต่อ

ขั้นตอนที่สี่เป็นขั้นที่มักถูกข้าม solver มีประโยชน์เฉพาะเมื่อประเภท captcha ได้รับการรองรับ และงานที่ retry ประเภทที่ไม่รองรับจะเสียเวลาและ request

จัดการ captcha ในงาน ไม่ใช่ในลูป

วางการ solve ไว้ในเส้นทางโค้ดที่ต้องการ token เพื่อให้งานสามารถ log captcha แต่ละตัว หยุดเมื่อหน้าใดหน้าหนึ่งล้มเหลวซ้ำ ๆ และไปต่อได้ ลูปที่ไม่มีขอบเขตซึ่งขอหน้า captcha ซ้ำ ๆ เป็นวิธีที่เร็วที่สุดที่จะทำให้ firewall ของเว็บไซต์บล็อก address ของคุณอย่างถาวร

ติดตามสิ่งที่ล้มเหลว

เก็บจำนวนหน้าที่ตอบกลับด้วย captcha จัดกลุ่มตาม URL และช่วงเวลาของวัน captcha ที่ปรากฏเฉพาะส่วนหนึ่งของเว็บไซต์ หรือเฉพาะหลังจาก request จำนวนหนึ่ง บอกคุณว่าตัวกระตุ้นอยู่ตรงไหน ข้อมูลนั้นมีประโยชน์มากกว่า solver ที่เร็วกว่า เพราะมันบอกคุณว่าต้องเปลี่ยนอะไร

สิ่งที่ไม่ควรทำ

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

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