Ứng dụng · Web scraping

Proxy cho web scraping

Website giới hạn số request trên mỗi IP: vượt ngưỡng là nhận 429, bị chặn 403 hoặc gặp captcha. Proxy chia tải ra nhiều IP, nhưng chỉ hiệu quả khi đúng cấu hình: giữ IP cho những trang cần phiên đăng nhập, xoay IP cho những lượt thu thập độc lập, và biết lúc nào nên chờ thay vì gửi tiếp. Trang này đưa ra cấu hình RoProxy khuyến nghị cho từng tình huống và một đoạn Python có retry, backoff và xoay IP khi bị chặn.

Vì sao scraper bị chặn

Hầu hết website đếm request theo IP. Một IP gửi quá nhanh sẽ bị trả 429 (Too Many Requests), bị chặn 403 hoặc bị đưa sang trang captcha.

Proxy giúp chia request ra nhiều IP, nhưng không thay được việc thu thập có chừng mực: chỉ lấy dữ liệu công khai, tôn trọng robots.txt, giữ tốc độ hợp lý và dừng lại khi website yêu cầu.

Cấu hình khuyến nghị

  • Trang cần đăng nhập hoặc giỏ hàng

    Dùng session giữ IP để cookie và IP khớp nhau suốt phiên.

  • Thu thập danh sách nhiều trang

    Dùng xoay IP theo chu kỳ, hoặc chia việc cho nhiều session chạy song song.

  • Nhiều request độc lập, khối lượng lớn

    Dùng xoay IP mỗi request (gói Business).

  • Cần kết quả theo quốc gia

    Chọn quốc gia cho session ở gói Pro hoặc Business.

Retry có backoff và xoay IP khi bị chặn

Khi nhận 403 hoặc 429, đoạn code xin IP mới cho session qua API rồi chờ tăng dần trước khi thử lại. Gói Free và Standard có thời gian chờ giữa hai lần xoay; gọi sớm hơn API sẽ trả 429, nên lỗi của lệnh xoay được bỏ qua.

import time
import requests

PROXY = "http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT"
PROXIES = {"http": PROXY, "https": PROXY}
API = "https://backend-api.ro-proxy.com"
HEADERS = {"Authorization": "Bearer API_KEY"}

def fetch(url: str, retries: int = 4) -> requests.Response:
    for attempt in range(retries):
        r = requests.get(url, proxies=PROXIES, timeout=30)
        if r.status_code not in (403, 429):
            return r
        # Bị chặn: xin IP mới cho session, rồi chờ tăng dần
        requests.post(f"{API}/api/session/SESSION_ID/rotate", headers=HEADERS, timeout=30)
        time.sleep(2 ** attempt)
    r.raise_for_status()
    return r

Lỗi thường gặp

  • 403 hoặc 429

    Website đang chặn IP hiện tại: giảm tốc độ, chờ rồi thử lại, xoay IP nếu cần.

  • 407

    Sai username/password hoặc session đã hết hạn. Sao chép lại thông tin kết nối từ dashboard.

  • Timeout

    Tăng timeout, thử lại có backoff; lỗi lặp lại liên tục thì xoay IP.

  • 503 khi gọi API

    Kho IP của quốc gia đã chọn tạm hết. Chờ khoảng 30 giây rồi thử lại, hoặc chọn khu vực thay vì quốc gia.

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

Scraping nên giữ IP hay xoay IP?

Giữ IP khi cần phiên đăng nhập hoặc giỏ hàng; xoay IP khi thu thập nhiều trang độc lập. Có thể dùng nhiều session, mỗi session một kiểu.

Xoay IP có giúp vượt captcha không?

Không hoàn toàn. IP mới giảm khả năng bị giới hạn theo IP, nhưng captcha còn dựa vào hành vi và dấu vết trình duyệt, nên tốc độ hợp lý vẫn quan trọng nhất.

Có giới hạn số lần xoay IP không?

Gói Free và Standard có thời gian chờ giữa hai lần xoay thủ công; gói Pro và Business thì không. Gọi sớm hơn thời gian chờ, API trả lỗi 429.

Scraping có hợp pháp không?

Tuỳ dữ liệu và điều khoản của từng website. Chỉ thu thập dữ liệu công khai, không thu thập dữ liệu cá nhân trái phép, và tôn trọng robots.txt cùng giới hạn tốc độ.

Trang liên quan

Dùng thử với session miễn phí

Tài khoản đã xác thực nhận session miễn phí với IP toàn cầu ngẫu nhiên, không cần thẻ.

Tạo tài khoản miễn phí