# Dùng Selenium với proxy xác thực: forwarder local hoạt động

> Proxy xác thực trong Selenium: vì sao Chrome bỏ qua thông tin proxy và forwarder Python 40 dòng để thêm. Proxy dân cư, không cần KYC.

- URL: https://crawlrelay.com/vi/docs/selenium/
- Cập nhật lần cuối: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Chrome không hỗ trợ đặt mật khẩu proxy qua flag. Một forwarder cục bộ nhỏ tại 127.0.0.1 sẽ thêm thông tin đăng nhập, nên Selenium chỉ thấy proxy mở cục bộ.

**Trả lời nhanh — Làm sao để dùng proxy có username và password trong Selenium?**

Chạy một forwarder nhỏ thêm header `Proxy-Authorization`, rồi trỏ Chrome tới nó bằng `--proxy-server=http://127.0.0.1:8899`. Chrome bỏ qua credential trong flag này và Selenium không có tùy chọn proxy-password tiện lợi. Proxy dân cư **CrawlRelay** làm vậy với `gw.crawlrelay.com:7777`, từ 0,50 US$/GB. Thanh toán bằng crypto, không cần KYC.

## Tóm tắt cấu hình Selenium

| Thuộc tính | Giá trị |
| --- | --- |
| Tại sao cần forwarder | Flag `--proxy-server` của Chrome không hỗ trợ username hoặc password |
| Forwarder | Lắng nghe ở `127.0.0.1:8899`, thêm `Proxy-Authorization`, chuyển tiếp tới `gw.crawlrelay.com:7777` |
| Tùy chọn Chrome | `--proxy-server=http://127.0.0.1:8899` |
| Xoay vòng | Mỗi tunnel CONNECT mới là một kết nối mới, thường là một exit mới; thêm session ID để có một IP |
| Giải pháp đơn giản hơn | [Playwright](https://crawlrelay.com/vi/docs/playwright/) lấy trực tiếp tên người dùng và mật khẩu |

## Forwarder cục bộ hoạt động như thế nào?

Nó nhận yêu cầu proxy từ trình duyệt, chèn một header với thông tin xác thực của bạn, sau đó sao chép dữ liệu qua lại hai chiều. Với một trang HTTPS, trình duyệt gửi `CONNECT host:443`, gateway trả lời `200 Connection established`, và TLS chạy trực tiếp giữa Chrome và trang web. Forwarder không bao giờ xem nội dung trang ở dạng văn bản rõ.

Phiên bản tối giản này xử lý các trang HTTPS, trong đó mỗi kết nối chứa một đường hầm CONNECT. Điều này áp dụng cho hầu hết các trang web hiện nay. Giữ cho nó liên kết với `127.0.0.1` để không máy nào khác có thể dùng thông tin xác thực của bạn.

*forwarder.py (Python 3.8+, chỉ thư viện chuẩn)*

```python
import asyncio
import base64
import os

UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())


async def pipe(reader, writer):
    try:
        while True:
            data = await reader.read(65536)
            if not data:
                break
            writer.write(data)
            await writer.drain()
    except ConnectionError:
        pass
    finally:
        writer.close()


async def handle(client_reader, client_writer):
    try:
        head = await client_reader.readuntil(b"\r\n\r\n")  # request line and headers from the browser
    except asyncio.IncompleteReadError:
        client_writer.close()
        return
    lines = head.split(b"\r\n")
    lines.insert(1, AUTH)  # add the credentials right after the request line
    up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
    up_writer.write(b"\r\n".join(lines))
    await up_writer.drain()
    await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))


async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 8899)
    async with server:
        await server.serve_forever()


if __name__ == "__main__":
    asyncio.run(main())
```

## Làm sao để tôi trỏ Selenium tới forwarder?

Khởi động `forwarder.py` trong một terminal, rồi chạy script Selenium của bạn với địa chỉ proxy cục bộ. Selenium Manager được tích hợp trong Selenium 4.6 trở lên sẽ tải ChromeDriver tương ứng, nên không cần cài gì thêm.

*selenium_example.py*

```python
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899")  # the local forwarder
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
try:
    driver.set_page_load_timeout(60)
    driver.get("https://api.ipify.org")
    print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()
```

## Làm sao để có một IP mỗi phiên Selenium, hoặc một IP mới mỗi trang?

Forwarder gửi bất cứ tên người dùng nào bạn cung cấp, nên hành vi phiên làm việc phụ thuộc vào tên người dùng đó:

- **Xoay IP mỗi kết nối:** không thêm phần session (`USERNAME-country-us`). Chrome mở nhiều kết nối trên một trang, nên một trang có thể tải qua nhiều exit.
- **Một IP cho mỗi phiên Selenium:** đặt `CRAWLRELAY_USER` thành `USERNAME-country-us-session-run42-ttl-30` trước khi khởi động forwarder. Mỗi kết nối sẽ ra qua cùng một IP trong tối đa 30 phút; IP có thể thay đổi sớm hơn.
- **Nhiều phiên chạy song song:** chạy một forwarder cho mỗi phiên trên các cổng cục bộ khác nhau, ví dụ 8899 và 8900, và cho mỗi WebDriver dùng cổng riêng.

## Còn selenium-wire hoặc các extension trình duyệt thì sao?

selenium-wire, một package phổ biến để thêm xác thực proxy bằng cách chặn lưu lượng, đã bị tác giả lưu trữ từ tháng 1 năm 2024 và không còn cập nhật. Một extension trình duyệt cũng có thể xử lý yêu cầu xác thực proxy, nhưng cần phải đóng gói và tải vào từng profile. Forwarder ở trên không cần phụ thuộc nào và dùng được với bất kỳ trình duyệt nào do Selenium điều khiển. Với dự án mới, [Playwright](https://crawlrelay.com/vi/docs/playwright/) còn đơn giản hơn: nó nhận trực tiếp tên và mật khẩu proxy.

## Selenium và proxy: các câu hỏi

### Tại sao Chrome hiện pop-up đăng nhập khi dùng proxy trong Selenium?

Vì proxy yêu cầu thông tin xác thực và Chrome không có: cờ `--proxy-server` chỉ cho phép nhập host và port. Chế độ headless cũng gặp vấn đề tương tự dưới dạng `ERR_TUNNEL_CONNECTION_FAILED`. Hãy dùng forwarder cục bộ để thêm thông tin xác thực, hoặc chuyển sang Playwright, nó chấp nhận tên người dùng và mật khẩu trực tiếp.

### Forwarder có làm chậm quá trình scraping của tôi không?

Gần như không. Nó chỉ sao chép dữ liệu giữa hai socket cục bộ và một socket từ xa, không giải mã bất cứ gì. Thời gian tải trang phụ thuộc vào proxy dân cư và trang đích, không phải vào forwarder chạy trên cùng máy.

### Tôi có thể dùng Firefox thay cho Chrome với Selenium không?

Được. Cấu hình proxy của Firefox qua `FirefoxOptions`: đặt `network.proxy.type` là 1, và `network.proxy.http`, `network.proxy.ssl` thành `127.0.0.1` với port 8899. Giữ forwarder chạy phía trước: Firefox sẽ hiện hộp thoại yêu cầu xác thực proxy mà Selenium không thể điền tự động.

### Mật khẩu của tôi có an toàn trong forwarder không?

Nó nằm trên máy của bạn miễn forwarder đang nghe tại `127.0.0.1` như ví dụ. Hãy đọc mật khẩu từ biến môi trường, không bao giờ commit vào code, và dùng một sub-user riêng kèm hạn mức lưu lượng cho mỗi scraper để phòng mật khẩu bị lộ làm cạn kiệt toàn bộ gói dịch vụ của bạn.

**Cách cho Selenium dùng exit proxy dân cư** 1,50 US$ cho 1 GB để thử nghiệm, 0,50 US$/GB từ 50 GB. [Xem giá](https://crawlrelay.com/vi/pricing/) · [Hướng dẫn Playwright](https://crawlrelay.com/vi/docs/playwright/)

---

CrawlRelay: CrawlRelay là dịch vụ proxy dân cư xoay vòng và proxy di động 4G/5G dành cho nhà phát triển, hỗ trợ scrapers và pipeline dữ liệu AI: traffic trả tiền theo nhu cầu không hết hạn từ 0,50 US$/GB, thanh toán bằng crypto, không cần tải lên ID. Không cần KYC — không cần ID, không chụp selfie, không giấy tờ.
