Scarnox · Blog

Proxy xoay vòng cho scraping: thiết lập và các bẫy thường gặp

Proxy xoay vòng thay đổi địa chỉ IP mà lưu lượng của bạn đi ra, hoặc ở mỗi request hoặc sau một khoảng thời gian đặt sẵn. Đây là một trong những công cụ phổ biến nhất trong web scraping, và cũng là một trong những công cụ bị dùng sai nhiều nhất. Xoay quá ít thì một địa chỉ đơn lẻ bị giới hạn tốc độ. Xoay quá nhiều thì lưu lượng trông chẳng giống khách truy cập nào. Hướng dẫn này giải thích hai mô hình xoay, trình bày một thiết lập Python hoạt động với retry cho proxy chết, và bao quát cách một trường proxy kết hợp với giải captcha.

Xoay vòng so với phiên cố định

Có hai cách một dịch vụ proxy xoay vòng cấp địa chỉ:

Một khách truy cập thật giữ một địa chỉ trong suốt một lần truy cập. Phiên cố định bắt chước hành vi đó, nên thường là mặc định tốt hơn khi trang dùng cookie hoặc phiên. Dùng xoay theo request cho việc crawl không trạng thái.

Một pool xoay vòng cơ bản bằng Python

Ví dụ dưới đây giữ một pool các URL proxy, xoay qua chúng, và chuyển sang cái khác khi một cái thất bại. Giữ thông tin xác thực trong biến môi trường, không bao giờ trong mã nguồn.

import itertools
import os
import requests

# URL proxy lấy từ môi trường, ví dụ:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)

def fetch(url: str, max_tries: int = 3) -> requests.Response:
    last_error = None
    for _ in range(max_tries):
        proxy = next(rotation)
        try:
            r = requests.get(
                url,
                proxies={"http": proxy, "https": proxy},
                timeout=30,
            )
            if r.status_code == 407:  # xác thực proxy thất bại
                raise requests.RequestException("proxy auth rejected")
            return r
        except requests.RequestException as exc:
            last_error = exc  # proxy chết hoặc chậm: thử proxy tiếp theo
    raise RuntimeError(f"all attempts failed for {url}: {last_error}")

Có hai chi tiết quan trọng ở đây. Thứ nhất, một proxy chết nên được retry trên một địa chỉ khác, không phải cùng địa chỉ đó. Thứ hai, một request thất bại vì lỗi xác thực nên dừng lại và được báo cáo, thay vì đốt hết pool.

Theo dõi sức khỏe proxy

Round robin đơn thuần sẽ tiếp tục gửi lưu lượng tới một proxy đã bắt đầu thất bại. Hãy theo dõi một điểm đơn giản cho mỗi địa chỉ: đếm số lần thất bại gần đây, và loại địa chỉ đó khỏi pool trong một thời gian nghỉ khi nó vượt ngưỡng. Sau đó đưa nó trở lại và theo dõi lại. Scraper của bạn khi đó sẽ dành request cho phần khỏe mạnh của pool.

Ghi log proxy đã dùng cho mỗi kết quả. Khi một trang bắt đầu trả về chặn, bạn sẽ muốn biết liệu một địa chỉ, một vùng hay cả pool là nguyên nhân.

Điều tiết pool

Xoay vòng phân tán tải qua nhiều địa chỉ, nhưng mỗi địa chỉ vẫn có giới hạn tốc độ. Đặt độ trễ riêng cho mỗi địa chỉ, và một giới hạn toàn cục về số request mỗi giây trên toàn pool. Xoay vòng không phải là giấy phép để gửi nhiều lưu lượng hơn. Nó là cách giữ lưu lượng từ một địa chỉ trong mức hợp lý.

Các sai lầm thường gặp

Hầu hết vấn đề xoay vòng đến từ vài thói quen. Đổi địa chỉ giữa chừng một luồng đăng nhập hoặc thanh toán sẽ làm đứt phiên và khiến trang nghi ngờ. Phản hồi 429 là giới hạn tốc độ của trang, không phải proxy hỏng, nên chuyển sang địa chỉ mới và retry ngay chỉ làm vấn đề lan rộng hơn. Đổi địa chỉ ở mỗi request nhưng giữ nguyên cookie cũng không nhất quán, vì cookie được cấp cho một khách truy cập khác. Cuối cùng, một pool không bao giờ được kiểm tra sẽ âm thầm đầy các địa chỉ chết, và tỷ lệ lỗi của bạn tăng lên mà không có nguyên nhân rõ ràng. Hãy kiểm tra pool theo lịch và loại bỏ những cái thất bại.

Proxy và giải captcha

Một số tác vụ captcha có thể dùng proxy mà scraper của bạn đang dùng. Bạn truyền nó trong trường tùy chọn proxy, theo dạng http://user:pass@host:port, và lần giải diễn ra qua cùng đường mạng mà request trang của bạn dùng. Tác vụ proxyless bỏ qua trường đó hoàn toàn. Chọn loại nào phụ thuộc vào việc trang có gắn captcha với địa chỉ mạng hay không, và sự đánh đổi đó được giải thích trong proxy hay proxyless khi giải captcha.

Hai điểm thực tế:

Loại captcha đang hoạt động tại Scarnox hiện nay là PopularCaptcha. Hướng dẫn Python cho PopularCaptcha chỉ cách gửi request và cách nộp token trả về.

Chọn proxy của bạn

Loại địa chỉ bạn xoay quan trọng không kém chính việc xoay. Địa chỉ datacenter nhanh và rẻ trên mỗi request, nhưng thường bị chấm điểm thấp. Địa chỉ dân cư được chấm điểm tốt hơn nhưng chậm hơn. Hướng dẫn proxy dân cư và proxy datacenter so sánh chúng chi tiết hơn, và lời khuyên ở đó áp dụng cho pool bạn xây dựng ở đây.

Scrape có trách nhiệm

Bước tiếp theo

Bắt đầu với tín dụng dùng thử miễn phí, không cần thẻ: tạo tài khoản và thử luồng PopularCaptcha với proxy của riêng bạn. Xem giá hiện tại tại trang giá.