Quay lại danh sách
Luân chuyển IP tự động trước mỗi request để tránh chặn khi scraping dữ liệu động

Luân chuyển IP tự động trước mỗi request để tránh chặn khi scraping dữ liệu động

29 tháng 10, 2026

Giới thiệu

Khi thu thập dữ liệu từ các trang web động, trình crawl có thể nhanh chóng bị phát hiện do gửi request liên tục từ cùng một địa chỉ IP. Các hệ thống chống bot hiện đại theo dõi tần suất, khoảng thời gian giữa các request và thậm chí dấu vân tay trình duyệt để xác định hoạt động bất thường. Giải pháp đơn giản nhất để giảm nguy cơ bị chặn là thay đổi địa chỉ mạng sau mỗi request hoặc sau một khoảng thời gian ngắn.

RoProxy cung cấp một phương thức API đơn giản để luân chuyển IP của phiên làm việc, cho phép bạn tích hợp cơ chế làm mới IP trực tiếp vào quy trình scraping. Bằng cách kết hợp rotation với chế độ timed hoặc sticky, bạn có thể duy trì sự ổn định khi cần thiết đồng thời giảm nguy cơ bị chặn do sử dụng cùng một IP quá lâu.

Bài viết này hướng dẫn từng bước cách xây dựng quy trình scraping tự động trong Python, tự động gọi API rotate của RoProxy trước mỗi request (hoặc sau một khoảng thời gian đã định cấu hình) và xử lý các lỗi rotation một cách hiệu quả.

Tại sao nên luân chuyển IP trước mỗi request

  1. Tránh bị phát hiện theo tần suất – Các website ghi lại tần suất request; việc sử dụng một IP cho hàng chục hoặc hàng trăm request liên tiếp dễ bị hệ thống anti‑bot gắn cờ.
  2. Phân tán tải trọng – Luân chuyển IP giúp phân tán lưu lượng truy cập trên nhiều địa chỉ, giảm khả năng bị hạn chế theo IP.
  3. Giảm nguy cơ giới hạn theo tốc độ – Các hệ thống chống bot thường áp dụng giới hạn theo IP. Thay đổi IP giúp bạn duy trì tốc độ thu thập dữ liệu ổn định.
  4. Duy trì tính liên tục trong scraping – Trong nhiều trường hợp (ví dụ: theo dõi giá), việc mất một phần dữ liệu có thể làm sai lệch kết quả phân tích. Rotation thường xuyên giúp đảm bảo rằng mỗi request đều bắt đầu từ một IP sạch.

Các chế độ xoay IP của RoProxy – sticky, timed và per‑request – cho phép bạn điều chỉnh mức độ luân chuyển. Chế độ timed đặc biệt hữu ích khi bạn muốn giữ nguyên IP trong một khoảng thời gian ngắn (ví dụ: 30‑60 giây) trước khi thay đổi, tạo sự cân bằng giữa hiệu suất và tính ẩn danh.

Hiểu các chế độ xoay IP của RoProxy

  • Sticky – Giữ nguyên IP cho đến khi bị thay đổi thủ công hoặc IP bị lỗi. Phù hợp cho các session dài hạn nơi tính ổn định là ưu tiên hàng đầu.
  • Timed – Thay đổi IP sau một khoảng thời gian đã định cấu hình. Phù hợp cho quy trình scraping định kỳ, nơi bạn muốn luân chuyển IP thường xuyên nhưng không cần thay đổi sau mỗi request.
  • Per request – Tạo IP mới cho mỗi kết nối mới. Chỉ có sẵn trên gói Business, chế độ này tương đương với việc gọi API rotate trước mỗi request.

Bài viết này tập trung vào chế độ timed kết hợp với một cron job hoặc middleware trước mỗi request, giúp bạn có thể thực hiện trên bất kỳ gói dịch vụ nào đồng thời vẫn đạt được hiệu quả của việc luân chuyển IP.

Thiết lập môi trường scraping cơ bản

Trước tiên, bạn cần một session từ RoProxy. Các tài khoản mới nhận được các phiên miễn phí để dùng thử. Sau khi đăng nhập, bạn có thể liệt kê các session hiện có bằng cách gọi endpoint sau:

import requests
import os

# Lấy API key từ biến môi trường để bảo mật
API_KEY = os.getenv("ROPKEY")

# Lấy danh sách session
resp = requests.get(
    "https://backend-api.ro-proxy.com/api/session",
    headers={"Authorization": f"Bearer {API_KEY}"}
)
sessions = resp.json()  # Giả sử response trả về list các dict, mỗi dict có "id" và "rotation_mode"

Bạn có thể chọn session đầu tiên (session_id = sessions[0]["id"]). Session đó đã có rotation mode đã được thiết lập (ví dụ: "timed"). Nếu chưa, bạn có thể thay đổi mode đó sau.

Tạo middleware tự động rotate IP trong Python

1. Helper để rotate IP

def rotate_ip(session_id: str) -> bool:
    url = f"https://backend-api.ro-proxy.com/api/session/{session_id}/rotate"
    headers = {"Authorization": f"Bearer {API_KEY}"}
    resp = requests.post(url, headers=headers)
    # Endpoint trả về 200 OK khi rotation thành công
    return resp.status_code == 200

2. Middleware cho thư viện requests

from requests import Session
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

class RotatingProxyMiddleware:
    def __init__(self, session_id, rotate_before_request=True, rotate_interval=60):
        self.session_id = session_id
        self.rotate_before_request = rotate_before_request
        self.last_rotate = 0
        self.rotate_interval = rotate_interval
        self.session = Session()
        # Cấu hình retry cho trường hợp rotate thất bại
        retry_strategy = Retry(total=3, backoff_factor=1)
        adapter = HTTPAdapter(max_retries=retry_strategy)
        self.session.mount("http://", adapter)
        self.session.mount("https://", adapter)

    def _maybe_rotate(self):
        import time
        now = time.time()
        if self.rotate_before_request or (now - self.last_rotate) > self.rotate_interval:
            if rotate_ip(self.session_id):
                self.last_rotate = now
                return True
            else:
                print(f"Rotate thất bại cho session {self.session_id}")
        return False

    def request(self, method, url, **kwargs):
        self._maybe_rotate()
        # Áp dụng proxy sử dụng các placeholder bắt buộc
        proxy_url = f"http://{USERNAME}:{PASSWORD}@{GATEWAY_HOST}:{HTTP_PORT}"
        kwargs["proxies"] = {"http": proxy_url, "https": proxy_url}
        return self.session.request(method, url, **kwargs)

3. Sử dụng middleware

# Giả sử bạn đã có session_id từ bước trước
middleware = RotatingProxyMiddleware(
    session_id=session_id,
    rotate_before_request=True,   # rotate trước mỗi request
    rotate_interval=30            # fallback nếu bạn muốn rotate định kỳ
)

# Ví dụ scraping một trang sản phẩm
resp = middleware.request("GET", "https://example.com/product/123")
if resp.status_code == 200:
    print(resp.text[:200])

Lưu ý: USERNAME, PASSWORD, GATEWAY_HOST, HTTP_PORT phải được lấy từ thông tin đăng nhập session mà bạn nhận được từ RoProxy. Nếu bạn cần kết nối qua SOCKS5 (có sẵn trên gói Pro và Business), hãy thay thế scheme proxy bằng socks5:// và sử dụng SOCKS5_PORT.

Kiểm tra IP thực tế sau khi rotate

Để đảm bảo rotation có hiệu lực, bạn có thể kiểm tra IP thoát ra ngoài bằng cách sử dụng một dịch vụ công khai:

exit_check = requests.get("https://api.ipify.org?format=json")
print("IP hiện tại:", exit_check.json()["ip"])

Nếu bạn muốn so sánh trước/sau, hãy gọi endpoint kiểm tra ngay trước và ngay sau khi gọi rotate_ip.

Ví dụ thực tế: Theo dõi giá sản phẩm trên trang web thương mại điện tử

Giả sử bạn cần scrape giá của 10 sản phẩm mỗi phút từ một trang web thương mại điện tử. Quy trình có thể trông như sau:

import time

PRODUCT_URLS = [
    "https://example.com/product/1",
    "https://example.com/product/2",
    # … thêm URL
]

middleware = RotatingProxyMiddleware(session_id=session_id, rotate_before_request=True)

def scrape_all():
    for url in PRODUCT_URLS:
        resp = middleware.request("GET", url)
        if resp.status_code == 200:
            # phân tích JSON/DOM để lấy giá
            price = parse_price(resp.text)
            log_price(url, price)
        else:
            print(f"Lỗi khi truy cập {url}: {resp.status_code}")
        # Nghỉ 5 giây giữa các request để tuân thủ giới hạn tốc độ của trang web
        time.sleep(5)

while True:
    scrape_all()
    # Nghỉ 55 giây để đạt tốc độ khoảng 1 phút một lần
    time.sleep(55)

Bằng cách thiết lập rotate_before_request=True, middleware sẽ tự động gọi API rotate của RoProxy trước mỗi URL, đảm bảo mỗi request đến từ một IP khác nhau (hoặc ít nhất là IP mới sau khoảng thời gian đã định cấu hình). Việc chèn thời gian nghỉ 5 giây giúp giảm nguy cơ bị giới hạn tốc độ ngay cả khi sử dụng các IP khác nhau.

Giám sát và xử lý lỗi rotation

1. Ghi lại trạng thái rotation

rotation_log = []

def rotate_ip_with_log(session_id):
    success = rotate_ip(session_id)
    rotation_log.append({
        "timestamp": time.time(),
        "session_id": session_id,
        "success": success
    })
    if not success:
        # Gửi cảnh báo (ví dụ: gửi Telegram) hoặc thử lại sau
        send_alert(f"Rotate IP thất bại cho session {session_id}")
    return success

2. Fallback khi rotate thất bại

Nếu rotate thất bại, middleware có thể thử lại sau (ví dụ: 2 lần) trước khi sử dụng IP hiện tại:

def _maybe_rotate(self):
    import time
    now = time.time()
    if self.rotate_before_request or (now - self.last_rotate) > self.rotate_interval:
        for attempt in range(3):
            if rotate_ip(self.session_id):
                self.last_rotate = now
                return True
            time.sleep(2 ** attempt)  # exponential backoff
        # Nếu tất cả các lần thử đều thất bại, tiếp tục với IP hiện tại
        print(f"Tất cả các lần thử rotate đều thất bại, sử dụng IP hiện tại")
    return False

Các phương pháp hay nhất để tránh bị chặn và tuân thủ

  1. Tuân thủ giới hạn tốc độ – Ngay cả khi thay đổi IP, bạn cũng không nên request quá nhanh. Áp dụng thời gian nghỉ giữa các request trên mỗi host.
  2. Duy trì các header giống nhau – Sử dụng cùng một user‑agent, accept‑language và các header khác trên mỗi IP để tạo ra dấu vân tay nhất quán.
  3. Xử lý CAPTCHA – Nếu bạn thấy CAPTCHA, hãy cân nhắc giảm tần suất request hoặc sử dụng session với rotation mode sticky trong thời gian ngắn để duy trì IP ổn định trong quá trình giải CAPTCHA.
  4. Rotate theo quốc gia một cách khôn ngoan – Trên gói Pro hoặc Business, bạn có thể chọn quốc gia cho IP. Việc luân chuyển quốc gia quá nhanh có thể kích hoạt hệ thống chống gian lận dựa trên địa lý. Hãy cân bằng giữa việc luân chuyển IP và việc giữ nguyên quốc gia trong một khoảng thời gian.
  5. Ghi lại và phân tích – Ghi lại IP trước/sau, thời gian phản hồi và trạng thái HTTP. Phân tích dữ liệu này giúp bạn tinh chỉnh khoảng thời gian rotation.

Tổng kết

Bằng cách tích hợp API rotate của RoProxy vào middleware scraping, bạn có thể tự động thay đổi IP trước mỗi request hoặc sau một khoảng thời gian đã định cấu hình, giảm đáng kể nguy cơ bị chặn trong các tác vụ scraping dữ liệu động. Hướng dẫn từng bước trên cho thấy cách liệt kê session, gọi endpoint rotate và áp dụng proxy sử dụng các placeholder được yêu cầu. Việc sử dụng chế độ timed kết hợp với middleware giúp bạn có được sự linh hoạt của việc luân chuyển IP mà không cần gói dịch vụ Business, đồng thời vẫn duy trì tính liên tục cho các session dài bằng cách sử dụng chế độ sticky khi cần thiết.

RoProxy cung cấp một nền tảng đơn giản để quản lý các thay đổi IP, cho phép bạn tập trung vào việc trích xuất dữ liệu thay vì xử lý việc quản lý proxy thủ công.