[{"data":1,"prerenderedAt":20},["ShallowReactive",2],{"blog:post:vi:cach-su-dung-che-do-xoay-ip-theo-thoi-gian-cho-scraping-dinh-ky":3},{"slug":4,"lang":5,"title":6,"summary":7,"date":8,"tags":9,"tag_slugs":15,"thumbnail_url":16,"translations":17,"body":18,"asset_base":19},"cach-su-dung-che-do-xoay-ip-theo-thoi-gian-cho-scraping-dinh-ky","vi","Cách sử dụng chế độ xoay ip theo thời gian cho scraping định kỳ","Hướng dẫn cấu hình session proxy với chế độ timed rotation để tự động đổi IP sau mỗi khoảng thời gian, giúp scraping định kỳ ổn định và tránh bị chặn.","2026-10-28",[10,11,12,13,14],"proxy","timed-rotation","scraping","python","automation",[10,11,12,13,14],"https://blog-api.ro-proxy.com/api/blog/posts/cach-su-dung-che-do-xoay-ip-theo-thoi-gian-cho-scraping-dinh-ky/thumbnail.svg?lang=vi",[5],"## Tại sao cần chế độ xoay ip theo thời gian\n\nKhi thu thập dữ liệu theo lịch trình cố định — ví dụ mỗi giờ lấy giá sản phẩm, mỗi ngày kiểm tra thứ hạng từ khóa — việc giữ nguyên một IP trong quá trình kéo dài dễ khiến hệ thống đích phát hiện quy luật và chặn. Ngược lại, xoay IP cho mỗi request (per‑request) lại làm gián đoạn phiên làm việc, mất cookie, token xác thực và làm tăng độ phức tạp khi xử lý trạng thái. Chế độ timed rotation giải quyết bài toán này bằng cách giữ IP ổn định trong một khoảng thời gian do bạn quy định (5 phút, 15 phút, 1 giờ…), sau đó tự động đổi sang IP mới. Cách này cân bằng giữa tính liên tục của session và sự đa dạng của địa chỉ IP, giảm thiểu rủi ro bị gắn cờ bất thường mà không cần quản lý phức tạp như rotating proxy từng request.\n\n## Hiểu rõ ba chế độ xoay\n\n- **Sticky**: IP cố định cho đến khi bạn chủ động xoay hoặc IP bị lỗi. Phù hợp cho đăng nhập, duy trì giỏ hàng, session dài.\n- **Timed**: IP thay đổi tự động sau một khoảng thời gian bạn cấu hình (ví dụ 10 phút). Phù hợp cho scraping định kỳ, thu thập dữ liệu theo batch.\n- **Per request**: IP mới cho mỗi kết nối mới. Chỉ có trên gói Business, dùng khi cần độ ẩn danh tối đa cho mỗi request đơn lẻ.\n\nLựa chọn chế độ phụ thuộc vào đặc thù công việc. Với scraping định kỳ, timed rotation thường mang lại hiệu quả cao nhất vì nó giữ nguyên ngữ cảnh trong một batch mà vẫn thay đổi IP giữa các batch.\n\n## Cấu hình session timed rotation\n\nKhi tạo session mới, bạn chọn chế độ timed và nhập khoảng thời gian mong muốn (đơn vị thường là phút). Trên các gói Pro và Business, bạn còn có thể chọn quốc gia của IP. Sau khi session được tạo, hệ thống sẽ tự động cấp một cặp `USERNAME`/`PASSWORD` và một `GATEWAY_HOST` cùng `HTTP_PORT` (và `SOCKS5_PORT` nếu gói hỗ trợ). Bạn không cần can thiệp thêm để xoay IP — dịch vụ sẽ lo việc đó theo đúng chu kỳ đã đặt.\n\n## Sử dụng proxy trong python requests\n\nDưới đây là mẫu code khởi tạo `requests.Session` và gán proxy cho cả HTTP và HTTPS. Thay thế các placeholder bằng giá trị thực tế của session bạn đã tạo.\n\n```python\nimport requests\n\nsession = requests.Session()\nsession.proxies = {\n    \"http\": \"http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT\",\n    \"https\": \"http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT\"\n}\n\n# Kiểm tra IP hiện tại\nresp = session.get(\"https://api.ipify.org?format=json\", timeout=10)\nprint(\"IP hiện tại:\", resp.json().get(\"ip\"))\n```\n\nViệc dùng `requests.Session` đảm bảo các request trong cùng một batch chia sẻ kết nối TCP, cookie và header, giúp hiệu năng tốt hơn so với tạo mới `requests.get` mỗi lần.\n\n## Theo dõi sự thay đổi ip tự động\n\nĐể xác nhận timed rotation hoạt động đúng, bạn có thể viết một script chạy liên tục, kiểm tra IP mỗi phút và ghi log khi IP thay đổi. Ví dụ sau minh họa cách làm:\n\n```python\nimport time\nimport requests\n\nsession = requests.Session()\nsession.proxies = {\n    \"http\": \"http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT\",\n    \"https\": \"http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT\"\n}\n\ndef get_ip(sess):\n    try:\n        r = sess.get(\"https://api.ipify.org?format=json\", timeout=10)\n        return r.json().get(\"ip\")\n    except Exception as e:\n        print(f\"Lỗi kiểm tra IP: {e}\")\n        return None\n\nlast_ip = None\nwhile True:\n    current_ip = get_ip(session)\n    if current_ip and current_ip != last_ip:\n        print(f\"[{time.strftime('%H:%M:%S')}] IP đã đổi: {last_ip} -> {current_ip}\")\n        last_ip = current_ip\n    time.sleep(60)  # kiểm tra mỗi 60 giây\n```\n\nChạy script này trong một terminal riêng biệt trong suốt quá trình scraping. Bạn sẽ thấy IP thay đổi đúng theo chu kỳ đã cấu hình (ví dụ mỗi 10 phút). Nếu IP không đổi sau thời gian kỳ vọng, hãy kiểm tra lại cài đặt session hoặc liên hệ hỗ trợ.\n\n## Tự động xoay ip qua api khi cần\n\nTrong một số tình huống — gặp lỗi 429, 403, hoặc muốn đổi IP ngay lập tức mà không đợi chu kỳ — bạn có thể gọi API xoay IP thủ công. Endpoint duy nhất cho việc này là `POST https://backend-api.ro-proxy.com/api/session/SESSION_ID/rotate` với header `Authorization: Bearer API_KEY`. Dưới đây là hàm tiện ích:\n\n```python\nimport requests\n\ndef rotate_session_ip(session_id: str, api_key: str) -> bool:\n    url = f\"https://backend-api.ro-proxy.com/api/session/{session_id}/rotate\"\n    headers = {\"Authorization\": f\"Bearer {api_key}\"}\n    try:\n        resp = requests.post(url, headers=headers, timeout=10)\n        if resp.status_code == 200:\n            print(\"Xoay IP thành công\")\n            return True\n        else:\n            print(f\"Lỗi xoay IP: {resp.status_code} - {resp.text}\")\n            return False\n    except Exception as e:\n        print(f\"Ngoại lệ khi gọi API xoay: {e}\")\n        return False\n\n# Ví dụ sử dụng\nSESSION_ID = \"SESSION_ID\"\nAPI_KEY = \"API_KEY\"\nrotate_session_ip(SESSION_ID, API_KEY)\n```\n\nSau khi xoay thành công, các request tiếp theo qua `session` sẽ mang IP mới. Bạn có thể kết hợp hàm này vào logic retry: khi nhận mã lỗi 429/403, gọi `rotate_session_ip` rồi thử lại request.\n\n## Xử lý lỗi và cơ chế retry\n\nMạng và proxy không lúc nào cũng ổn định. Một chiến lược retry hợp lý giúp scraper bền bỉ hơn. Thư viện `urllib3.util.retry.Retry` kết hợp với `requests.adapters.HTTPAdapter` cho phép cấu hình retry tự động cho các mã lỗi nhất định.\n\n```python\nimport requests\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\ndef build_resilient_session() -> requests.Session:\n    sess = requests.Session()\n    retry = Retry(\n        total=3,\n        backoff_factor=1.5,\n        status_forcelist=[429, 500, 502, 503, 504],\n        allowed_methods=[\"HEAD\", \"GET\", \"OPTIONS\"]\n    )\n    adapter = HTTPAdapter(max_retries=retry)\n    sess.mount(\"http://\", adapter)\n    sess.mount(\"https://\", adapter)\n    sess.proxies = {\n        \"http\": \"http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT\",\n        \"https\": \"http://USERNAME:PASSWORD@GATEWAY_HOST:HTTP_PORT\"\n    }\n    return sess\n\nsession = build_resilient_session()\nresp = session.get(\"https://httpbin.org/ip\", timeout=15)\nprint(resp.json())\n```\n\nCấu hình `backoff_factor=1.5` nghĩa là thời gian chờ giữa các lần retry sẽ tăng dần (1.5s, 3s, 4.5s…), giảm áp lực lên server đích và proxy.\n\n## Những lưu ý khi chọn khoảng thời gian xoay\n\n- **Tần suất request của mục tiêu**: Nếu trang cho phép 30 request/phút trên một IP, đặt chu kỳ xoay lớn hơn 2 phút để không vượt ngưỡng.\n- **Thời gian xử lý batch**: Chu kỳ nên dài hơn thời gian chạy một batch scraping hoàn chỉnh, tránh đổi IP giữa chừng làm mất trạng thái.\n- **Độ tin cậy IP**: Một số IP residential có tuổi thọ ngắn; nếu gặp lỗi kết nối nhiều, cân nhắc rút ngắn chu kỳ hoặc chuyển sang sticky cho batch quan trọng.\n- **Quản lý session dài hạn**: Session timed rotation thường tồn tại liên tục. Nếu cần dừng scraping lâu, bạn có thể giữ session để tái sử dụng sau, tránh tạo session mới tốn thời gian.\n\n## Kết luận\n\nChế độ timed rotation cung cấp giải pháp cân bằng cho các tác vụ scraping định kỳ: giữ IP ổn định trong một batch, tự động đổi IP giữa các batch để tránh bị chặn. Việc kết hợp `requests.Session`, kiểm tra IP định kỳ, retry thông minh và khả năng xoay IP thủ công qua API tạo nên một quy trình tự động hóa mạnh mẽ, ít cần can thiệp thủ công. Khi sử dụng dịch vụ như RoProxy, bạn chỉ cần bật timed rotation trên session, đặt khoảng thời gian phù hợp và tích hợp các đoạn code trên vào pipeline thu thập dữ liệu của mình.\n","https://blog-api.ro-proxy.com/api/blog/posts/cach-su-dung-che-do-xoay-ip-theo-thoi-gian-cho-scraping-dinh-ky/assets",1793170431881]