Web scraping captcha: ทำไมจึงปรากฏและควรทำอย่างไร
captcha จะปรากฏระหว่าง scraping เมื่อเว็บไซต์ตัดสินว่า request ดูเหมือนอัตโนมัติ ตัวกระตุ้นที่พบบ่อยคือส่ง request มากเกินไปในเวลาสั้น ๆ IP address ที่มีชื่อเสียงไม่ดี ขาดสัญญาณของเบราว์เซอร์ หรือเข้าหน้าที่เว็บไซต์ป้องกันอย่างเข้มงวดกว่าหน้าอื่น แนวทางปฏิบัติมีสามขั้นตอน เรียงตามลำดับนี้: ลดตัวกระตุ้น ตรวจจับ captcha ในโค้ด และ solve captcha ที่หลีกเลี่ยงไม่ได้ คู่มือนี้ครอบคลุมแต่ละขั้นตอน และชี้ไปยังคู่มือโดยละเอียดสำหรับส่วนที่เหลือ
ทำไมเว็บไซต์จึงแสดง captcha ให้ scraper
เว็บไซต์มีวิธีแยกคนออกจากสคริปต์ในขณะที่ขอหน้าได้น้อยมาก มันจึงดูรูปแบบ scraper มักโดดเด่นเพราะ:
- ส่ง request เร็วกว่าที่คนจะคลิกได้
- วนซ้ำ path เดิมโดยไม่มีการหยุด
- มาจาก address ของ datacenter แทนเครือข่ายที่บ้าน
- ส่ง header ที่ไม่ตรงกับเบราว์เซอร์ทั่วไป หรือ
- ไม่เก็บ cookie หรือสถานะของ session ระหว่าง request
สิ่งใดสิ่งหนึ่งก็อาจเพียงพอ 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 ต่ำ:
- มีแหล่งข้อมูลอื่นที่ใช้ได้หรือไม่ หาก API, feed หรือการส่งออกครอบคลุมฟิลด์ที่คุณต้องการ ให้เปลี่ยนไปใช้แทนและหยุดขอหน้านั้น
- robots.txt อนุญาต path นี้หรือไม่ ถ้าไม่ ให้ข้าม อย่า solve captcha บนหน้าที่คุณถูกขอให้ไม่แตะต้อง
- คุณส่งมากเกินไปเร็วเกินไปหรือไม่ หยุดนานขึ้น ลดอัตรา และตรวจอีกครั้งภายหลัง captcha หลายอันจะหายไปเมื่อจังหวะช้าลง
- captcha นี้เป็นประเภทที่ใช้งานได้จริงหรือไม่ หากเป็น PopularCaptcha การ solve ในคู่มือนี้ใช้ได้ หากเป็นประเภทที่กำลังจะมาเร็ว ๆ นี้ ให้หยุดงานไว้และติดตามการเปิดตัว
- หน้านี้เป็นหน้าที่คุณได้รับอนุญาตให้ automate หรือไม่ หากคำตอบไม่ชัด ให้ถามเจ้าของเว็บไซต์ก่อนดำเนินการต่อ
ขั้นตอนที่สี่เป็นขั้นที่มักถูกข้าม solver มีประโยชน์เฉพาะเมื่อประเภท captcha ได้รับการรองรับ และงานที่ retry ประเภทที่ไม่รองรับจะเสียเวลาและ request
จัดการ captcha ในงาน ไม่ใช่ในลูป
วางการ solve ไว้ในเส้นทางโค้ดที่ต้องการ token เพื่อให้งานสามารถ log captcha แต่ละตัว หยุดเมื่อหน้าใดหน้าหนึ่งล้มเหลวซ้ำ ๆ และไปต่อได้ ลูปที่ไม่มีขอบเขตซึ่งขอหน้า captcha ซ้ำ ๆ เป็นวิธีที่เร็วที่สุดที่จะทำให้ firewall ของเว็บไซต์บล็อก address ของคุณอย่างถาวร
ติดตามสิ่งที่ล้มเหลว
เก็บจำนวนหน้าที่ตอบกลับด้วย captcha จัดกลุ่มตาม URL และช่วงเวลาของวัน captcha ที่ปรากฏเฉพาะส่วนหนึ่งของเว็บไซต์ หรือเฉพาะหลังจาก request จำนวนหนึ่ง บอกคุณว่าตัวกระตุ้นอยู่ตรงไหน ข้อมูลนั้นมีประโยชน์มากกว่า solver ที่เร็วกว่า เพราะมันบอกคุณว่าต้องเปลี่ยนอะไร
สิ่งที่ไม่ควรทำ
- อย่าหมุนผ่าน IP address จำนวนมากเพื่อหลีกเลี่ยงข้อจำกัดของเว็บไซต์ นั่นคือการหลบเลี่ยง และจะเปลี่ยนคำขอให้ช้าลงให้กลายเป็นการต่อสู้
- อย่า scrape หน้าที่อยู่หลังการล็อกอินด้วยข้อมูลรับรองที่คุณไม่ได้รับอนุญาตให้ใช้
- อย่า solve captcha เพื่อสร้างบัญชี โพสต์สแปม หรือซื้อสินค้าที่มีจำนวนจำกัด
Scrape อย่างมีความรับผิดชอบ
- อ่าน
robots.txtและข้อกำหนดการให้บริการของเว็บไซต์ก่อนเริ่ม เคารพเส้นทางที่ห้ามและ crawl delay ใด ๆ - ระบุตัวบอทของคุณอย่างซื่อตรงใน User-Agent พร้อมช่องทางให้ติดต่อคุณได้
- รักษาอัตรา request ให้ต่ำ captcha มักเป็นเว็บไซต์ที่ขอให้คุณช้าลง
- หยุดหากเว็บไซต์ขอให้หยุด และอย่าอ้อมการบล็อกที่คุณถูกบอกให้เคารพ
- จัดการข้อมูลส่วนบุคคลภายใต้กฎความเป็นส่วนตัวที่ใช้กับคุณ และเก็บเฉพาะสิ่งที่จำเป็น