Không cần KYC — không cần ID, không selfie, không giấy tờ. Thanh toán bằng crypto: BTC, USDT, USDC, ETH, SOL, LTC
Ngôn ngữ: Tiếng Việt
Bắt đầu ngay

Tài liệu · phiên · xoay · giữ kết nối

Sticky sessions và xoay IP: session ID, TTL và tái sử dụng kết nối

Xoay IP theo kết nối, sticky theo session ID. Khi hiểu cách thư viện của bạn tái sử dụng kết nối, bạn có thể quyết định chính xác khi nào IP thay đổi.

Cập nhật lần cuối: · 7 phút đọc

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 IPMộ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êntối đa 30 phút
Session ID1–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ớmThiế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ệnMặc địnhIP mới mỗi yêu cầuMột IP cho một luồng
Python requestsSession giữ kết nối sốngHeader Connection: close, hoặc một Session mới cho mỗi yêu cầuMột Session với session ID trong tên người dùng
httpxClient gom kết nốihttpx.Limits(max_keepalive_connections=0)Một client cho mỗi session ID
aiohttpTCPConnector gom kết nốiTCPConnector(force_close=True)Session ID trong username URL proxy
ScrapyGom theo thông tin proxy và hostmeta={"proxy_session": "new"} với middleware của chúng tôi ](/docs/scrapy/)proxy_session cố định cho luồng
Playwright / PuppeteerChrome gom theo contextContext mới cho mỗi trangMột context cho mỗi session ID
Node.js undici, axios, gotAgent giữ socket sốngAgent mới cho mỗi yêu cầu hoặc tắt keep-aliveMột agent cho mỗi session ID
curlMột kết nối cho mỗi lệnhĐã như vậyCù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ệcChiến lượcTTL gợi ý
Trang sản phẩm, bài viết hoặc danh sách độc lậpXoay 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 theoMột phiên dính cho mỗi danh sách10–30 phút
Tìm kiếm, rồi kết quả, rồi trang chi tiếtMột phiên dính cho mỗi lần tìm kiếm10–20 phút
Trình duyệt không giao diện hiển thị nhiều trang trên một trang webMột phiên dính cho mỗi ngữ cảnh trình duyệtThờ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.

Python: nhóm phiên dính
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.

Từ 0,50 US$/GB · không cần KYC

Bắt đầu ngay