Nếu trình phân tích Wildberries hoặc Ozon đột nhiên bắt đầu trả về các trang trống, thời gian chờ và lỗi 403 — vấn đề không phải lúc nào cũng nằm ở chính nền tảng. Thường thì một phần các địa chỉ IP trong pool proxy đã "hết hạn": chúng bị cấm, bị chậm lại hoặc bị đặt dưới CAPTCHA. Phân tích các chỉ số nào để phân biệt proxy hoạt động và proxy chết, và cách tự động hóa việc lọc bỏ mà không cần kiểm soát thủ công.
Tại sao pool proxy suy giảm theo thời gian
Bất kỳ pool proxy nào — ngay cả khi mua từ nhà cung cấp đáng tin cậy — theo thời gian sẽ mất đi một phần địa chỉ hoạt động. Nguyên nhân rất đa dạng: các hệ thống chống gian lận của Wildberries, Ozon và Avito tích lũy các dấu hiệu uy tín trên IP, một số địa chỉ bị đưa vào danh sách đen sau khi có nhiều yêu cầu từ các khách hàng khác của nhà cung cấp (nếu proxy là chia sẻ), các dải địa chỉ từ trung tâm dữ liệu bị cấm hàng loạt theo các mạng con, và các IP cư trú đôi khi đơn giản là rời khỏi pool vì người dùng thực đã tắt thiết bị.
Nếu không làm sạch pool, tỷ lệ "proxy chết" sẽ tăng theo cấp số nhân: ban đầu là 5%, sau một tuần phân tích tích cực — 20-30%. Trình phân tích bắt đầu tiêu tốn tài nguyên cho các nỗ lực lặp lại qua các IP không hoạt động, thời gian trung bình để thu thập một trang tăng lên, và trong các nhật ký tích lũy các lỗi che giấu các vấn đề thực sự (ví dụ: thay đổi bố cục của trang web). Nếu không có hệ thống lọc bỏ, bạn hoặc giữ pool phình to "để dự phòng", hoặc thường xuyên gặp phải sự cố trong việc thu thập dữ liệu.
Nhiệm vụ là không chỉ ghi nhận sự cố mà còn phân loại nó: quá tải tạm thời của máy chủ, cấm IP cụ thể, chặn theo vùng hoặc vấn đề ở phía trình phân tích (tiêu đề không chính xác, cookie đã lỗi thời). Tùy thuộc vào loại lỗi, cần phải loại bỏ proxy khỏi pool vĩnh viễn, đặt nó vào "cách ly" trong một thời gian hoặc chỉ cần lặp lại yêu cầu.
Các chỉ số lỗi chính để lọc bỏ
Để phân biệt sự cố tạm thời với proxy thực sự chết, cần phải thu thập một số chỉ số cho mỗi IP, thay vì chỉ dựa vào mã HTTP đơn lẻ. Đây là bộ chỉ số cơ bản mà bạn nên ghi lại cho mỗi yêu cầu:
| Chỉ số | Điều gì được báo hiệu | Hành động |
|---|---|---|
| HTTP 403 / 429 | Cấm hoặc giới hạn tần suất trên IP | Cách ly 30-60 phút, nếu lặp lại — xóa bỏ |
| Thời gian chờ kết nối | Proxy bị quá tải hoặc chết | 3 thời gian chờ liên tiếp — xóa khỏi pool |
| CAPTCHA trong phản hồi | IP bị nghi ngờ bởi hệ thống chống bot | Giảm tần suất yêu cầu hoặc thay thế IP |
| Thời gian phản hồi > 5 giây | Suy giảm tốc độ ở phía proxy | Giảm ưu tiên trong pool |
| Kích thước phản hồi dưới mức trung bình | Đã trả về trang chặn/đường dẫn | Kiểm tra thêm nội dung trước khi chấp nhận |
| Tỷ lệ yêu cầu thành công (success rate) | Đánh giá tổng thể chất lượng IP | Dưới 70% trong 50 yêu cầu — xóa bỏ |
Quan trọng là không nhầm lẫn mã lỗi của trang web với lỗi mạng. Ví dụ, 404 — không phải là vấn đề của proxy, mà là sản phẩm không có trên Wildberries. Nhưng nếu cùng một IP thường xuyên nhận 403 trong khi các IP khác nhận 200 — đó là dấu hiệu rõ ràng của việc cấm điểm địa chỉ này.
Thuật toán chấm điểm proxy
Thay vì phân loại nhị phân "hoạt động / không hoạt động", tiện hơn khi tính cho mỗi IP điểm từ 0 đến 100, mà giảm dần khi có lỗi và phục hồi khi có yêu cầu thành công. Điều này cho phép không loại bỏ proxy sau một sự cố ngẫu nhiên (máy chủ của thị trường có thể chỉ bị treo trong một giây), nhưng nhanh chóng loại bỏ những IP mà liên tục trả về dữ liệu không hợp lệ.
Logic rất đơn giản: yêu cầu thành công với mã 200 và nội dung hợp lệ thêm +2 vào điểm (nhưng không vượt quá 100). Thời gian chờ — trừ 15. Mã 403/429 — trừ 25. CAPTCHA trong phản hồi — trừ 20. Nếu điểm giảm xuống dưới ngưỡng (ví dụ, 30), proxy sẽ vào cách ly trong một thời gian cố định, và nếu sau khi trở lại từ cách ly điểm lại giảm xuống dưới 10 — IP sẽ bị xóa khỏi pool vĩnh viễn và được ghi lại để phân tích.
Cách tiếp cận này tương tự như hệ thống uy tín trong các trình duyệt chống phát hiện như Dolphin Anty hoặc AdsPower, nơi các tài khoản có "sức khỏe" tùy thuộc vào hoạt động. Cơ chế tương tự hoạt động rất tốt cho các địa chỉ IP trong việc phân tích.
Mã: ProxyPool với việc lọc bỏ tự động bằng Python
Dưới đây là khung làm việc của lớp để quản lý pool proxy với các chỉ số lỗi. Nó có thể được kết nối với bất kỳ trình phân tích nào trên requests, httpx hoặc Scrapy, thay thế logic lấy proxy bằng cách gọi pool.get_proxy().
import time
import random
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ProxyStats:
address: str
score: int = 100
quarantine_until: float = 0.0
total_requests: int = 0
total_success: int = 0
consecutive_timeouts: int = 0
is_dead: bool = False
@property
def success_rate(self) -> float:
if self.total_requests == 0:
return 1.0
return self.total_success / self.total_requests
class ProxyPool:
def __init__(self, proxies: list[str],
min_score: int = 30,
dead_score: int = 10,
quarantine_seconds: int = 1800):
self.stats = {p: ProxyStats(address=p) for p in proxies}
self.min_score = min_score
self.dead_score = dead_score
self.quarantine_seconds = quarantine_seconds
def _is_available(self, stats: ProxyStats) -> bool:
if stats.is_dead:
return False
if stats.quarantine_until > time.time():
return False
return True
def get_proxy(self) -> Optional[str]:
available = [s for s in self.stats.values() if self._is_available(s)]
if not available:
return None
# sắp xếp theo điểm, lấy ngẫu nhiên từ top-30%, để không làm phiền một IP
available.sort(key=lambda s: s.score, reverse=True)
top_pool = available[:max(1, len(available) // 3)]
return random.choice(top_pool).address
def report_success(self, proxy: str):
s = self.stats[proxy]
s.total_requests += 1
s.total_success += 1
s.consecutive_timeouts = 0
s.score = min(100, s.score + 2)
def report_timeout(self, proxy: str):
s = self.stats[proxy]
s.total_requests += 1
s.consecutive_timeouts += 1
s.score -= 15
if s.consecutive_timeouts >= 3:
self._quarantine(s)
self._check_dead(s)
def report_blocked(self, proxy: str, captcha: bool = False):
s = self.stats[proxy]
s.total_requests += 1
s.score -= 20 if captcha else 25
self._quarantine(s)
self._check_dead(s)
def _quarantine(self, s: ProxyStats):
if s.score < self.min_score:
s.quarantine_until = time.time() + self.quarantine_seconds
def _check_dead(self, s: ProxyStats):
if s.score <= self.dead_score:
s.is_dead = True
def stats_report(self) -> list[dict]:
return [
{
"proxy": s.address,
"score": s.score,
"success_rate": round(s.success_rate, 2),
"dead": s.is_dead,
}
for s in self.stats.values()
]
Trong trình phân tích thực tế, các cuộc gọi report_success, report_timeout và report_blocked được chèn trực tiếp vào trình xử lý phản hồi sau mỗi yêu cầu HTTP. Ví dụ về tích hợp với requests:
import requests
def fetch(url: str, pool: ProxyPool):
proxy = pool.get_proxy()
if not proxy:
raise RuntimeError("Không có proxy nào khả dụng trong pool")
proxies = {"http": proxy, "https": proxy}
try:
resp = requests.get(url, proxies=proxies, timeout=8)
except requests.exceptions.Timeout:
pool.report_timeout(proxy)
return None
if resp.status_code in (403, 429):
pool.report_blocked(proxy)
return None
if "captcha" in resp.text.lower():
pool.report_blocked(proxy, captcha=True)
return None
pool.report_success(proxy)
return resp
Cách tiếp cận này giảm tải cho việc giám sát thủ công: bạn chỉ cần thiết lập ngưỡng một lần, và sau đó pool tự "khôi phục", đẩy các địa chỉ chết ra và đưa trở lại từ cách ly những địa chỉ tạm thời bị treo.
Giá trị ngưỡng cho việc cấm IP
Không có con số chung nào — các ngưỡng phụ thuộc vào nền tảng và mức độ quyết liệt của hệ thống chống bot của nó. Nhưng có những tiêu chí mà hoạt động tốt trong thực tế khi phân tích Wildberries, Ozon và Avito:
- Tỷ lệ thành công dưới 70% trên mẫu từ 30-50 yêu cầu — là lý do để xóa IP, ngay cả khi điểm hiện tại chưa nghiêm trọng.
- 3 thời gian chờ liên tiếp — gần như luôn có nghĩa là proxy không khả dụng về mặt vật lý hoặc bị quá tải, không có lý do gì để giữ nó trong pool hoạt động.
- CAPTCHA thường xuyên hơn 1 lần trên 20 yêu cầu — IP đã bị nghi ngờ bởi hệ thống chống bot, tốt hơn là giảm tần suất yêu cầu hoặc thay thế địa chỉ.
- Thời gian phản hồi trung bình cao hơn 2 lần so với trung vị của pool — tín hiệu suy giảm, không nghiêm trọng, nhưng là lý do để giảm ưu tiên khi lựa chọn.
Cách ly trong 30-60 phút thường đủ cho các proxy từ trung tâm dữ liệu và cư trú, để hệ thống chống bot "quên" về hoạt động nghi ngờ tạm thời. Đối với các proxy di động, tình huống khác: ở đó IP thay đổi khi nhà mạng thay đổi tế bào, vì vậy cách ly có thể ngắn hơn — 10-15 phút, vì sau khi xoay vòng, đó thực sự là một địa chỉ khác.
Kiểm tra sức khỏe và xoay vòng trong nền
Ngoài việc lọc bỏ phản ứng (dựa trên các lỗi trong dòng chính của phân tích), hữu ích khi chạy kiểm tra sức khỏe nền — một quy trình riêng biệt, mà mỗi vài phút sẽ kiểm tra proxy bằng các yêu cầu nhẹ đến URL trung tính (ví dụ: httpbin.org/ip) và cập nhật thống kê của pool trước khi proxy được đưa vào yêu cầu chính đến Wildberries hoặc Ozon.
import threading
def healthcheck_loop(pool: ProxyPool, interval: int = 300):
while True:
for proxy in list(pool.stats.keys()):
try:
r = requests.get(
"https://httpbin.org/ip",
proxies={"http": proxy, "https": proxy},
timeout=5
)
if r.status_code == 200:
pool.report_success(proxy)
else:
pool.report_blocked(proxy)
except requests.exceptions.RequestException:
pool.report_timeout(proxy)
time.sleep(interval)
threading.Thread(target=healthcheck_loop, args=(pool,), daemon=True).start()
Quy trình nền như vậy đặc biệt quan trọng nếu pool lớn (hàng trăm IP) và phân tích không diễn ra liên tục mà theo từng gói — nếu không có kiểm tra sức khỏe, một phần proxy có thể "hết hạn" giữa các lần chạy, và những phút đầu tiên của phân tích sẽ bị lãng phí cho việc lọc bỏ trực tiếp, thay vì làm việc ngay với các địa chỉ đã được kiểm tra.
Loại proxy nào nên chọn để phân tích thị trường
Việc chọn loại proxy ảnh hưởng trực tiếp đến tần suất bạn phải chạy lọc bỏ và mức độ quyết liệt của các ngưỡng. Để phân tích ổn định Wildberries và Ozon, nơi hệ thống chống bot phân tích các mẫu hành vi và uy tín của mạng con, proxy cư trú thể hiện tốt nhất — chúng có IP thuộc về các nhà cung cấp internet thực, và hệ thống chống bot ít khi cấm chúng hàng loạt theo mạng con.
Đối với các nguồn đơn giản hơn và ít được bảo vệ hơn (ví dụ: thu thập dữ liệu công khai từ Avito hoặc theo dõi giá trên các cửa hàng đơn giản), thường chỉ cần proxy từ trung tâm dữ liệu — chúng nhanh hơn và rẻ hơn, điều này rất quan trọng khi có khối lượng yêu cầu lớn, nhưng cũng bị cấm thường xuyên hơn, vì vậy các ngưỡng lọc bỏ cho chúng nên được thiết lập nghiêm ngặt hơn.
| Loại proxy | Tốc độ lọc bỏ | Khi nào sử dụng |
|---|---|---|
| Trung tâm dữ liệu | Cao, các mạng con bị cấm hàng loạt | Cửa hàng đơn giản, khối lượng lớn, bảo vệ không cao |
| Cư trú | Trung bình, IP bị cấm điểm | Wildberries, Ozon, các trang web có hệ thống chống bot |
| Di động | Thấp, IP tự động thay đổi bởi nhà mạng | Các nguồn được bảo vệ nghiêm ngặt, phân tích tần suất cao |
Trong thực tế, nhiều đội sử dụng một pool hỗn hợp: phần lớn yêu cầu đi qua các IP cư trú, và khi có các lệnh cấm hàng loạt, các proxy di động được kết nối như "dự phòng khẩn cấp", vì việc thay đổi IP của chúng diễn ra tự nhiên thông qua xoay vòng mạng di động và không cần can thiệp thủ công.
Kết luận
Một pool proxy mà không có hệ thống lọc bỏ sẽ suy giảm không thể tránh khỏi, và càng lâu nó hoạt động mà không được làm sạch, càng nhiều tài nguyên mà trình phân tích lãng phí cho các IP chết. Mô hình chấm điểm với các mã HTTP, thời gian chờ, CAPTCHA và tỷ lệ thành công cho phép tự động phát hiện các địa chỉ có vấn đề và giữ cho pool hoạt động mà không cần kiểm soát thủ công. Mã trong bài viết này có thể được điều chỉnh cho bất kỳ ngăn xếp nào — requests, httpx, Scrapy hoặc trình phân tích bất đồng bộ riêng của bạn.
Nếu bạn chỉ đang xây dựng pool để phân tích thị trường và muốn giảm tần suất bị cấm ngay từ đầu, chúng tôi khuyên bạn nên xem xét proxy cư trú — chúng cung cấp tỷ lệ thành công cao hơn đáng kể trên các nền tảng được bảo vệ như Wildberries và Ozon so với các địa chỉ từ trung tâm dữ liệu thông thường.