Quay lại danh sách
Cách cấu hình xoay IP theo yêu cầu cho scraping đa nguồn

Cách cấu hình xoay IP theo yêu cầu cho scraping đa nguồn

5 tháng 11, 2026

Tại sao nên xoay IP trước mỗi request

Khi scraping nhiều nguồn dữ liệu, mỗi trang web đều có cơ chế phát hiện và chặn request lặp lại. Việc sử dụng một IP cố định nhanh chóng dẫn đến bị đánh dấu là bot, nhận CAPTCHA hoặc bị từ chối quyền truy cập. Xoay IP trước mỗi request giúp mỗi request đến từ một địa chỉ IP khác nhau, làm giảm khả năng bị phát hiện và tăng tỷ lệ thành công của quá trình thu thập dữ liệu.

Chế độ xoay IP theo yêu cầu (per‑request) là giải pháp tối ưu cho kịch bản này, vì nó đảm bảo rằng mỗi kết nối mới đều nhận một IP mới. RoProxy hỗ trợ chế độ này trên gói Business, cho phép bạn gọi API rotate bất kỳ lúc nào. Cách tiếp cận này đặc biệt hữu ích khi bạn cần truy cập đồng thời nhiều website có chính sách chống bot nghiêm ngặt.

Tổng quan về session và chế độ xoay của RoProxy

RoProxy cung cấp một phiên proxy xoay (session) bao gồm username, password và gateway host trên cổng HTTP. Session trên gói Pro và Business còn bao gồm cổng SOCKS5. Mỗi session có thể hoạt động ở một trong ba chế độ xoay:

  • Sticky – giữ nguyên IP cho đến khi session thất bại hoặc hết thời gian.
  • Timed – tự động thay đổi IP sau khoảng thời gian bạn đặt (ví dụ 300 giây).
  • Per‑request – mỗi request mới nhận một IP khác biệt, chỉ khả dụng trên gói Business.

Để sử dụng chế độ per‑request, bạn cần gọi endpoint rotate của RoProxy trước mỗi request. API chỉ yêu cầu header Authorization: Bearer API_KEY và SESSION_ID.

Bước 1: Lấy API key và tạo session

Đầu tiên, bạn cần một khóa API từ RoProxy. Sau khi đăng ký, khóa sẽ được cung cấp. Sử dụng endpoint GET để liệt kê các session hiện có:

curl -s -H "Authorization: Bearer $API_KEY" \
  https://backend-api.ro-proxy.com/api/session

Kết quả trả về một danh sách JSON bao gồm id, country, mode, v.v. Nếu bạn chưa có session, hãy tạo một session mới (theo mặc định nó sẽ ở chế độ sticky). Bạn có thể tạo session bằng cách gọi cùng endpoint GET; hệ thống sẽ tự động cấp một ID mới.

Bước 2: Chọn quốc gia cho session (Pro/Business)

Trên gói Pro hoặc Business, bạn có thể chỉ định quốc gia mà IP sẽ đến từ đó. Trong quá trình tạo session, bạn gửi request POST đến endpoint session với tham số country, ví dụ:

curl -X POST -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"country": "US"}' \
  https://backend-api.ro-proxy.com/api/session

Giá trị country có thể là bất kỳ quốc gia nào trong danh sách được hỗ trợ. Việc chọn quốc gia phù hợp giúp bạn tránh các hạn chế khu vực và giảm thời gian trễ mạng.

Bước 3: Cấu hình proxy trong mã Python

Chúng ta sẽ viết một script Python nhỏ sử dụng thư viện requests. Script này tải các biến môi trường cho các placeholder, thiết lập proxy HTTP và SOCKS5, sau đó định nghĩa một hàm rotate IP trước mỗi request.

import os
import time
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# Tải các placeholder từ biến môi trường
GATEWAY_HOST = os.getenv("GATEWAY_HOST")
HTTP_PORT = os.getenv("HTTP_PORT")
SOCKS5_PORT = os.getenv("SOCKS5_PORT")
USERNAME = os.getenv("USERNAME")
PASSWORD = os.getenv("PASSWORD")
API_KEY = os.getenv("API_KEY")
SESSION_ID = os.getenv("SESSION_ID")

# Xây dựng URL proxy
http_proxy = f"http://{USERNAME}:{PASSWORD}@{GATEWAY_HOST}:{HTTP_PORT}" if all([GATEWAY_HOST, HTTP_PORT, USERNAME, PASSWORD]) else None
socks5_proxy = f"socks5://{USERNAME}:{PASSWORD}@{GATEWAY_HOST}:{SOCKS5_PORT}" if all([GATEWAY_HOST, SOCKS5_PORT, USERNAME, PASSWORD]) else None

proxies = {}
if http_proxy:
    proxies["http"] = http_proxy
    proxies["https"] = http_proxy
if socks5_proxy:
    proxies["socks5"] = socks5_proxy

# Tạo session requests với retry
 session = requests.Session()
retry_strategy = Retry(
    total=3,
    status_forcelist=[429, 500, 502, 503, 504],
    method_whitelist=["GET", "POST"],
    backoff_factor=1
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)

def rotate_ip():
    """Gọi API rotate của RoProxy để lấy IP mới."""
    url = f"https://backend-api.ro-proxy.com/api/session/{SESSION_ID}/rotate"
    headers = {"Authorization": f"Bearer {API_KEY}"}
    resp = session.post(url, headers=headers)
    # API trả về 200 OK ngay cả khi không có IP mới; chúng ta chỉ cần đảm bảo request thành công
    resp.raise_for_status()
    # Tùy chọn: parse JSON để ghi nhận IP mới (ví dụ: resp.json().get('ip'))
    return resp.json()

def fetch_url(target_url, max_retries=3):
    for attempt in range(max_retries):
        try:
            # Xoay IP trước mỗi request
            rotate_ip()
            # Thêm delay nhỏ để tránh rate limit
            time.sleep(0.5)
            response = session.get(target_url, proxies=proxies, timeout=10)
            response.raise_for_status()
            return response.text
        except requests.exceptions.HTTPError as e:
            if e.response.status_code == 429:
                # Chờ và thử lại sau
                time.sleep(2 ** attempt)
                continue
            raise
        except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
            # Thử lại với backoff
            time.sleep(2 ** attempt)
            continue
    raise Exception(f"Không thể lấy {target_url} sau {max_retries} lần thử")

# Ví dụ sử dụng
urls = [
    "https://example.com/product/1",
    "https://example.org/item/42",
    "https://sample.net/data.json",
]

for url in urls:
    html = fetch_url(url)
    print(f"Đã lấy {url}, độ dài {len(html)} ký tự")

Giải thích các bước

  1. Biến môi trường – Script tải GATEWAY_HOST, HTTP_PORT, SOCKS5_PORT, USERNAME, PASSWORD, API_KEY, SESSION_ID từ hệ thống. Việc sử dụng biến môi trường giúp bạn có thể tái sử dụng script mà không cần hard‑code thông tin xác thực.
  2. Xây dựng proxy – Chúng ta tạo URL proxy HTTP và SOCKS5 bằng các placeholder. Script này linh hoạt: nếu bạn chỉ cần HTTP, SOCKS5_PORT hoặc các biến khác bị thiếu, proxy tương ứng sẽ bị bỏ qua.
  3. Session requests – Sử dụng requests.Session với chiến lược retry giúp tăng độ ổn định khi nhà cung cấp xoay IP liên tục. Retry đặc biệt hữu ích khi bắt gặp 429 (rate limit) hoặc 5xx.
  4. Hàm rotate_ip – Gửi request POST đến endpoint rotate của RoProxy. API chỉ yêu cầu header Authorization; các tham số khác không cần thiết. Response được kiểm tra; bạn có thể mở rộng để lưu IP mới nếu cần.
  5. Hàm fetch_url – Trước mỗi request, rotate_ip được gọi, sau đó delay ngắn 0.5 giây để giảm khả năng bị phát hiện. Logic retry xử lý 429 và lỗi mạng, đảm bảo scraping mạnh mẽ.

Bước 4: Tối ưu hóa cho các website có chính sách chống bot nghiêm ngặt

4.1 Sử dụng SOCKS5 khi cần thiết

Nếu website bạn scrape chặn proxy HTTP nhưng chấp nhận SOCKS5, hãy thiết lập SOCKS5_PORT và sử dụng proxy socks5 trong script. SOCKS5 hoạt động ở lớp thấp hơn, do đó dấu chân mạng nhỏ hơn.

4.2 Quản lý rate limit

Mỗi IP có ngưỡng request nhất định. Rotation liên tục giúp bạn phân phối tải đều. Tuy nhiên, bạn cũng nên chèn delay ngẫu nhiên (ví dụ random.uniform(0.5, 1.5)) và sử dụng exponential backoff khi nhận 429.

4.3 Xử lý CAPTCHA và fingerprint

Rotation IP giúp giảm CAPTCHA, nhưng bạn vẫn nên tích hợp thư viện detection CAPTCHA (ví dụ 2captcha, anti-captcha) nếu script bắt gặp mã này. Ngoài ra, duy trì fingerprint trình duyệt ổn định (User‑Agent, Accept‑Language) giúp giảm khả năng bị yêu cầu giải CAPTCHA.

4.4 Xác thực session và rotate trước mỗi request

Để đảm bảo mỗi request sử dụng IP mới, hãy gọi rotate_ip ngay trước khi request, như đã trình bày. Đối với các website kiểm tra sự liên tục của session, bạn có thể kết hợp rotate với chế độ sticky và chỉ rotate khi cần thiết (ví dụ sau mỗi N request). Đối với mục đích scraping đa nguồn, rotate trước mỗi request là chiến lược đơn giản và hiệu quả.

Bước 5: Triển khai trong CI/CD (tùy chọn)

Nếu bạn muốn tự động hóa việc tạo session và rotation trong pipeline CI, bạn có thể sử dụng script Python trên như một bước. Ví dụ với GitHub Actions:

- name: Cấu hình proxy và xoay IP
  env:
    GATEWAY_HOST: ${{ secrets.GATEWAY_HOST }}
    HTTP_PORT: ${{ secrets.HTTP_PORT }}
    SOCKS5_PORT: ${{ secrets.SOCKS5_PORT }}
    USERNAME: ${{ secrets.USERNAME }}
    PASSWORD: ${{ secrets.PASSWORD }}
    API_KEY: ${{ secrets.API_KEY }}
    SESSION_ID: ${{ secrets.SESSION_ID }}
  run: |
    python3 scrape.py

Pipeline có thể thiết lập các secrets này trong repository, giúp script có thể thực hiện trên nhiều môi trường mà không cần hard‑code credentials.

Kết luận

Xoay IP theo yêu cầu mang lại khả năng linh hoạt cao khi scraping đa nguồn, giúp mỗi request đến từ một địa chỉ IP duy nhất, giảm khả năng bị phát hiện và chặn. Với RoProxy, bạn có thể dễ dàng cấu hình một session ở chế độ per‑request, gọi API rotate trước mỗi request và duy trì quá trình thu thập dữ liệu ổn định. Bằng cách kết hợp rotation, retry và delay phù hợp, bạn sẽ đạt được tỷ lệ thành công cao và tránh các cơ chế chống bot phổ biến. Hãy thử nghiệm chiến lược này với các website mục tiêu của bạn và điều chỉnh tham số theo nhu cầu thực tế.


Lưu ý: Script và hướng dẫn trên chỉ sử dụng các tính năng được xác nhận của RoProxy. Mọi thông tin về pool IP, tốc độ hoặc tính năng nâng cao khác không được đề cập đều không được xác nhận.