Socks5Proxy

Cài đặt proxy Playwright, kết nối IP khác nhau cho mỗi trình duyệt và ngữ cảnh

Hướng dẫn này giải thích cách kết nối proxy HTTP và SOCKS5 của Socks5Proxy vào tùy chọn proxy của Playwright qua server, username, password, và cách sử dụng IP khác cho mỗi context trong cùng trình duyệt bằng mã Node.js và Python.

Cài đặt proxy nào là thuận tiện nhất trong Playwright?

Playwright nhận địa chỉ proxy, tên người dùng và mật khẩu như một tùy chọn proxy duy nhất, vì vậy không cần xử lý cửa sổ xác thực riêng. Cả ba trình duyệt Chromium, Firefox và WebKit đều sử dụng cùng một tùy chọn.

Bạn cũng có thể chạy một trình duyệt và tạo nhiều context, mỗi context dùng proxy khác. Context là profile riêng với cookie và storage tách biệt, giúp quản lý nhiều IP và session cùng lúc trong một trình duyệt để tiết kiệm bộ nhớ.

Ví dụ sử dụng IP 198.51.100.23, cổng HTTP 8000, cổng SOCKS5 1080, username spx_user, password spx_pass.

npm install playwright
npx playwright install chromium

Làm thế nào để kết nối HTTP proxy cho toàn bộ trình duyệt?

Thêm server, username và password vào tùy chọn proxy của launch để tất cả các trang trong trình duyệt đó sử dụng cùng một proxy. Các trang web HTTPS sẽ được chuyển tiếp thông qua kết nối CONNECT được mã hóa.

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();

Làm thế nào để sử dụng IP khác nhau cho từng context?

Thêm tùy chọn proxy vào newContext để chỉ context đó sử dụng proxy đó. Đoạn mã dưới đây nhận danh sách qua API và tạo ba context với các IP khác nhau, sau đó hiển thị IP mà mỗi context nhìn thấy. Đối với các tác vụ quản lý nhiều tài khoản cùng lúc, bạn có thể ghép một tài khoản với một IP trong một context.

Một số phiên bản Chromium và môi trường Windows yêu cầu tùy chọn proxy trong launch để sử dụng proxy theo ngữ cảnh. Trong trường hợp đó, bạn có thể đặt proxy đầu tiên trong launch và ghi đè lên từng ngữ cảnh.

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();

Làm thế nào để sử dụng proxy SOCKS5?

Chỉ cần thêm địa chỉ socks5:// vào server. Chromium không hỗ trợ xác thực username và password cho SOCKS5 proxy, vì vậy khuyến nghị kết nối SOCKS5 bằng IP authorization. Đăng ký IPv4 của máy chủ thực thi vào dashboard và chỉ cần thêm server mà không cần username và password.

Nếu cần kết nối bằng tên người dùng và mật khẩu, bạn có thể sử dụng cổng HTTP của cùng một IP. IP và vị trí hiển thị trên trang đích sẽ giống nhau.

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();

Làm thế nào để sử dụng trong Python?

Playwright cho Python có cùng cấu trúc. Nhập server, username và password vào từ điển proxy. Ví dụ đồng bộ được đặt bên dưới. Tùy chọn không đồng bộ cũng có cùng tên.

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()

Cần điều chỉnh gì để kết quả hiển thị như người dùng tại quốc gia đó?

Đặt locale và timezoneId của context theo quốc gia IP để trang hiển thị đúng ngôn ngữ và thời gian cho người dùng nước đó. Ví dụ IP Đức: locale de-DE, timezoneId Europe/Berlin.

Nếu không cần hình ảnh và video, bạn có thể chặn các yêu cầu này bằng page.route để tiết kiệm băng thông và thời gian. Điều này đặc biệt hữu ích với các gói shared có băng thông hàng tháng giới hạn.

  • Đặt locale và timezoneId phù hợp với quốc gia của IP
  • Mỗi context một tài khoản, một IP
  • Chặn các yêu cầu hình ảnh và video không cần thiết bằng page.route
  • SOCKS5 sử dụng IP authorization, tên người dùng và mật khẩu là cổng HTTP

Làm thế nào để tự động nhận và phân chia danh sách cho từng tác vụ?

GET /proxies trong API trả về JSON mỗi dòng gồm IP, cổng, quốc gia. Thêm điều kiện quốc gia để nhận danh sách phù hợp công việc theo quốc gia ngay. Code mẫu sau nhận chỉ proxy Mỹ và tạo context theo số lượng công việc. Tên trường phản hồi xem trong tài liệu API.

Nếu có nhiều công việc, đừng giữ các kết nối mở đến cuối mà hãy đóng chúng sau khi hoàn thành để giải phóng bộ nhớ.

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();

Làm thế nào để tiết kiệm băng thông bằng cách chặn các yêu cầu không cần thiết?

Sử dụng page.route hoặc context.route để chặn các yêu cầu hình ảnh, phông chữ và video sẽ giúp trang tải nhanh hơn và tiết kiệm băng thông proxy. Điều này đặc biệt hiệu quả trong các tác vụ thu thập dữ liệu chỉ cần dữ liệu.

await context.route("**/*", (route) => {
  const type = route.request().resourceType();
  return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});

Firefox và WebKit có sử dụng cùng một proxy không?

Đúng vậy. Playwright hỗ trợ cùng một tùy chọn proxy cho cả ba trình duyệt. Nếu bạn làm việc trong nhóm kiểm thử, bạn có thể sử dụng cùng một proxy để khởi động Chromium, Firefox và WebKit lần lượt, kiểm tra xem giao diện trang web có nhất quán trên các trình duyệt khác nhau không.

Firefox không hỗ trợ xác thực username và password cho SOCKS5 trong trình duyệt, giống như Chromium, vì vậy hãy kết nối SOCKS5 bằng IP authorization. Cổng HTTP có thể được kết nối bằng username và password trên cả ba trình duyệt.

Nếu bạn sử dụng Playwright Test, bạn có thể thêm proxy vào mục use trong playwright.config để áp dụng cho tất cả các bài kiểm tra hoặc chia dự án theo quốc gia và cấp proxy khác nhau cho mỗi dự án.

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" } } },
  ],
});

Làm thế nào để giải quyết các lỗi thường gặp?

net::ERR_PROXY_CONNECTION_FAILED xuất hiện khi địa chỉ server hoặc cổng không chính xác. Mã 407 hoặc lỗi liên quan đến xác thực, hãy kiểm tra giá trị username và password. Lỗi 'Browser does not support socks5 proxy authentication' xuất hiện khi bạn thêm username và password vào SOCKS5. Hãy chuyển sang IP authorization hoặc sử dụng cổng HTTP.

Cài đặt proxy Playwright, IP theo trình duyệt và ngữ cảnh | Socks5Proxy