เบราว์เซอร์แบบ headless เรนเดอร์ JavaScript ได้ จึงรองรับเว็บไซต์สมัยใหม่ที่ HTTP client ธรรมดาทำไม่ได้ แต่เบราว์เซอร์ก็ยังส่งทุกคำขอออกจาก IP เดียว และระบบอัตโนมัติจะถูกจับได้ทันทีที่เว็บไซต์จำกัดอัตราคำขอหรือทำ fingerprint กับที่อยู่นั้น การใช้ proxy กับ Playwright และ Puppeteer ช่วยกระจายทราฟฟิกไปยังหลาย IP และเมื่อทำถูกวิธี ก็ทำให้ระบบอัตโนมัติของคุณดูเหมือนผู้ใช้ทั่วไป นี่คือการตั้งค่าที่ใช้งานได้จริงสำหรับทั้งสองตัว ทั้งใน Python และ Node
ตั้งค่า proxy ตอนเปิดเบราว์เซอร์ ส่งการยืนยันตัวตนเป็นฟิลด์ username และ password แยกกัน — อย่าฝัง credentials ลงใน URL ของเซิร์ฟเวอร์:
from playwright.sync_api import sync_playwright
PROXY = {
"server": "http://gate.jibaoproxy.com:10001",
"username": "USERNAME",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(proxy=PROXY, headless=True)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.inner_text("body"))
browser.close()
JIBAO เปิดให้ใช้ทั้ง HTTP และ SOCKS5 บน gateway ใช้ endpoint แบบ HTTP สำหรับการทำเบราว์เซอร์อัตโนมัติ: Playwright และ Puppeteer ไม่รองรับ SOCKS5 proxy ที่มีการยืนยันตัวตน ดังนั้น HTTP พร้อม auth จึงเป็นตัวเลือกที่เชื่อถือได้
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true,
proxy: {
server: 'http://gate.jibaoproxy.com:10001',
username: 'USERNAME',
password: 'PASSWORD',
},
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.innerText('body'));
await browser.close();
})();
วิธีที่สะอาดที่สุดในการหมุน IP ใน Playwright คือใช้หนึ่ง IP ต่อหนึ่ง BrowserContext แต่ละ context เป็นเซสชันที่แยกอิสระจากกัน (มี cookies และ cache ของตัวเอง) ดังนั้นการผูกแต่ละ context เข้ากับ exit IP ที่ต่างกัน จะให้ตัวตนแบบขนานหลายตัวจากกระบวนการเบราว์เซอร์เดียว:
from playwright.sync_api import sync_playwright
def ctx_proxy(session_id):
return {
"server": "http://gate.jibaoproxy.com:10001",
"username": f"USERNAME-session-{session_id}",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
for i in range(3):
context = browser.new_context(proxy=ctx_proxy(f"ctx{i}"))
page = context.new_page()
page.goto("https://httpbin.org/ip")
print(i, page.inner_text("body"))
context.close()
browser.close()
แต่ละ context ใช้ sticky session token ที่ต่างกัน ดังนั้น IP จึงคงที่ภายใน context (ดีสำหรับ login flow) แต่ต่างกันระหว่าง context (ดีสำหรับการรันหลายบัญชีพร้อมกัน) นี่คือแพตเทิร์นที่ anti-detect browser อย่าง GoLogin และ Dolphin Anty ทำให้เป็นอัตโนมัติ — ดูคู่มือการตั้งค่า proxy แบบ anti-detectของเรา
Puppeteer ตั้งค่าเซิร์ฟเวอร์ proxy เป็น flag ตอนเปิด Chromium แล้วยืนยันตัวตนบน object ของ page:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: 'new',
args: ['--proxy-server=http://gate.jibaoproxy.com:10001'],
});
const page = await browser.newPage();
await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });
await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();
เนื่องจาก proxy เป็น flag ระดับกระบวนการ เบราว์เซอร์ Puppeteer หนึ่งตัวจึงใช้ IP เดียว หากต้องการหมุน IP ให้เปิดเบราว์เซอร์ใหม่ต่อหนึ่งตัวตน (หนักกว่า) หรือขับการหมุนผ่าน gateway ที่เปลี่ยน IP ต่อการเชื่อมต่อ
ทุก flow ที่สร้าง session cookie จะต้องคง IP เดิมไว้ตลอดอายุการใช้งาน cookie ที่ออกบน IP-A แล้วจู่ๆ ปรากฏจาก IP-B จะถูกอ่านว่าเป็นการยึดเซสชัน (session hijacking) และทำให้ต้องยืนยันตัวตนใหม่หรือถูกแบน ให้คงหนึ่ง context (หรือหนึ่งเบราว์เซอร์) ต่อหนึ่งบัญชีที่ล็อกอินไว้ ปักหมุดไว้ที่ sticky session token เดียวตลอดทั้งเซสชัน
residential IP เป็นสิ่งจำเป็นแต่ยังไม่เพียงพอ เว็บไซต์ยังอ่าน TLS/JA4 handshake ของเบราว์เซอร์ ลำดับเฟรม HTTP/2 canvas WebGL และคุณสมบัติของ navigator ด้วย Chromium แบบ headless ที่ไม่ปรับแต่งจะรั่ว navigator.webdriver = true และ fingerprint แบบ headless ที่เอาชนะแม้กระทั่ง IP ที่ดีที่สุดได้ บรรเทาด้วย stealth plugin และ launch flag ที่สมจริง:
// Node: puppeteer-extra + stealth
const puppeteer = require('puppeteer-extra');
const Stealth = require('puppeteer-extra-plugin-stealth');
puppeteer.use(Stealth());
// Realistic launch flags
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.jibaoproxy.com:10001',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080',
],
});
หากต้องการดูว่าคุณกำลังรั่วสัญญาณไหนบ้าง ให้รันเบราว์เซอร์อัตโนมัติของคุณกับเครื่องมือตรวจ fingerprint JA3/JA4ฟรีของ JIBAO สำหรับกลไกเชิงลึกว่าทำไม handshake ถึงถูกตั้งธง อ่านการข้าม TLS fingerprintingและสูตรข้าม Cloudflareฉบับสมบูรณ์
headless=False เพื่อดูว่าเป้าหมายแสดงอะไรให้บอตของคุณเห็นจริงๆรับ500MB ทราฟฟิกฟรี และ residential IP ที่ทำให้ Playwright และ Puppeteer พ้นจากรายชื่อถูกแบน
เริ่มทดลองใช้ฟรีผู้ใช้ใหม่รับ 500MB เมื่อสมัครสมาชิก พร้อมโบนัสในการเติมเงินครั้งแรก ข้อเสนอมีระยะเวลาจำกัด