Trả lời nhanh
Sticky sessions và xoay IP hoạt động thế nào trên proxy dân cư?
Trên CrawlRelay, tên người dùng không có session ID sẽ nhận IP từ pool mỗi kết nối TCP mới, thường là IP khác nhau, còn -session-<id>-ttl-<minutes> giữ một IP cho ID ấy trong tối đa 30 phút, mặc dù IP có thể đổi sớm hơn. Xoay IP dựa trên kết nối, không phải HTTP request, nên giữ kết nối (keep-alive) quyết định IP thay đổi khi nào. Traffic residential giá 0,50 US$/GB từ 50 GB. Thanh toán bằng crypto, không cần KYC.
Quy tắc phiên làm việc tóm tắt
| Đơn vị xoay IP | Một IP từ pool cho mỗi kết nối TCP mới, thường là IP khác nhau |
|---|---|
| Sticky session | -session-<id>-ttl-<minutes> được thêm vào tên người dùng |
| Độ dài phiên | tối đa 30 phút |
| Session ID | 1–32 ký tự chữ hoặc số; một ID cho một luồng |
| Điều gì làm kết thúc phiên sớm | Thiết bị residential phía sau mất kết nối |
| ID chia sẻ | Khách hàng gửi cùng một ID sẽ dùng chung lối ra |
| Chi phí | Không có: phiên và xoay vòng đã bao gồm trong giá trên mỗi GB |
Điều gì xảy ra ở cổng khi tôi gửi một session ID?
Cổng sẽ đọc tên người dùng trên mỗi kết nối mới. Nếu không có phần session, nó chọn một lối ra proxy dân cư khớp với mục tiêu của bạn cho kết nối đó. Nếu có phần session, nó giữ cùng một lối ra cho ID đó trong thời gian TTL bạn đặt.
Một IP dính là kết nối thật của hộ gia đình, vì vậy nó có thể biến mất trước khi TTL kết thúc: thiết bị tắt, mất Wi-Fi hoặc đổi mạng. Các luồng dài cần đảm bảo điều này bằng cách kiểm tra IP ra tại các điểm kiểm tra và khởi động lại từ điểm đó thay vì để toàn bộ công việc thất bại.
Thư viện nào tái sử dụng kết nối như thế nào?
Nếu một thư viện giữ kết nối sống, mọi yêu cầu trên kết nối đó sẽ dùng chung một lối ra. Đây là cách kiểm soát từng hành vi theo mục đích.
| Thư viện | Mặc định | IP mới mỗi yêu cầu | Một IP cho một luồng |
|---|---|---|---|
| Python requests | Session giữ kết nối sống | Header Connection: close, hoặc một Session mới cho mỗi yêu cầu | Một Session với session ID trong tên người dùng |
| httpx | Client gom kết nối | httpx.Limits(max_keepalive_connections=0) | Một client cho mỗi session ID |
| aiohttp | TCPConnector gom kết nối | TCPConnector(force_close=True) | Session ID trong username URL proxy |
| Scrapy | Gom theo thông tin proxy và host | meta={"proxy_session": "new"} với middleware của chúng tôi ](/docs/scrapy/) | proxy_session cố định cho luồng |
| Playwright / Puppeteer | Chrome gom theo context | Context mới cho mỗi trang | Một context cho mỗi session ID |
| Node.js undici, axios, got | Agent giữ socket sống | Agent mới cho mỗi yêu cầu hoặc tắt keep-alive | Một agent cho mỗi session ID |
| curl | Một kết nối cho mỗi lệnh | Đã như vậy | Cùng session ID trong mỗi lệnh |
Chiến lược session nào phù hợp với công việc thu thập dữ liệu nào?
| Công việc | Chiến lược | TTL gợi ý |
|---|---|---|
| Trang sản phẩm, bài viết hoặc danh sách độc lập | Xoay vòng: không có ID phiên | — |
| Phân trang phụ thuộc vào cookie hoặc con trỏ để sang trang tiếp theo | Một phiên dính cho mỗi danh sách | 10–30 phút |
| Tìm kiếm, rồi kết quả, rồi trang chi tiết | Một phiên dính cho mỗi lần tìm kiếm | 10–20 phút |
| Trình duyệt không giao diện hiển thị nhiều trang trên một trang web | Một phiên dính cho mỗi ngữ cảnh trình duyệt | Thời gian của ngữ cảnh, tối đa 30 phút |
| Kiểm tra nội dung trang hiển thị ở nhiều thành phố | Một phiên ngắn cho mỗi lần kiểm tra thành phố | 5 phút |
| Kiểm tra lại cùng trang mỗi giờ | Xoay vòng | — |
Làm thế nào để quản lý nhóm phiên dính trong Python?
Một nhóm nhỏ phân bổ tải trên vài đầu ra ổn định và nghỉ mỗi đầu ra sau một số yêu cầu nhất định hoặc sau dấu hiệu đầu ra đó không ổn định, như 502 hoặc 503. Lưu ý điều nó không làm: nó không đổi IP để vượt qua lỗi 403 hoặc 429. Những lỗi đó có nghĩa trang web muốn bạn giảm tốc, nên nhóm phiên báo lỗi đó lên code của bạn.
import random
import uuid
import requests
GATEWAY = "gw.crawlrelay.com:7777"
BASE_USER, PASSWORD = "USERNAME-country-us", "PASSWORD"
class SlowDown(Exception):
"""The target asked us to slow down (403 or 429): back off, do not rotate."""
class StickySession:
def __init__(self, ttl=15, max_requests=50):
self.id = uuid.uuid4().hex[:10]
self.max_requests, self.used = max_requests, 0
user = "%s-session-%s-ttl-%d" % (BASE_USER, self.id, ttl)
proxy = "http://%s:%s@%s" % (user, PASSWORD, GATEWAY)
self.http = requests.Session()
self.http.proxies = {"http": proxy, "https": proxy}
class SessionPool:
EXIT_PROBLEMS = {502, 503, 504}
def __init__(self, size=5, **options):
self.options = options
self.sessions = [StickySession(**options) for _ in range(size)]
def _replace(self, i):
self.sessions[i].http.close()
self.sessions[i] = StickySession(**self.options)
def get(self, url, **kwargs):
i = random.randrange(len(self.sessions))
s = self.sessions[i]
s.used += 1
try:
r = s.http.get(url, timeout=(10, 30), **kwargs)
except requests.exceptions.RequestException:
self._replace(i) # dropped exit or timeout: start a fresh session
raise
if r.status_code in (403, 429):
raise SlowDown("%s returned %d" % (url, r.status_code))
if r.status_code in self.EXIT_PROBLEMS or s.used >= s.max_requests:
self._replace(i)
return r
pool = SessionPool(size=5, ttl=15, max_requests=50)
print(pool.get("https://api.ipify.org").text)Làm sao biết IP dính đã đổi?
Hỏi. Gửi yêu cầu dịch vụ echo IP như https://api.ipify.org qua cùng phiên ở đầu luồng và mỗi điểm kiểm tra, so sánh kết quả. Nếu đổi nghĩa là đầu ra thay đổi: khởi động lại luồng từ điểm kiểm tra cuối hoặc mở phiên mới. Ghi lại cùng ID phiên để phân biệt thay đổi IP và hành vi trang khi bạn debug.
Những lỗi phiên nào gây tốn kém nhất?
- Xoay phiên mỗi yêu cầu trong luồng nhiều bước. Trang web thấy giỏ hàng, con trỏ hoặc token tìm kiếm từ quốc gia này sang quốc gia khác và đặt lại.
- Một ID phiên cho mỗi worker. Một phiên dùng cho một luồng; mỗi worker và luồng phải có ID riêng.
- Phiên quá dài so với công việc. TTL 30 phút cho luồng 2 phút khiến IP bị chiếm dụng vô ích, làm khó đọc log.
- Xử lý lỗi 429 là lỗi IP. IP mới không thay đổi luật trang web; chỉ có giảm tốc mới được. Xem 429 Too Many Requests.
- Giả định xoay phiên mỗi yêu cầu. Keep-alive giữ đầu ra; kiểm tra bảng trên cho thư viện bạn dùng.
Phiên và xoay vòng: các câu hỏi
Phiên dính kéo dài bao lâu?
Phiên cố định giữ cùng IP trong thời gian bạn đặt (ttl, tính bằng phút), tối đa 30 phút. IP có thể thay đổi sớm hơn, ví dụ khi thiết bị dân cư mất kết nối. Chọn TTL dài hơn một chút so với luồng phục vụ, kiểm tra đầu ra ở các điểm kiểm tra.
Phiên dính tốn kém hơn xoay vòng không?
Không. CrawlRelay tính phí lưu lượng theo GB, phiên, xoay vòng và nhắm mục tiêu đã bao gồm trong giá. Phiên dính còn tiết kiệm lưu lượng vì một kết nối được giữ tránh được handshake TLS mới mỗi yêu cầu.
Xoay phiên mỗi yêu cầu có tốt hơn cho việc cào dữ liệu không?
Với các trang độc lập, xoay vòng phân tán tải và tránh dùng một IP quá lâu trên một trang. Với các trang có trạng thái như phân trang theo cookie, xoay vòng làm gián đoạn luồng. Hầu hết cào dữ liệu phối hợp cả hai: xoay giữa các mục, giữ dính trong luồng.
Tôi có thể chọn chính xác IP mình nhận không?
Không. Cổng proxy dân cư cấp đầu ra từ nhóm thay đổi liên tục, phù hợp nhắm mục tiêu username. Bạn chọn quốc gia, thành phố, bang Mỹ, mã ZIP hoặc ASN, và có thể giữ một IP với phiên; bạn không thể đặt trước địa chỉ cụ thể.
Xoay phiên và phiên dính có trong mọi gói
1,50 US$ cho 1 GB, 0,50 US$/GB từ 50 GB.