← Quay lại blog

Proxy cho Scrapling, Botasaurus và nodriver: cấu hình chống lại bot trong năm 2024

Phân tích cài đặt proxy trong các framework mới cho việc thu thập dữ liệu - Scrapling, Botasaurus và nodriver. Mã, ví dụ về xoay vòng, khuyến nghị về việc chọn IP để vượt qua bảo vệ chống bot.

📅21 tháng 10, 2026

Các liên kết cổ điển giữa Selenium và Puppeteer ngày càng gặp khó khăn với các hệ thống chống bot như Cloudflare, DataDome và PerimeterX. Thay vào đó, các framework mới — Scrapling, Botasaurus và nodriver, được thiết kế từ đầu với trọng tâm vào việc vượt qua phát hiện. Nhưng ngay cả một framework tiên tiến nhất cũng vô dụng nếu không có proxy được cấu hình đúng. Trong bài viết này, chúng ta sẽ phân tích cách kết nối proxy trong từng công cụ, những lỗi nào làm giảm hiệu quả và cách chọn loại IP cho từng nhiệm vụ thu thập dữ liệu cụ thể.

Scrapling, Botasaurus và nodriver khác gì so với Selenium

Cả ba framework này xuất hiện như một phản ứng trước việc Selenium và Puppeteer thông thường trở nên quá dễ bị phát hiện. Các hệ thống chống bot kiểm tra hàng chục tham số: giao thức CDP, navigator.webdriver, việc vẽ canvas, thời gian sự kiện — và các driver cổ điển để lại dấu vết đặc trưng trong hầu hết các tham số đó.

Scrapling — thư viện Python kết hợp việc phân tích HTML thích ứng với khả năng mô phỏng trình duyệt thông qua StealthyFetcher dựa trên Camoufox (nhánh của Firefox với fingerprint đã được sửa). Nó rất tốt cho các nhiệm vụ, nơi cần phân tích nhanh với mức tiêu thụ tài nguyên tối thiểu, nhưng đồng thời bảo vệ của trang web đang kiểm tra tích cực TLS-fingerprint.

Botasaurus — framework dựa trên Chromium đã được sửa đổi (undetected-chromedriver bên trong), được thiết kế cho việc thu thập dữ liệu hàng loạt song song với quản lý tự động các hồ sơ trình duyệt và hỗ trợ tích hợp giải quyết captcha thông qua các dịch vụ bên ngoài.

nodriver — người kế nhiệm undetected-chromedriver từ cùng một tác giả, đã từ bỏ Selenium WebDriver hoàn toàn và hoạt động trực tiếp qua CDP (Giao thức DevTools của Chrome), điều này loại bỏ một phần lớn các artefact có thể phát hiện được của tự động hóa.

Điểm chung của cả ba framework là chúng giảm thiểu phát hiện ở cấp độ fingerprint trình duyệt, nhưng không giải quyết vấn đề về uy tín IP. Nếu các yêu cầu đến từ một IP của trung tâm dữ liệu đã bị đưa vào danh sách đen bởi DataDome hoặc Cloudflare, không có bản vá trình duyệt nào có thể cứu bạn khỏi captcha hoặc lỗi 403.

Cấu hình proxy trong Scrapling

Scrapling hỗ trợ proxy cả trong chế độ HTTP nhanh (Fetcher) và chế độ trình duyệt (StealthyFetcher). Đối với việc phân tích tĩnh mà không cần JS-rendering, proxy được truyền trực tiếp trong các tham số yêu cầu:

from scrapling.fetchers import Fetcher

response = Fetcher.get(
    "https://example.com",
    proxy="http://user:[email protected]:9000"
)
print(response.status)

Đối với chế độ với trình duyệt hoàn chỉnh (StealthyFetcher trên Camoufox), proxy được truyền qua một từ điển với các trường riêng biệt cho máy chủ, tên đăng nhập và mật khẩu — điều này rất quan trọng, vì Camoufox xử lý xác thực proxy khác với Chromium thông thường:

from scrapling.fetchers import StealthyFetcher

response = StealthyFetcher.fetch(
    "https://example.com",
    proxy={
        "server": "gate.proxycove.com:9000",
        "username": "user",
        "password": "pass"
    },
    headless=True
)
print(response.status)

Một lỗi thường gặp là truyền proxy dưới dạng chuỗi hoàn chỉnh trong chế độ trình duyệt, như trong các yêu cầu HTTP. Camoufox trong trường hợp này hoặc là bỏ qua xác thực, hoặc bị lỗi với thời gian chờ trong giai đoạn kết nối đến máy chủ proxy. Nếu bạn thấy lỗi ERR_NO_SUPPORTED_PROXIES — hãy kiểm tra định dạng là từ điển với các trường riêng biệt.

Cấu hình proxy trong Botasaurus

Botasaurus sử dụng decorator @browser để cấu hình driver, và proxy được truyền như một tham số của decorator này hoặc trực tiếp vào hàm khởi động:

from botasaurus.browser import browser, Driver

@browser(
    proxy="http://user:[email protected]:9000"
)
def scrape_data(driver: Driver, data):
    driver.get("https://example.com")
    return driver.page_html

scrape_data()

Nếu cần kết nối các proxy khác nhau cho mỗi nhiệm vụ song song (điều này rất quan trọng khi thu thập dữ liệu hàng loạt qua Botasaurus), tốt hơn là truyền proxy một cách động qua danh sách dữ liệu, thay vì cứng hóa trong decorator:

from botasaurus.browser import browser, Driver

@browser
def scrape_with_proxy(driver: Driver, data):
    driver.config.proxy = data["proxy"]
    driver.get(data["url"])
    return driver.page_html

tasks = [
    {"url": "https://example.com/page1", "proxy": "http://user:pass@ip1:port"},
    {"url": "https://example.com/page2", "proxy": "http://user:pass@ip2:port"},
]
scrape_with_proxy(tasks)

Botasaurus rất tốt trong việc song song hóa các nhiệm vụ qua multiprocessing, vì vậy khi thu thập dữ liệu hàng loạt, quan trọng là sử dụng proxy với một lượng IP đủ lớn — nếu không, một số luồng sẽ va chạm vào cùng một địa chỉ, điều này ngay lập tức tiết lộ tự động hóa cho hệ thống chống bot theo mẫu tần suất yêu cầu.

Cấu hình proxy trong nodriver

nodriver hoạt động thông qua kết nối trực tiếp đến CDP mà không có lớp Selenium, vì vậy proxy ở đây được cấu hình thông qua các tham số khởi động trình duyệt, chứ không phải thông qua API riêng biệt. Đối với proxy không cần xác thực, mọi thứ rất đơn giản:

import nodriver as uc
import asyncio

async def main():
    browser = await uc.start(
        browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
    )
    page = await browser.get("https://example.com")
    await asyncio.sleep(3)
    browser.stop()

asyncio.run(main())

Vấn đề là Chromium không hỗ trợ đăng nhập/mật khẩu trong proxy thông qua --proxy-server trực tiếp. Đối với proxy có xác thực trong nodriver, bạn cần hoặc là thiết lập một tunnel proxy cục bộ không cần xác thực (ví dụ, thông qua px hoặc 3proxy), hoặc xử lý sự kiện CDP Fetch.authRequired:

import nodriver as uc
import asyncio

async def main():
    browser = await uc.start(
        browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
    )
    page = await browser.get("https://example.com")

    async def auth_handler(event):
        await page.send(uc.cdp.fetch.continue_with_auth(
            request_id=event.request_id,
            auth_challenge_response=uc.cdp.fetch.AuthChallengeResponse(
                response="ProvideCredentials",
                username="user",
                password="pass"
            )
        ))

    page.add_handler(uc.cdp.fetch.AuthRequired, auth_handler)
    await asyncio.sleep(5)
    browser.stop()

asyncio.run(main())

Đây là điểm không rõ ràng nhất trong số ba framework — nhiều nhà phát triển mất hàng giờ để hiểu tại sao xác thực không hoạt động, mà không biết về miền Fetch trong CDP.

Xoay vòng proxy và chống lại các hệ thống chống bot

Ngay cả một fingerprint trình duyệt được cấu hình hoàn hảo cũng không cứu được nếu một IP nhận hơn 50-100 yêu cầu mỗi phút đến một miền được bảo vệ. DataDome và Cloudflare phân tích tần suất yêu cầu từ một địa chỉ cụ thể và các mẫu thời gian giữa các hành động — các khoảng thời gian quá đồng đều cũng đáng ngờ.

Sơ đồ xoay vòng hoạt động cho cả ba framework được xây dựng giống nhau:

  1. Sử dụng gateway với xoay vòng IP tự động ở cấp nhà cung cấp — không cần viết logic của riêng bạn để thay đổi địa chỉ cho mỗi yêu cầu.
  2. Đối với các nhiệm vụ phiên (đăng nhập, điều hướng nhiều trang) hãy cố định IP cho phiên thông qua tham số sticky trong chuỗi kết nối.
  3. Đối với việc phân tích các trang tĩnh đơn giản, hãy xoay vòng IP cho mỗi yêu cầu hoặc mỗi 5-10 yêu cầu.
  4. Thêm độ trễ ngẫu nhiên giữa các yêu cầu (1-4 giây) — điều này giảm thiểu phát hiện theo các mẫu thời gian.

Ví dụ về phiên sticky trong chuỗi kết nối, nơi session-id giữ nguyên một IP xuất phát trong 10 phút:

proxy = "http://user-session-abc123:[email protected]:9000"

Đối với Botasaurus, sơ đồ này đặc biệt hữu ích, vì trong việc thu thập dữ liệu song song, mỗi quy trình có thể nhận được một session-id duy nhất, và bạn có được một lượng IP khác nhau ổn định mà không cần quản lý danh sách địa chỉ thủ công.

Loại proxy nào nên chọn cho từng framework

Loại proxy ảnh hưởng đến thành công của việc phân tích không kém gì việc chọn framework. Dưới đây là so sánh theo nhiệm vụ:

Nhiệm vụ Loại proxy được khuyến nghị Tại sao
Phân tích các trang web với Cloudflare/DataDome Proxy cư trú IP thực tế của người dùng gia đình hiếm khi bị đưa vào danh sách đen bởi các hệ thống chống bot
Phân tích hàng loạt mà không có bảo vệ nghiêm ngặt Proxy trung tâm dữ liệu Tốc độ cao hơn, chi phí thấp hơn cho khối lượng yêu cầu lớn
Mô phỏng người dùng thực trên các trang web di động Proxy di động Địa chỉ CGNAT của các nhà mạng có mức độ tin cậy cao nhất với các hệ thống chống bot

Đối với Scrapling trong chế độ StealthyFetcher, proxy cư trú mang lại hiệu quả cao nhất, vì Camoufox đã giải quyết vấn đề fingerprint của trình duyệt — chỉ cần không bị phát hiện qua IP. Đối với Botasaurus trong việc thu thập dữ liệu hàng loạt song song, proxy trung tâm dữ liệu thường là tối ưu về tỷ lệ tốc độ/giá cả, nếu trang web mục tiêu không sử dụng bảo vệ tiên tiến của DataDome.

Những lỗi điển hình khi kết nối proxy và tự động hóa trình duyệt

Trong thực tế, hầu hết các thất bại trong việc phân tích liên quan không phải đến bản thân framework, mà là do cấu hình proxy không đúng. Dưới đây là danh sách các lỗi thường gặp nhất:

  • IP giống nhau cho tất cả các luồng song song của Botasaurus. Hệ thống chống bot thấy 20 phiên đồng thời từ một địa chỉ và chặn nó chỉ trong vài phút.
  • Truyền proxy dưới dạng chuỗi trong chế độ trình duyệt Scrapling. Camoufox yêu cầu một từ điển với các trường riêng biệt — nếu không, xác thực sẽ không thành công.
  • Bỏ qua miền CDP Fetch trong nodriver. Nếu không có trình xử lý authRequired, proxy có xác thực sẽ không kết nối được, trình duyệt sẽ bị treo khi tải.
  • Thiếu xoay vòng trong các hành động phiên. Thay đổi IP giữa phiên đã xác thực ngay lập tức phát hiện tự động hóa — hãy sử dụng các phiên sticky.
  • Không khớp giữa vị trí địa lý của proxy và ngôn ngữ của trình duyệt. IP từ Đức với tiêu đề Accept-Language: ru — dấu hiệu cổ điển của bot cho các hệ thống chấm điểm gian lận.
  • Tần suất yêu cầu quá cao ngay cả khi có xoay vòng. Xoay vòng IP không loại bỏ sự cần thiết phải tạm dừng giữa các yêu cầu — mẫu hành vi cũng được phân tích.

Cần kiểm tra riêng các rò rỉ DNS khi làm việc qua proxy trong chế độ trình duyệt — đôi khi trình duyệt phân giải các miền thông qua DNS hệ thống, chứ không phải qua tunnel proxy, điều này tạo ra sự không đồng bộ giữa IP yêu cầu và IP phân giải, điều này dễ dàng bị các hệ thống bảo vệ phát hiện.

Kết luận

Scrapling, Botasaurus và nodriver giải quyết vấn đề phát hiện ở cấp độ fingerprint trình duyệt tốt hơn nhiều so với Selenium cổ điển, nhưng không một cái nào trong số đó giảm thiểu tầm quan trọng của proxy chất lượng. Cấu hình đúng xác thực (đặc biệt trong nodriver qua CDP), xoay vòng IP hợp lý và lựa chọn loại proxy phù hợp với từng hệ thống chống bot cụ thể — ba yếu tố quyết định sự ổn định của việc thu thập dữ liệu trong dài hạn.

Nếu bạn đang thu thập dữ liệu từ các trang web có bảo vệ tiên tiến như Cloudflare hoặc DataDome, hãy bắt đầu với proxy cư trú — chúng mang lại tỷ lệ yêu cầu thành công cao nhất nhờ vào uy tín của IP. Đối với các nhiệm vụ hàng loạt mà không có bảo vệ nghiêm ngặt, proxy trung tâm dữ liệu vẫn là lựa chọn tối ưu về tỷ lệ tốc độ và chi phí cho khối lượng lớn.