BinProxy
Hướng dẫn

Cách dùng proxy trong Playwright: cấu hình, proxy theo từng vị trí và chặn ảnh để tiết kiệm GB

Hướng dẫn từng bước dùng proxy dân cư trong Playwright cho Python và Node.js: gắn proxy khi mở trình duyệt, mỗi ngữ cảnh một vị trí, lưu ý về SOCKS5, giữ IP theo phiên và chặn ảnh để tiết kiệm GB.

6 phút đọc
Bàn làm việc sáng sủa với hai màn hình, một trang web và một trình soạn thảo code, người ngồi tựa ghế phía sau
Mục lục
  1. Bước 1: Cài Playwright
  2. Bước 2: Chuẩn bị thông tin proxy
  3. Bước 3: Gắn proxy khi mở trình duyệt
  4. Bước 4: Mỗi ngữ cảnh một proxy, một vị trí
  5. Bước 5: Lưu ý về SOCKS5: hãy dùng HTTP
  6. Bước 6: Chặn ảnh để tiết kiệm GB
  7. Bước 7: Giữ một IP cho cả lượt làm việc
  8. Bước 8: Vài thói quen tốt
  9. Câu hỏi thường gặp
  10. Playwright có dùng được SOCKS5 proxy không?
  11. Đặt proxy ở launch hay ở new_context thì tốt hơn?
  12. Chặn ảnh có làm trang hiển thị sai không?
  13. Vì sao trang ipinfo.io hiện quốc gia khác với proxy tôi chọn?
  14. Playwright có tốn nhiều GB hơn requests không?

Có những trang web chỉ hiện đủ nội dung khi chạy JavaScript, và lúc đó thư viện như requests không còn đủ. Bạn cần một trình duyệt thật chạy tự động, và Playwright là lựa chọn phổ biến nhất hiện nay. Bài này hướng dẫn từng bước cách dùng proxy trong Playwright cho cả Python lẫn Node.js: gắn proxy khi mở trình duyệt, mỗi "ngữ cảnh" một vị trí khác nhau, một lưu ý quan trọng về SOCKS5, và cách chặn ảnh để tiết kiệm GB khi dùng proxy dân cư tính theo dung lượng.

Bước 1: Cài Playwright

Với Python:

python -m pip install playwright
python -m playwright install chromium

Với Node.js:

npm install playwright
npx playwright install chromium

Lệnh thứ hai tải bản trình duyệt Chromium mà Playwright điều khiển. Bạn có thể cài thêm Firefox hay WebKit nếu cần, nhưng một Chromium là đủ cho phần lớn công việc.

Bước 2: Chuẩn bị thông tin proxy

Khác với requests, Playwright nhận proxy dưới dạng ba phần tách rời: địa chỉ máy chủ, tên đăng nhập và mật khẩu. Trên trang Tạo proxy của BinProxy, bạn chọn định dạng host:port:user:pass để dễ tách, ví dụ:

proxy.binproxy.com:80:USER-cc-VN:PASS

Khi điền vào Playwright, server là http://proxy.binproxy.com:80, username là phần USER-cc-VN (gồm luôn bộ lọc vị trí), còn password là PASS.

Bước 3: Gắn proxy khi mở trình duyệt

Theo tài liệu Playwright, tuỳ chọn proxy có bốn trường: server, username, password và bypass (danh sách tên miền không đi qua proxy). Ví dụ với Python:

from playwright.sync_api import sync_playwright

PROXY = {
    "server": "http://proxy.binproxy.com:80",
    "username": "USER-cc-VN",
    "password": "PASS",
}

with sync_playwright() as p:
    browser = p.chromium.launch(proxy=PROXY)
    page = browser.new_page()
    page.goto("https://ipinfo.io/json")
    print(page.inner_text("body"))
    browser.close()

Và với Node.js:

const { chromium } = require("playwright");

(async () => {
  const browser = await chromium.launch({
    proxy: { server: "http://proxy.binproxy.com:80", username: "USER-cc-VN", password: "PASS" },
  });
  const page = await browser.newPage();
  await page.goto("https://ipinfo.io/json");
  console.log(await page.innerText("body"));
  await browser.close();
})();

Nếu trang in ra có "country": "VN", proxy đã chạy đúng.

Bước 4: Mỗi ngữ cảnh một proxy, một vị trí

Playwright có khái niệm ngữ cảnh (context): mỗi ngữ cảnh giống một hồ sơ trình duyệt riêng, có cookie và bộ nhớ riêng, nhưng dùng chung một trình duyệt nên nhẹ hơn nhiều so với mở nhiều trình duyệt. Tài liệu Playwright cho phép đặt proxy riêng cho từng ngữ cảnh, nên bạn có thể kiểm tra cùng một trang ở nhiều nơi trong một lần chạy:

with sync_playwright() as p:
    browser = p.chromium.launch()
    for country in ["VN", "US", "JP"]:
        context = browser.new_context(proxy={
            "server": "http://proxy.binproxy.com:80",
            "username": f"USER-cc-{country}",
            "password": "PASS",
        })
        page = context.new_page()
        page.goto("https://ipinfo.io/json")
        print(country, page.inner_text("body")[:80])
        context.close()
    browser.close()

Sơ đồ một trình duyệt Playwright với ba ngữ cảnh, mỗi ngữ cảnh dùng một dòng proxy BinProxy khác nhau cho Việt Nam, Mỹ và Nhật Bản

Cách này rất tiện để so sánh kết quả tìm kiếm, giá hay nội dung hiển thị theo từng quốc gia.

Bước 5: Lưu ý về SOCKS5: hãy dùng HTTP

Playwright có nhận proxy SOCKS5, nhưng chỉ khi không có tên đăng nhập và mật khẩu. Trong tài liệu, tên đăng nhập được mô tả cho trường hợp proxy HTTP cần xác thực. Một người duy trì Playwright cũng đã trả lời rằng SOCKS5 có xác thực không được các trình duyệt hỗ trợ, và yêu cầu bổ sung tính năng này vẫn đang mở.

Proxy dân cư luôn cần tên đăng nhập và mật khẩu, nên với Playwright, bạn cứ dùng giao thức HTTP như các ví dụ trên. Ở BinProxy, HTTP và SOCKS5 dùng chung địa chỉ và cổng, nên bạn không cần đổi gì ngoài phần http://. Muốn hiểu thêm về hai giao thức, bạn đọc bài SOCKS5 proxy là gì.

Bước 6: Chặn ảnh để tiết kiệm GB

Trình duyệt tải mọi thứ trên trang, và phần nặng nhất thường là ảnh. Theo số liệu Web Almanac 2025, ảnh chiếm khoảng 1 MB trong một trang chủ trung vị nặng 2,86 MB. Nếu công việc của bạn chỉ cần chữ và số liệu, chặn ảnh là cách tiết kiệm dung lượng hiệu quả nhất.

Tài liệu Playwright hướng dẫn chặn yêu cầu bằng page.route() và route.abort(). Ví dụ chặn mọi yêu cầu loại ảnh:

def block_images(route):
    if route.request.resource_type == "image":
        route.abort()
    else:
        route.continue_()

page.route("**/*", block_images)
page.goto("https://example.com")

Với Node.js, bạn dùng route.request().resourceType() === "image" theo cùng cách. Bạn có thể thêm cả "font" và "media" vào điều kiện nếu không cần font và video. Bài 1 GB proxy dùng được bao nhiêu cho thấy chặn ảnh và font có thể giúp 1 GB dùng được gần gấp đôi số trang.

Máy tính mini và bộ chuyển mạch nhỏ trên kệ gỗ với dây mạng ngắn và đèn báo xanh

Bước 7: Giữ một IP cho cả lượt làm việc

Một trang web thường cần nhiều yêu cầu liên tiếp: tải trang, gọi dữ liệu, rồi chuyển trang. Với proxy xoay theo từng yêu cầu, mỗi yêu cầu có thể ra một IP khác, nên với trình duyệt bạn nên giữ IP cho cả một ngữ cảnh. Trên BinProxy, bạn chọn Giữ IP ở trang Tạo proxy, hoặc tự thêm mã phiên vào tên đăng nhập:

username = "USER-cc-VN-s-ab12cd34-ttl-600"  # giữ cùng một IP tối đa 10 phút

Mỗi ngữ cảnh một mã phiên khác nhau là mỗi ngữ cảnh một IP riêng. Cách đặt mã phiên được giải thích thêm trong bài proxy đổi IP là gì.

Bước 8: Vài thói quen tốt

  • Đặt thời gian chờ hợp lý cho page.goto(), vì proxy dân cư đi qua mạng gia đình nên đôi khi chậm hơn kết nối thẳng.
  • Đóng ngữ cảnh khi xong việc để giải phóng bộ nhớ và kết nối.
  • Đi chậm và lịch sự: chờ giữa các lần tải trang, tôn trọng robots.txt và điều khoản của website. Bài web scraping là gì có thêm các nguyên tắc nên giữ.
  • Theo dõi dung lượng trên trang Tổng quan của BinProxy trong vài ngày đầu để biết công việc thật sự tốn bao nhiêu GB, rồi chọn gói phù hợp ở bảng giá.

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

Playwright có dùng được SOCKS5 proxy không?

Có, nhưng chỉ với SOCKS5 không cần tên đăng nhập và mật khẩu. Với proxy dân cư có xác thực, bạn hãy dùng proxy HTTP.

Đặt proxy ở launch hay ở new_context thì tốt hơn?

Nếu cả chương trình dùng một proxy, đặt ở launch cho gọn. Nếu cần nhiều vị trí hoặc nhiều IP khác nhau trong một lần chạy, đặt riêng cho từng new_context.

Chặn ảnh có làm trang hiển thị sai không?

Bố cục có thể thiếu ảnh, nhưng chữ và dữ liệu vẫn tải bình thường. Nếu bạn cần chụp ảnh màn hình trang, đừng chặn ảnh.

Vì sao trang ipinfo.io hiện quốc gia khác với proxy tôi chọn?

Hãy kiểm tra lại phần -cc-… trong tên đăng nhập. Nếu đúng mà vẫn lệch ở cấp tỉnh, thành phố, đó thường là do các cơ sở dữ liệu định vị IP khác nhau. Ở cấp quốc gia thì hiếm khi lệch.

Playwright có tốn nhiều GB hơn requests không?

Có, vì trình duyệt tải cả ảnh, font, JavaScript và CSS. Nếu trang không cần JavaScript để hiện nội dung, dùng requests sẽ tiết kiệm hơn nhiều. Bài cách dùng proxy với Python requests hướng dẫn cách đó.

Bài viết liên quan