การตั้งค่า proxy ใน Playwright เชื่อมต่อ IP ต่างกันสำหรับแต่ละเบราว์เซอร์และ context
คู่มือนี้จะอธิบายวิธีการเชื่อมต่อ HTTP Proxy และ SOCKS5 Proxy ของ Socks5Proxy ด้วยตัวเลือก proxy ของ Playwright โดยใช้ server, username, password และวิธีการใช้ IP ที่แตกต่างกันในแต่ละ context ในเบราว์เซอร์เดียว ด้วยโค้ด Node.js และ Python
การตั้งค่า proxy ใน Playwright แบบไหนที่สะดวก?
Playwright รับที่อยู่ proxy ชื่อผู้ใช้ และรหัสผ่านเป็นตัวเลือก proxy เดียว ไม่ต้องจัดการหน้าต่างยืนยันตัวตนแยก ทั้ง Chromium, Firefox และ WebKit ใช้ตัวเลือกเดียวกัน
นอกจากนี้ เมื่อรันเบราว์เซอร์เพียงตัวเดียวและสร้างหลาย context สามารถกำหนด proxy ที่ต่างกันให้แต่ละ context ได้ context เป็นโปรไฟล์แยกที่มีคุกกี้และที่เก็บแยกกัน ทำให้สามารถจัดการหลาย IP และหลาย session พร้อมกันด้วยเบราว์เซอร์เดียว ช่วยประหยัดหน่วยความจำ
ตัวอย่างใช้ IP 198.51.100.23 พอร์ต HTTP 8000 พอร์ต SOCKS5 1080 ชื่อผู้ใช้ spx_user และรหัสผ่าน spx_pass
npm install playwright
npx playwright install chromiumวิธีเชื่อมต่อ HTTP proxy ทั้งเบราว์เซอร์
เมื่อเพิ่ม server, username และ password ในตัวเลือก proxy ของ launch ทุกหน้าของเบราว์เซอร์นั้นจะใช้พร็อกซี่เดียวกัน เว็บไซต์ HTTPS จะถูกส่งผ่านอุโมงค์ CONNECT ที่เข้ารหัส
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body")); // proxy IP
await browser.close();วิธีใช้ IP ต่างกันในแต่ละ context?
การเพิ่มตัวเลือก proxy ใน newContext จะทำให้เฉพาะ context นั้นใช้พร็อกซี่นั้น โค้ดด้านล่างรับรายการผ่าน API สร้าง 3 context ด้วย IP ที่ต่างกัน และแสดง IP ที่เห็นในแต่ละ context สำหรับงานที่จัดการหลายบัญชีพร้อมกัน ให้จับคู่บัญชีหนึ่งบัญชีกับหนึ่ง IP ในหนึ่ง context
Some Chromium versions and Windows environments require the proxy option in launch to use context-specific proxies. In such cases, add the first proxy in launch and overwrite it per context.
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);
const browser = await chromium.launch();
for (const line of lines) {
const [ip, port, user, pass] = line.trim().split(":");
const context = await browser.newContext({
proxy: { server: "http://" + ip + ":" + port, username: user, password: pass },
locale: "en-US",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(ip, await page.textContent("body"));
await context.close();
}
await browser.close();จะใช้ SOCKS5 Proxy อย่างไร
เพียงเพิ่มที่อยู่ socks5:// ใน server Chromium ไม่รองรับการยืนยันตัวตนด้วย username และ password สำหรับ SOCKS5 ดังนั้นแนะนำให้ใช้การยืนยันตัวตนด้วย IP สำหรับ SOCKS5 ลงทะเบียน IPv4 ของเซิร์ฟเวอร์ที่ใช้งานในแดชบอร์ดและเพิ่มเฉพาะ server โดยไม่ต้องใช้ username และ password
หากต้องเชื่อมต่อด้วยชื่อผู้ใช้และรหัสผ่าน ให้ใช้พอร์ต HTTP ของ IP เดียวกัน IP และตำแหน่งที่แสดงบนเว็บไซต์เป้าหมายจะเหมือนกัน
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "socks5://198.51.100.23:1080" }, // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await browser.close();วิธีการใช้งานใน Python?
Playwright สำหรับ Python มีโครงสร้างเดียวกัน ใส่ server, username, password ใน dictionary proxy ดูตัวอย่างแบบ synchronous ด้านล่าง ตัวเลือกชื่อเดียวกันสำหรับแบบ asynchronous
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://198.51.100.23:8000",
"username": "spx_user",
"password": "spx_pass",
})
page = browser.new_page()
page.goto("https://api.ipify.org")
print(page.text_content("body"))
browser.close()เพื่อให้ผลลัพธ์ดูเหมือนผู้ใช้ในประเทศนั้น ต้องปรับอะไร?
ตั้งค่า locale และ timezoneId ของ context ให้ตรงกับประเทศ IP เพื่อให้หน้าเว็บแสดงผลในภาษาและเวลาที่ผู้ใช้ในประเทศนั้นเห็น เช่น หากใช้ IP ของเยอรมนี ให้ใช้ locale de-DE และ timezoneId Europe/Berlin
หากไม่ต้องการรูปภาพและวิดีโอ คุณสามารถใช้ page.route เพื่อบล็อกคำขอเหล่านั้นและประหยัดแบนด์วิธกับเวลา แผนแชร์ที่มีปริมาณข้อมูลต่อเดือนจำกัดจะได้รับประโยชน์เป็นพิเศษ
- ตั้งค่า locale และ timezoneId ให้ตรงกับประเทศของ IP
- หนึ่งบัญชีต่อหนึ่ง context หนึ่ง IP
- บล็อกคำขอภาพ/วิดีโอที่ไม่จำเป็นด้วย page.route
- SOCKS5 ใช้การรับรอง IP ส่วนชื่อผู้ใช้และรหัสผ่านใช้สำหรับพอร์ต HTTP
จะรับรายการอัตโนมัติและแบ่งใช้ตามงานได้อย่างไร?
GET /proxies ใน API ส่งกลับ IP พอร์ต และประเทศในแต่ละบรรทัดในรูปแบบ JSON ใส่เงื่อนไขประเทศเพื่อรับรายการที่เหมาะกับงานแต่ละประเทศได้ทันที ตัวอย่างโค้ดด้านล่างรับเฉพาะพร็อกซี่สหรัฐฯ แล้วสร้างคอนเท็กซ์ตามจำนวนงาน ชื่อคอลัมน์คำตอบตรวจสอบได้ในเอกสาร API
หากมีงานจำนวนมาก อย่าเปิด context ค้างไว้จนจบ ควรปิดทุกครั้งที่งานเสร็จเพื่อคืนหน่วยความจำ
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies?country=us&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const { proxies } = await res.json();
const browser = await chromium.launch();
for (const p of proxies.slice(0, 5)) {
const context = await browser.newContext({
proxy: { server: "http://" + p.host + ":" + p.http_port, username: p.username, password: p.password },
locale: "en-US",
timezoneId: "America/New_York",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await context.close();
}
await browser.close();จะบล็อกคำขอที่ไม่จำเป็นเพื่อประหยัดแบนด์วิธได้อย่างไร?
การใช้ page.route หรือ context.route เพื่อบล็อกคำขอรูปภาพ ฟอนต์ และวิดีโอ จะทำให้หน้าโหลดเร็วขึ้นและลดการใช้แบนด์วิธของพร็อกซี่ มีประสิทธิภาพเป็นพิเศษสำหรับงานเก็บข้อมูลที่ต้องการเฉพาะข้อมูล
await context.route("**/*", (route) => {
const type = route.request().resourceType();
return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});Can the same proxy be used in Firefox and WebKit?
ใช่ Playwright รับตัวเลือก proxy เดียวกันสำหรับทั้งสามเบราว์เซอร์ ทีมทดสอบสามารถใช้ proxy เดียวกันเพื่อเปิด Chromium, Firefox, WebKit ตามลำดับ และตรวจสอบว่าหน้าจอประเทศเดียวกันในแต่ละเบราว์เซอร์
Firefox, like Chromium, does not support SOCKS5 username and password authentication in the browser, so connect SOCKS5 via IP authorization. HTTP ports connect with username and password in all three browsers.
หากใช้ Playwright Test สามารถเพิ่ม proxy ใน use ของ playwright.config เพื่อใช้กับทุกการทดสอบ หรือแบ่งโครงการตามประเทศและกำหนด proxy ที่ต่างกันให้แต่ละส่วน
import { defineConfig } from "@playwright/test";
export default defineConfig({
projects: [
{ name: "us", use: { locale: "en-US", proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" } } },
{ name: "de", use: { locale: "de-DE", proxy: { server: "http://198.51.100.24:8000", username: "spx_user", password: "spx_pass" } } },
],
});วิธีแก้ไขข้อผิดพลาดที่พบบ่อย?
net::ERR_PROXY_CONNECTION_FAILED เกิดจากที่อยู่ server หรือพอร์ตที่ไม่ถูกต้อง ข้อผิดพลาด 407 หรือเกี่ยวกับการยืนยันตัวตน ตรวจสอบค่า username และ password ข้อผิดพลาด 'Browser does not support socks5 proxy authentication' เกิดขึ้นเมื่อใช้ username และ password กับ SOCKS5 ให้เปลี่ยนเป็นการยืนยันตัวตนด้วย IP หรือใช้พอร์ต HTTP แทน