🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Cách Sử Dụng Proxy Với Playwright: Hướng Dẫn Cần Thiết

James Thompson
James Thompson

Scraping and Proxy Management Expert

29-Jun-2026

Tóm tắt:

  • Playwright điều khiển một proxy từ một tùy chọn cấu hình. Tham số proxy nhận một máy chủ, tên người dùng và mật khẩu, và định dạng giống nhau hoạt động cho dù bạn khởi động một trình duyệt cục bộ hay kết nối với một trình duyệt từ xa.
  • Một điểm ra dân cư là điều tạo ra lưu lượng không có đầu giống như con người. Các dải IP trung tâm dữ liệu và dấu vân tay tự động hóa mặc định là hai tín hiệu mà các trang công cộng kiểm tra đầu tiên; định tuyến qua các địa chỉ dân cư thực tế loại bỏ tín hiệu đầu tiên.
  • Trình duyệt Scrapeless Scraping nói giao thức Chrome DevTools. Playwright kết nối với nó bằng chromium.connectOverCDP(endpoint), vì vậy các proxy dân cư và chống phát hiện hoạt động ở phía đám mây trong khi mã của bạn vẫn tương đối đơn giản với Playwright.
  • proxyCountry xác định khu vực ra; sessionName cộng với sessionTTL giữ một IP xuyên suốt các lần điều hướng. Nhắm mục tiêu địa lý và phiên liên tục là các tham số truy vấn trên chuỗi kết nối, không phải mã ứng dụng bổ sung.
  • Chạy song song mở rộng thông qua các phiên độc lập. Mở nhiều kết nối cùng lúc và mỗi kết nối nhận một IP dân cư riêng, không có giới hạn chỗ ngồi đồng thời.
  • Miễn phí để bắt đầu. Tài khoản Scrapeless mới bao gồm thời gian chạy miễn phí của Trình duyệt Scraping — đăng ký tại app.scrapeless.com.

Giới thiệu: Các proxy của Playwright, và nơi cấu hình thô dừng lại

Playwright điều khiển Chromium, Firefox và WebKit từ một API duy nhất, và tính năng tự động chờ đợi của nó làm cho các lần điều hướng ít dễ vỡ hơn so với thế hệ công cụ tự động hóa cũ hơn. Tuy nhiên, hai điều vẫn khiến mã Playwright bị chặn. Trình duyệt gửi một dấu vân tay tự động hóa mà các kịch bản phát hiện đọc, và nó kết nối từ bất kỳ IP nào mà máy chủ có — thường là địa chỉ đám mây hoặc trung tâm dữ liệu mà các trang công cộng giới hạn tỷ lệ hoặc hạn chế địa lý. Một proxy dân cư giải quyết nửa vấn đề mạng đó; một trình duyệt chống phát hiện giải quyết nửa vân tay.

Hướng dẫn này bắt đầu với hỗ trợ proxy của Playwright, vì đó là tùy chọn mà mọi proxy đều cắm vào. Sau đó, nó cho thấy nơi cấu hình proxy thô hết đường đi, và cách chuyển giao các trường hợp khó hơn cho một trình duyệt đám mây mà Playwright kết nối qua cùng một giao thức mà nó đã sử dụng cho Chromium.


Yêu cầu trước

  • Node.js 18 hoặc mới hơn
  • Tài khoản Scrapeless và khóa API — đăng ký tại app.scrapeless.com
  • Playwright đã được cài đặt (npm install playwright)
  • Kiến thức cơ bản về npm và các biến môi trường Node.js

Cài đặt

1. Thêm Playwright vào dự án của bạn

Nếu bạn chưa có Playwright, hãy cài đặt:

bash Copy
npm install playwright

Điều này sẽ tải thư viện Playwright cho cả ba động cơ trình duyệt.

2. Đặt khóa API Scrapeless của bạn

Lưu khóa dưới dạng biến môi trường để nó không bao giờ rơi vào kiểm soát nguồn:

bash Copy
export SCRAPELESS_API_KEY="your_api_key_here"

3. Không cần SDK bao bọc

Playwright kết nối với Trình duyệt Scraping Scrapeless qua Giao thức DevTools Chrome, vì vậy không cần cài đặt gói bổ sung nào ngoài chính Playwright.


Cấu hình proxy tích hợp sẵn của Playwright

Playwright chấp nhận cài đặt proxy trong launch() và trong newContext(). Chỉ định server đến cổng proxy của bạn và truyền thông tin xác thực:

javascript Copy
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://your-proxy-host:8080', // cổng proxy của bạn
      username: 'your-proxy-user',
      password: 'your-proxy-pass',
    },
  });

  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://example.com');
  console.log(await page.title());

  await browser.close();
})();

Đó là toàn bộ những gì thư viện cung cấp, và nó hoạt động giống nhau trên cả Chromium, Firefox và WebKit. Hai điều mà nó không làm: nó giả định bạn đã có một nhóm địa chỉ dân cư để chỉ định vào server, và nó giữ nguyên dấu vân tay tự động hóa của trình duyệt. Cấu hình proxy thô chuyển lưu lượng của bạn tới một IP mới; nó không thay đổi cách mà trang web đọc client.

Nhận khóa API của bạn trên gói miễn phí: app.scrapeless.com


Nơi cấu hình proxy thô dừng lại — dấu vân tay và nguồn IP

Hai khoảng trống giữa launch({ proxy }) và một lần chạy tự động hóa mà các trang công cộng cung cấp rõ ràng: tìm nguồn cung và luân chuyển một bể IP dân cư thực, và dấu vân tay mà trình duyệt trình bày khi nó đến. Trình duyệt Scraping Không Từ đóng cả hai. Đây là một trình duyệt đám mây chống phát hiện được xây dựng cho các bộ thu thập dữ liệu web và các tác nhân AI, và vì nó giao tiếp với Giao thức DevTools của Chrome, Playwright kết nối với nó chỉ bằng một dòng. Đối với Playwright cụ thể, nó mang lại:

  • Các nút thoát dân cư ở hơn 195 quốc gia, với dấu vân tay tự động hóa được xử lý phía đám mây.
  • Kết xuất JavaScript phía đám mây — trình duyệt từ xa thực hiện trang, vì vậy công việc sẽ rời khỏi máy của bạn.
  • Định vị địa lý và phiên kết nối dính như các thông số kết nốiproxyCountry, sessionName, và sessionTTL nằm trong chuỗi điểm cuối.
  • Không giới hạn chỗ ngồi đồng thời — trả tiền theo cách sử dụng và mở càng nhiều phiên càng tốt theo yêu cầu chạy.

Chuỗi kết nối mang khóa của bạn như tham số token; tài liệu tại docs.scrapeless.com liệt kê mọi tùy chọn. Nhận khóa API của bạn trên gói miễn phí tại app.scrapeless.com.

Kết nối Playwright qua CDP

Xây dựng điểm cuối WebSocket, sau đó kết nối với chromium.connectOverCDP(). Từ đó, đây là Playwright thông thường — proxy và việc xác định dấu vân tay đã được áp dụng trên trình duyệt từ xa:

javascript Copy
const { chromium } = require('playwright');

const token = process.env.SCRAPELESS_API_KEY;
const params = new URLSearchParams({
  token,
  proxyCountry: 'US',  // xác định khu vực thoát dân cư
  sessionTTL: '300',   // giữ phiên hoạt động trong 300 giây
});
const wsEndpoint = `wss://browser.scrapeless.com/api/v2/browser?${params.toString()}`;

(async () => {
  const browser = await chromium.connectOverCDP(wsEndpoint);
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  console.log('Tiêu đề:', await page.title());

  // Xác nhận rằng địa chỉ IP thoát là IP dân cư, không phải của máy chủ
  const ipPage = await context.newPage();
  await ipPage.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
  console.log('Địa chỉ IP:', await ipPage.evaluate(() => document.body.innerText));

  await browser.close();
})();

Ghi lại một quốc gia và tái sử dụng một IP

Định vị địa lý là tham số proxyCountry. Tính dính là sessionName cộng với một sessionTTL trực tiếp: tái sử dụng cùng một tên trong khoảng thời gian và mọi điều hướng đều xuất phát từ cùng một địa chỉ IP dân cư, điều này giữ cho một luồng đăng nhập trên một danh tính.

javascript Copy
const { chromium } = require('playwright');

const token = process.env.SCRAPELESS_API_KEY;

function endpoint({ country, session }) {
  const params = new URLSearchParams({
    token,
    proxyCountry: country,
    sessionName: session,  // cùng tên + TTL sống = cùng một địa chỉ IP thoát
    sessionTTL: '300',
  });
  return `wss://browser.scrapeless.com/api/v2/browser?${params.toString()}`;
}

(async () => {
  const browser = await chromium.connectOverCDP(endpoint({ country: 'US', session: 'demo-session' }));
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
  console.log('Lần đầu:', await page.evaluate(() => document.body.innerText));

  await page.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
  console.log('Lần thứ hai:', await page.evaluate(() => document.body.innerText));

  await browser.close();
})();

Chạy các phiên song song

Mỗi kết nối là độc lập, vì vậy một nhóm công nhân là Promise.all trên nhiều điểm cuối với những tên phiên khác nhau. Giữ độ đồng thời ở mức ba cho mỗi máy chủ để lịch sự:

javascript Copy
const { chromium } = require('playwright');

const token = process.env.SCRAPELESS_API_KEY;

function endpoint(session) {
  const params = new URLSearchParams({ token, proxyCountry: 'US', sessionName: session, sessionTTL: '180' });
  return `wss://browser.scrapeless.com/api/v2/browser?${params.toString()}`;
}

async function fetchIp(session) {
  const browser = await chromium.connectOverCDP(endpoint(session));
  try {
    const page = await browser.newContext().then(c => c.newPage());
    await page.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
    return { session, ip: JSON.parse(await page.evaluate(() => document.body.innerText)).ip };
  } finally {
    await browser.close();
  }
}

(async () => {
  const workers = ['worker-1', 'worker-2', 'worker-3'];

const results = await Promise.all(workers.map(fetchIp));
console.log(results);
})();


Những gì bạn nhận được

Mỗi phiên báo cáo một điểm xuất cư trú khác nhau, và một phiên dính báo cáo cùng một điểm hai lần. Chạy song song ở trên trả về một bản ghi cho mỗi worker:

javascript Copy
// Ví dụ minh họa — sơ đồ là chính xác; giá trị IP là minh họa và thay đổi theo mỗi phiên.
[
  { "session": "worker-1", "ip": "72.188.194.89" },
  { "session": "worker-2", "ip": "172.56.218.152" },
  { "session": "worker-3", "ip": "73.135.52.138" }
]

Ghi chú về sơ đồ:

  • proxyCountry: 'US' gán mỗi điểm xuất tới một địa chỉ cư trú ở Mỹ; thay đổi mã để nhắm tới vùng khác.
  • Trong một sessionNamesessionTTL đang hoạt động, IP giữ nguyên giữa các lượt điều hướng; một tên mới sẽ lấy một địa chỉ mới.
  • Các bộ chọn phải phù hợp với markup hiện tại của trang mục tiêu — thắt chặt chúng khi DOM thay đổi.
  • Trình duyệt từ xa thực thi JavaScript mặc định, vì vậy nội dung phía client có mặt trước khi bạn đọc DOM.

Khắc phục sự cố

Kết nối bị ngắt giữa chừng trong một phiên dài

Nguyên nhân: sessionTTL đã hết hạn trước khi quy trình làm việc hoàn tất.

Sửa chữa: Đặt sessionTTL để bao trùm toàn bộ quy trình ngay từ đầu — đây là thời gian sống của phiên theo giây, vì vậy hãy định kích thước cho chuỗi điều hướng dài nhất mà bạn mong đợi.

Trang vẫn cung cấp một trang "Access Denied"

Nguyên nhân: Một IP cư trú sạch không phải là tín hiệu duy nhất; một phiên lạnh nhảy ngay vào một URL sâu vẫn trông như tự động.

Sửa chữa: Làm ấm phiên bằng cách tải trang chủ của trang trước tiên trong cùng một ngữ cảnh, gán proxyCountry tới một vùng phù hợp với đối tượng và cung cấp các tùy chọn ngữ cảnh thực tế (userAgent, Accept-Language).

Lấy dữ liệu trả về các trường trống

Nguyên nhân: Các bộ chọn không còn phù hợp với markup được thực thi.

Sửa chữa: Kiểm tra lại trang và siết chặt các bộ chọn; bảo vệ các trường tùy chọn để một phần tử bị thiếu trả về null thay vì gây lỗi.


Kết luận: một lớp proxy không can thiệp vào mã ứng dụng của bạn

Một phiên Playwright được proxy giảm thành một vài bước: xây dựng endpoint, kết nối qua CDP, gán quốc gia, và viết cùng một Playwright mà bạn đã biết. launch({ proxy }) bao quát trường hợp bạn sở hữu pool; Scraping Browser bao quát các trường hợp bạn cần các điểm xuất cư trú thực và một dấu vân tay ổn định. Gán điểm xuất với proxyCountry, giữ một danh tính với sessionName cộng với sessionTTL đang hoạt động, giữ độ đồng thời ở ba mỗi host, và coi các trường bị thiếu như nullable. Để có cái nhìn rộng hơn về chiến lược luân phiên, xem best-rotating-proxies-2026.


Đã sẵn sàng tự động hóa quy mô với Playwright và Proxies?

Tham gia cộng đồng của chúng tôi để nhận kế hoạch miễn phí và kết nối với các nhà phát triển đang xây dựng tự động hóa Playwright: Discord · Telegram.

Đăng ký tại app.scrapeless.com để nhận runtime Scraping Browser miễn phí, xem xét giá cả, và điều chỉnh các mẫu trên cho các vùng và trang mà tự động hóa của bạn cần.


Câu hỏi thường gặp

Q: Việc scraping với Playwright có hợp pháp không?

Scraping dữ liệu công khai nhìn thấy được thường được phép, nhưng các quy tắc khác nhau tùy theo khu vực và điều khoản dịch vụ của một trang. Xem xét điều khoản của đối tượng, tránh dữ liệu nằm sau đăng nhập mà bạn không được phép sử dụng, và tham khảo ý kiến pháp lý cho bất kỳ điều gì nhạy cảm.

Q: Tôi cần một proxy không?

Bạn cần một cái bất cứ khi nào mục tiêu chặn IP từ trung tâm dữ liệu hoặc áp dụng hạn chế địa lý, điều này bao phủ hầu hết các trang công khai quy mô lớn. Một điểm xuất cư trú cho phép yêu cầu đến như lưu lượng người dùng bình thường; nếu không có, một IP đám mây sẽ dễ dàng bị chặn.

Q: Tôi nhận được trang "Access Denied" — làm thế nào để có một render sạch?

Tải trang chủ của trang trước tiên trong cùng một ngữ cảnh để làm ấm phiên, gán proxyCountry tới một vùng phù hợp với đối tượng, và thiết lập các tùy chọn ngữ cảnh thực tế như userAgentAccept-Language. Một lần nhấp vào URL sâu từ một ngữ cảnh lạnh là kích hoạt thông thường.

Q: Tôi có thể chạy nhiều phiên Playwright cùng một lúc không?

Có. Mỗi kết nối CDP là độc lập và lấy IP cư trú riêng của nó, vì vậy một pool worker là Promise.all qua vài endpoint với các giá trị sessionName khác nhau. Giữ độ đồng thời ở ba mỗi host để bạn ở trong giới hạn lịch sự.

Q: Làm thế nào tôi đổi quốc gia xuất phát?

Thay đổi tham số proxyCountry và mở một kết nối mới. Quốc gia được cố định khi phiên được tạo ra, vì vậy một vùng khác có nghĩa là một chuỗi endpoint mới thay vì thay đổi giữa phiên.

Q: Điều này có hoạt động trên các trang nhiều JavaScript không?

Có. Trình duyệt từ xa thực thi trang trước khi bạn đọc nó, vì vậy nội dung được kết xuất trên máy khách đã có trong DOM khi page.goto() hoàn tất. Sử dụng waitUntil: 'domcontentloaded' cộng với một khoảng thời gian ngắn ổn định trên các trang có mạng không bao giờ bị nhàn rỗi.

Hỏi: Điều gì xảy ra khi markup của trang web thay đổi?

Các bộ chọn liên kết với một lớp hoặc cấu trúc cụ thể sẽ hỏng khi một trang web tung ra thiết kế mới. Trích xuất liên kết từ tín hiệu ổn định nhất có sẵn — một thuộc tính dữ liệu hoặc một mẫu URL bền vững qua một lớp CSS đã băm — và kiểm tra lại các bộ chọn khi các trường bắt đầu trở về trống.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục