Quay lại danh sách
Hướng Dẫn Kết Hợp Proxy Rotating Và Sticky Để Tối Ưu Scraping Đa Nguồn

Hướng Dẫn Kết Hợp Proxy Rotating Và Sticky Để Tối Ưu Scraping Đa Nguồn

23 tháng 7, 2026

Giới thiệu Khi thu thập dữ liệu web ở quy mô lớn, việc chỉ dựa vào một địa chỉ IP thường dẫn đến bị chặn, CAPTCHA hoặc giới hạn tốc độ. Proxy rotating và proxy sticky (session) là hai kỹ thuật comple­mentary giúp bạn duy trì ẩn danh mà vẫn giữ được tính nhất quán của phiên làm việc khi cần.

1. Proxy Rotating là gì? Khi nào dùng?

Proxy rotating là mô hình mà mỗi yêu cầu HTTP (hoặc mỗi chuỗi yêu cầu được định kỳ) được truyền qua một địa chỉ IP khác nhau từ một puits IP lớn. Mục tiêu chính là làm mờ dấu vân tay IP, ngăn chặn việc máy chủ đích phát hiện ra lượng truy vấn bất thường từ một nguồn duy nhất.

1.1 Lợi thế

  • Giảm nguy cơ bị chặn vì mỗi IP chỉ chịu một lượng requests nhỏ.
  • Tăng khả năng vượt qua giới hạn tốc độ (rate limit) dựa trên IP.
  • Dễ dàng mở rộng khi cần thu thập từ hàng nghìn trang web đồng thời.

1.2 Hạn chế

  • Khó duy trì trạng thái phiên (cookies, phiên đăng nhập) vì IP thay đổi liên tục.
  • Một số website có cơ chế phát hiện thay đổi IP quá nhanh và có thể kích hoạt kiểm tra bổ sung (ví dụ: JavaScript challenge).

2. Proxy Sticky (session) là gì? Khi nào dùng?

Proxy sticky, còn gọi là session proxy, cho phép bạn giữ cùng một địa chỉ IP trong một khoảng thời gian xác định (từ vài phút đến vài giờ) trước khi chuyển sang IP khác. Điều này rất hữu ích khi bạn cần duy trì trạng thái phiên như cookies, phiên đăng nhập hoặc các token xác thực.

2.1 Lợi thế

  • Giữ nguyên cookies và session, tránh phải đăng nhập lại liên tục.
  • Giảm khả năng kích hoạt các cơ chế bảo vệ dựa trên sự thay đổi đột ngột của IP.
  • Dễ dàng Debug vì bạn biết chính xác IP đang được sử dụng cho một khối công việc nhất định.

2.2 Hạn chế

  • Nếu giữ IP quá lâu, bạn có thể vượt quá giới hạn tốc độ của IP đó và bị chặn.
  • Cung cấp IP sticky thường có стоимость cao hơn so với pure rotating vì cần giữ nguyên IP cho mỗi client.

3. Kết hợp rotating và sticky trong một workflow scraping

Một chiến lược phổ biến là sử dụng sticky proxy cho các bước cần trạng thái (đăng nhập, lấy token) và sau đó chuyển sang rotating proxy để thực hiện các yêu cầu dữ liệu lớn. Quy trình có thể được mô tả như sau:

  1. Bước khởi tạo – Mở một kết nối sticky tới IP A, thực hiện login và lưu cookies.
  2. Bước lấy dữ liệu – Chuyển sang một vòng luân chuyển proxy (B, C, D, …) để gửi các request GET/POST tới các trang mục tiêu, mang theo cookies từ bước 1.
  3. Bước kết thúc – Sau khi hoàn thành, có thể trả IP sticky về_pool hoặc giữ cho phiên làm việc tiếp theo.

Với cách này, bạn vừa giữ được phiên đăng nhập ổn định mà vẫn giảm nguy cơ bị chặn do lượng requests lớn từ một IP duy nhất.

4. Thực hành: Cấu hình proxy rotating và sticky trong Python (requests) + RoProxy

Dưới đây là ví dụ minh họa cách sử dụng thư viện requests cùng với itertools.cycle để luân chuyển proxy và cách giữ IP sticky cho một block nhất định.

4.1 Chuẩn bị thông tin proxy từ RoProxy

  1. Đăng nhập vào dashboard RoProxy và tạo một Residential Rotating Proxy pool. Lưu lại endpoint, username và password (hoặc token API).
  2. Nếu cần IP sticky, chọn mục Sticky Session và chỉ định thời gian giữ IP (ví dụ: 10 phút). RoProxy sẽ cung cấp một danh sách endpoint mà mỗi endpoint tương ứng với một IP cố định trong thời gian đã đặt.

Lưu ý: RoProxy hỗ trợ cả xác thực bằng username/password và bằng token.Trong ví dụ dưới đây chúng ta sử dụng dạng http://username:password@host:port.

4.2 Code示例 – Rotating proxy

import requests
import itertools
import time

# Danh sách proxy rotating lấy từ RoProxy (format: http://user:pass@host:port)
PROXY_LIST = [
    'http://user1:[email protected]:8000',
    'http://user2:[email protected]:8000',
    'http://user3:[email protected]:8000',
    # Thêm nhiều proxy hơn tùy gói của bạn
]

proxy_cycle = itertools.cycle(PROXY_LIST)

def get_with_rotating(url, cookies=None, retries=3):
    for attempt in range(retries):
        proxy = next(proxy_cycle)
        proxies = {
            'http': proxy,
            'https': proxy,
        }
        try:
            resp = requests.get(url, proxies=proxies, cookies=cookies, timeout=10)
            if resp.status_code == 200:
                return resp
            elif resp.status_code in (429, 403):
                # Có thể bị chặn, thử proxy khác sau khi nghỉ ngắn
                time.sleep(2 ** attempt)  # backoff exponensial
            else:
                resp.raise_for_status()
        except requests.RequestException as e:
            print(f'Lỗi kết nối với proxy {proxy}: {e}')
            time.sleep(2 ** attempt)
    raise Exception('Không thể lấy dữ liệu sau nhiều lần thử')

4.3 Code示例 – Sticky proxy cho bước login

import requests

# Endpoint sticky từ RoProxy (ví dụ: IP sẽ giữ trong 10 phút)
STICKY_PROXY = 'http://user:[email protected]:8000'

def login_with_sticky(login_url, payload):
    session = requests.Session()
    session.proxies = {
        'http': STICKY_PROXY,
        'https': STICKY_PROXY,
    }
    # Thêm headers phổ biến nếu cần
    session.headers.update({'User-Agent': 'Mozilla/5.0 (compatible; ScraperBot/1.0)'})
    
    login_resp = session.post(login_url, data=payload, timeout=15)
    login_resp.raise_for_status()
    # Cookies được lưu tự động trong session
    return session

4.4 Kết hợp cả hai

import requests
import itertools
import time

# Cấu hình như trên
PROXY_LIST = [
    'http://user1:[email protected]:8000',
    'http://user2:[email protected]:8000',
    'http://user3:[email protected]:8000',
]
STICKY_PROXY = 'http://user:[email protected]:8000'
proxy_cycle = itertools.cycle(PROXY_LIST)

def scrape_with_mixed_strategy(start_url, login_payload):
    # Bước 1: Login bằng sticky proxy để lấy session
    session = requests.Session()
    session.proxies = {
        'http': STICKY_PROXY,
        'https': STICKY_PROXY,
    }
    session.headers.update({'User-Agent': 'Mozilla/5.0'})
    login_resp = session.post('https://example.com/login', data=login_payload, timeout=15)
    login_resp.raise_for_status()
    cookies = session.cookies.get_dict()

    # Bước 2: Luân chuyển proxy để lấy dữ liệu danh sách sản phẩm
    product_urls = [f'https://example.com/product/{i}' for i in range(1, 101)]
    results = []
    for idx, url in enumerate(product_urls):
        proxy = next(proxy_cycle)
        proxies = {
            'http': proxy,
            'https': proxy,
        }
        try:
            resp = requests.get(url, proxies=proxies, cookies=cookies, timeout=10)
            if resp.status_code == 200:
                results.append(resp.text[:200])  # lấy một phần nội dung làm ví dụ
            else:
                print(f'[{idx}] Status {resp.status_code} ở {url}')
        except requests.RequestException as e:
            print(f'[{idx}] Lỗi kết nối: {e}')
        # Nghỉ ngắn để tránh gây quá tải
        time.sleep(0.5)
    return results

# Chạy
data = scrape_with_mixed_strategy(
    start_url='https://example.com',
    login_payload={'username': 'test', 'password': 'test'}
)
print(f'Đã thu thập {len(data)} trang')

5. Xử lý lỗi và tối ưu hiệu suất

5.1 Retry và backoff

  • Sử dụng vòng lặp thử lại với thời gian chờ tăng dần (exponential backoff) để tránh làm quá tải mạng và giảm khả năng bị chặn do nhiều request liên tục từ cùng một IP.
  • Ghi log mỗi lần thay đổi proxy để dễ dàng_trace_ vấn đề.

5.2 Phân tích phản hồi

  • Kiểm tra mã trạng thái: 429 (Too Many Requests) hoặc 403 thường signals chặn IP; ngay lập tức chuyển sang proxy khác và tăng thời gian nghỉ.
  • Phát hiện CAPTCHA bằng cách tìm kiếm chuỗi характерistic trong HTML (ví dụ: "captcha", "recaptcha)) và nếu thấy, dừng luân chuyển và thử sử dụng proxyresidential với chất lượng cao hơn hoặc đợi một khoảng thời gian dài hơn.

5.3 Giới hạn đồng thời

  • Sử dụng semaphore hoặc pool công việc (ThreadPoolExecutor) để kiểm soát số lượng kết nối đồng thời, tránh vượt quá giới hạn bandwidth của gói proxy bạn mua.
  • Ví dụ: max_workers = 10 cho gói 10 GB/ tháng.

6. Khi nào chọn loại proxy (residential, datacenter, mobile) cho rotating/sticky

Loại proxy Ưu điểm Nhược điểm Phù hợp với rotating/sticky?
Residential IP thực thuộc nhà ở, khó bị chặn, tốt cho việc vượt qua các kiểm tra anti‑bot Chi phí cao hơn, tốc độ có thể biến động Cả rotating và sticky đều hiệu quả, đặc biệt là sticky khi cần giữ phiên đăng nhập lâu
Datacenter Tốc độ cao, giá rẻ, dễ mở rộng Dễ bị nhận diện là IP trung tâm, nhiều website chặn ngay Rotating có thể dùng cho các request ít nhạy cảm (public data), sticky không nên dùng vì dễ bị chặn sau vài phút
Mobile (3G/4G/5G) IP của nhà mạng di động, độ tin tưởng rất cao, rất khó bị block Gía cao nhất, lượng IP hạn chế Rotating rất tốt cho việc mô phỏng người dùng thực tế; sticky có thể dùng nếu cần giữ IP di động trong phiên làm việc ngắn (5‑10 phút)

Gợi ý thực tiễn

  • Scraping dữ liệu công khai (giá sản phẩm, tin tức): dùng rotating datacenter để tối ưu chi phí, kết hợp với sticky residential chỉ cho các bước login nếu cần.
  • Scraping social media hoặc các site có bảo vệ mạnh: ưu tiên residential rotating, và sử dụng sticky residential cho các bước xác thực 2FA hoặc lấy token.
  • Kiểm tra quảng cáo, SEO: thường dùng mobile rotating để mô phỏng trải nghiệm người dùng thực tế trên thiết bị di động.

7. Kết luận

Kết hợp proxy rotating và sticky cho phép bạn khai thác được lợi thế của cả hai świat: giữ được phiên làm việc ổn định khi cần và đồng thời giảm nguy cơ bị chặn khi thực hiện lượng lớn request. Việc hiểu rõ cách hoạt động của mỗi loại proxy, biết khi nào nên chuyển đổi giữa chúng và áp dụng đúng chiến lược sẽ giúp hệ thống scraping của bạn trở nên bền bỉ, linh hoạt và tiết kiệm chi phí.

Khi chọn nhà cung cấp proxy, hãy ưu tiên những dịch vụ cung cấp API linh hoạt, danh sách IP đa dạng và hỗ trợ cả rotating cũng như sticky session — RoProxy là một trong những lựa chọn đáp ứng được những yêu cầu này với chất lượng residential tốt, mức giá cạnh tranh và bộ dashboard trực quan để quản lý proxy, xem thống kê và cấu hình thời gian giữ IP.

Áp dụng các mẫu code và chiến lược trên vào dự án của bạn, tùy chỉnh tham số timeout, số lượng workers và thời gian nghỉ cho phù hợp với mục tiêu thu thập dữ liệu. Chúc bạn thành công trong việc xây dựng hệ thống scraping mạnh mẽ và không lo bị chặn!