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 complementary 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:
- 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.
- 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.
- 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
- Đă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).
- 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 = 10cho 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!