Headless browser detected: สาเหตุและวิธีแก้ (2026)
เว็บไซต์บางแห่งจะขึ้นข้อความ "headless browser detected" หรือเงียบ ๆ แสดงหน้าเว็บอีกแบบให้กับเบราว์เซอร์อัตโนมัติของคุณ เว็บไซต์ทำแบบนี้เพราะ headless browser ทำงานโดยไม่มีหน้าต่าง และมักต่างจากเบราว์เซอร์บนเดสก์ท็อปทั่วไปในรายละเอียดเล็ก ๆ ที่วัดได้ คู่มือนี้อธิบายว่าเว็บไซต์ดูสัญญาณอะไรบ้าง วิธีตรวจสอบว่าเบราว์เซอร์ของคุณเปิดเผยอะไรออกไป และแนวทางแก้ที่สมเหตุสมผลเป็นอย่างไร รวมถึงจุดที่คำตอบที่ถูกต้องคือการหยุด หรือการมองการตรวจสอบนั้นเป็นขั้นตอน captcha
ทำไมเว็บไซต์ถึงตรวจหา headless browser
เฟรมเวิร์ก automation ควบคุมเอนจินของเบราว์เซอร์จริง ดังนั้นส่วนใหญ่ของหน้าเว็บจึงทำงานเหมือนกัน ความต่างจะปรากฏที่ขอบ ๆ:
- Flag ของ automation เบราว์เซอร์ที่ถูกควบคุมด้วยเครื่องมือ automation เคยเปิดเผย property
navigator.webdriverที่ตั้งค่าเป็นtrueและบาง framework ก็ทิ้งร่องรอยอื่นไว้ในหน้าเว็บ - ฟีเจอร์ของเบราว์เซอร์ที่หายไปหรือผิดปกติ headless build อาจรายงานว่าไม่มี plugin มีรายการภาษาที่แปลก หรือขนาดหน้าต่างไม่ตรงกับหน้าจอจริง
- ความต่างของการเรนเดอร์ ผลลัพธ์ของ canvas และ WebGL อาจต่างกันระหว่างสภาพแวดล้อม headless กับ headed โดยเฉพาะบนเซิร์ฟเวอร์ที่ไม่มี GPU
- จังหวะเวลา การคลิกและการโหลดหน้าที่ทำอัตโนมัติมักเกิดขึ้นเป็นจังหวะที่คนทั่วไปไม่ทำกัน
- พฤติกรรมของเครือข่าย header ของ request ลำดับของ header และ TLS handshake อาจเผยให้เห็นว่าเป็น client ที่ไม่ใช่เบราว์เซอร์
เว็บไซต์จะรวมสัญญาณเหล่านี้เป็นคะแนน คะแนนต่ำอาจหมายถึงการลดระดับการให้บริการแบบเงียบ ๆ ชุดการตรวจสอบเพิ่มเติม หรือการบล็อก
ขั้นตอนที่ 1: ดูว่าเบราว์เซอร์ของคุณเปิดเผยอะไรบ้าง
ก่อนเปลี่ยนแปลงอะไร ให้ดูว่าหน้าเว็บสามารถอ่านอะไรจาก automation ของคุณได้บ้าง สคริปต์ด้านล่างเปิดหน้าที่คุณควบคุมและพิมพ์สัญญาณที่สำคัญออกมา นี่คือเครื่องมือวินิจฉัย ใช้กับหน้าทดสอบของคุณเองเท่านั้น ไม่ใช่เพื่อตรวจสอบระบบของคนอื่น
from playwright.sync_api import sync_playwright
CHECK = """() => ({
webdriver: navigator.webdriver,
languages: navigator.languages,
plugins: navigator.plugins.length,
userAgent: navigator.userAgent,
screen: [screen.width, screen.height],
viewport: [window.innerWidth, window.innerHeight],
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
})"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com") # เปลี่ยนเป็นหน้าที่คุณเป็นเจ้าของ
print(page.evaluate(CHECK))
browser.close()
รันสคริปต์เดิมด้วย headless=False แล้วเปรียบเทียบผลลัพธ์ทั้งสองชุด ความแตกต่างคือสิ่งที่เว็บไซต์อาจสังเกตเห็นได้
ขั้นตอนที่ 2: แก้ความไม่สอดคล้องกัน ไม่ใช่แค่ปิด flag
การซ่อน flag หนึ่งตัวแต่ปล่อย flag อื่นไว้ไม่เปลี่ยน เป็นความผิดพลาดที่พบบ่อยที่สุด User agent ที่บอกว่าเป็น Windows ในขณะที่ฟอนต์ เขตเวลา และขนาดหน้าจอบ่งบอกว่าเป็นเซิร์ฟเวอร์ Linux เป็นสัญญาณที่แรงกว่าคุณสมบัติเพียงตัวเดียว ให้มุ่งไปที่สภาพแวดล้อมที่สอดคล้องกันภายใน:
- ใช้เบราว์เซอร์แบบ headed เมื่อทำได้ หรือใช้โหมด headless ที่ตรงกับเบราว์เซอร์บนเดสก์ท็อปรุ่นปัจจุบัน
- ตั้ง viewport และภาษาให้สอดคล้องกัน
- ให้เขตเวลาและ locale ตรงกับ IP address ที่คุณใช้
- ใช้โปรไฟล์และ cookie ชุดเดิมสำหรับตัวตนหนึ่ง แทนที่จะเริ่มใหม่ทุกครั้งที่รัน
Playwright ให้คุณตั้งค่าหลายอย่างเหล่านี้ได้ในที่เดียว:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
ขั้นตอนที่ 3: ชะลอลงและทำตัวเหมือนผู้เข้าชมจริง
automation จะเห็นได้ชัดเมื่อทำงานเร็วกว่าที่คนจะทำได้ ให้เพิ่มช่วงหยุดที่สมจริงระหว่างการโหลดหน้า หลีกเลี่ยงการคลิกองค์ประกอบเดิมด้วยจังหวะที่สม่ำเสมอเป๊ะ และอย่าเปิดหลายร้อยหน้าพร้อมกันจากที่อยู่เดียว การส่ง request น้อยลงและช้าลงช่วยลดภาระให้เว็บไซต์ด้วย ซึ่งเป็นสิ่งที่ควรทำอยู่แล้ว
ขั้นตอนที่ 4: รู้ว่าเมื่อไรการตรวจสอบคือ captcha
การตรวจจับบางรูปแบบจบลงด้วยความท้าทาย ไม่ใช่การบล็อก คุณจะเห็น widget captcha และขั้นตอนนั้นต้องใช้ token จาก solver ปัจจุบัน captcha ประเภทที่ใช้งานได้จริงบน Scarnox คือ PopularCaptcha คู่มือ PopularCaptcha ด้วย Python แสดงวิธีขอและส่ง token ส่วน widget อื่น เช่น Cloudflare Turnstile อยู่ในแผนงานแต่ยังไม่พร้อมใช้งาน ดังนั้นให้ตรวจ ประเภทของ captcha ก่อนวางแผนรองรับ
การเจอขั้นตอน captcha ไม่ได้แปลว่าส่วนอื่นของระบบคุณถูกต้องแล้ว ถ้าเว็บไซต์เดิมบล็อกทุก headless session ไม่ว่าคุณจะตั้งค่าอย่างไร นั่นเป็นสัญญาณชัดเจนว่าเจ้าของไม่ต้องการให้เข้าถึงแบบอัตโนมัติ ให้เคารพสัญญาณนั้น
สิ่งที่ไม่ควรทำ
อย่าพยายามซ่อน automation จากเว็บไซต์ที่ห้ามไว้ และอย่าใช้เครื่องมือหลบการตรวจจับเพื่อผ่านระบบควบคุมการเข้าถึง นั่นเป็นโปรเจกต์คนละประเภทกับการทดสอบและการเก็บข้อมูลสาธารณะที่คู่มือนี้ครอบคลุม ถ้าโปรเจกต์ของคุณต้องการการเข้าถึงที่คุณยังไม่ได้รับอนุญาต ให้ถามเจ้าของเว็บไซต์ หรือมองหา API หรือ data feed อย่างเป็นทางการ
Scrape อย่างมีความรับผิดชอบ
- ตรวจ
robots.txtและข้อกำหนดการใช้งานของเว็บไซต์ก่อนทำ automation - จำกัดอัตราการส่ง request ให้ต่ำ และแคชหน้าที่ดึงมาแล้ว
- ถือว่าการถูกบล็อกคือคำตอบ ไม่ใช่ปริศนาที่ต้องหาทางเลี่ยง
- อย่าเก็บข้อมูลส่วนบุคคลโดยไม่มีฐานทางกฎหมายที่เหมาะสม
แนวทางต่อจากนี้
ถ้า automation ของคุณใช้สำหรับ end-to-end test แนวทางจะต่างออกไป ดู captcha ในการทดสอบอัตโนมัติ หากคุณใช้ Playwright หรือ Puppeteer การจัดการ captcha ด้วย Playwright และ Puppeteer อธิบายว่า token ควรไปอยู่ตรงไหน
เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต: สร้างบัญชี แล้วทดสอบขั้นตอน PopularCaptcha บนหน้าของคุณเอง ดูอัตราค่าบริการปัจจุบันได้ที่ หน้าราคา