[{"data":1,"prerenderedAt":19},["ShallowReactive",2],{"blog:post:vi:cach-cau-hinh-xoay-ip-theo-yeu-cau-cho-scraping-da-nguon":3},{"slug":4,"lang":5,"title":6,"summary":7,"date":8,"tags":9,"tag_slugs":14,"thumbnail_url":15,"translations":16,"body":17,"asset_base":18},"cach-cau-hinh-xoay-ip-theo-yeu-cau-cho-scraping-da-nguon","vi","Cách cấu hình xoay IP theo yêu cầu cho scraping đa nguồn","Hướng dẫn từng bước cấu hình xoay IP theo yêu cầu trong RoProxy để scraping đa nguồn hiệu quả với Python.","2026-11-05",[10,11,12,13],"proxy","scraping","python","api",[10,11,12,13],"https://blog-api.ro-proxy.com/api/blog/posts/cach-cau-hinh-xoay-ip-theo-yeu-cau-cho-scraping-da-nguon/thumbnail.svg?lang=vi",[5],"## Tại sao nên xoay IP trước mỗi request\n\nKhi scraping nhiều nguồn dữ liệu, mỗi trang web đều có cơ chế phát hiện và chặn request lặp lại. Việc sử dụng một IP cố định nhanh chóng dẫn đến bị đánh dấu là bot, nhận CAPTCHA hoặc bị từ chối quyền truy cập. Xoay IP trước mỗi request giúp mỗi request đến từ một địa chỉ IP khác nhau, làm giảm khả năng bị phát hiện và tăng tỷ lệ thành công của quá trình thu thập dữ liệu.\n\nChế độ xoay IP theo yêu cầu (per‑request) là giải pháp tối ưu cho kịch bản này, vì nó đảm bảo rằng mỗi kết nối mới đều nhận một IP mới. RoProxy hỗ trợ chế độ này trên gói Business, cho phép bạn gọi API rotate bất kỳ lúc nào. Cách tiếp cận này đặc biệt hữu ích khi bạn cần truy cập đồng thời nhiều website có chính sách chống bot nghiêm ngặt.\n\n## Tổng quan về session và chế độ xoay của RoProxy\n\nRoProxy cung cấp một phiên proxy xoay (session) bao gồm username, password và gateway host trên cổng HTTP. Session trên gói Pro và Business còn bao gồm cổng SOCKS5. Mỗi session có thể hoạt động ở một trong ba chế độ xoay:\n\n- **Sticky** – giữ nguyên IP cho đến khi session thất bại hoặc hết thời gian.\n- **Timed** – tự động thay đổi IP sau khoảng thời gian bạn đặt (ví dụ 300 giây).\n- **Per‑request** – mỗi request mới nhận một IP khác biệt, chỉ khả dụng trên gói Business.\n\nĐể sử dụng chế độ per‑request, bạn cần gọi endpoint rotate của RoProxy trước mỗi request. API chỉ yêu cầu header `Authorization: Bearer API_KEY` và `SESSION_ID`.\n\n## Bước 1: Lấy API key và tạo session\n\nĐầu tiên, bạn cần một khóa API từ RoProxy. Sau khi đăng ký, khóa sẽ được cung cấp. Sử dụng endpoint GET để liệt kê các session hiện có:\n\n```bash\ncurl -s -H \"Authorization: Bearer $API_KEY\" \\\n  https://backend-api.ro-proxy.com/api/session\n```\n\nKết quả trả về một danh sách JSON bao gồm `id`, `country`, `mode`, v.v. Nếu bạn chưa có session, hãy tạo một session mới (theo mặc định nó sẽ ở chế độ sticky). Bạn có thể tạo session bằng cách gọi cùng endpoint GET; hệ thống sẽ tự động cấp một ID mới.\n\n## Bước 2: Chọn quốc gia cho session (Pro/Business)\n\nTrên gói Pro hoặc Business, bạn có thể chỉ định quốc gia mà IP sẽ đến từ đó. Trong quá trình tạo session, bạn gửi request POST đến endpoint session với tham số `country`, ví dụ:\n\n```bash\ncurl -X POST -H \"Authorization: Bearer $API_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"country\": \"US\"}' \\\n  https://backend-api.ro-proxy.com/api/session\n```\n\nGiá trị country có thể là bất kỳ quốc gia nào trong danh sách được hỗ trợ. Việc chọn quốc gia phù hợp giúp bạn tránh các hạn chế khu vực và giảm thời gian trễ mạng.\n\n## Bước 3: Cấu hình proxy trong mã Python\n\nChúng ta sẽ viết một script Python nhỏ sử dụng thư viện `requests`. Script này tải các biến môi trường cho các placeholder, thiết lập proxy HTTP và SOCKS5, sau đó định nghĩa một hàm rotate IP trước mỗi request.\n\n```python\nimport os\nimport time\nimport requests\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\n# Tải các placeholder từ biến môi trường\nGATEWAY_HOST = os.getenv(\"GATEWAY_HOST\")\nHTTP_PORT = os.getenv(\"HTTP_PORT\")\nSOCKS5_PORT = os.getenv(\"SOCKS5_PORT\")\nUSERNAME = os.getenv(\"USERNAME\")\nPASSWORD = os.getenv(\"PASSWORD\")\nAPI_KEY = os.getenv(\"API_KEY\")\nSESSION_ID = os.getenv(\"SESSION_ID\")\n\n# Xây dựng URL proxy\nhttp_proxy = f\"http://{USERNAME}:{PASSWORD}@{GATEWAY_HOST}:{HTTP_PORT}\" if all([GATEWAY_HOST, HTTP_PORT, USERNAME, PASSWORD]) else None\nsocks5_proxy = f\"socks5://{USERNAME}:{PASSWORD}@{GATEWAY_HOST}:{SOCKS5_PORT}\" if all([GATEWAY_HOST, SOCKS5_PORT, USERNAME, PASSWORD]) else None\n\nproxies = {}\nif http_proxy:\n    proxies[\"http\"] = http_proxy\n    proxies[\"https\"] = http_proxy\nif socks5_proxy:\n    proxies[\"socks5\"] = socks5_proxy\n\n# Tạo session requests với retry\n session = requests.Session()\nretry_strategy = Retry(\n    total=3,\n    status_forcelist=[429, 500, 502, 503, 504],\n    method_whitelist=[\"GET\", \"POST\"],\n    backoff_factor=1\n)\nadapter = HTTPAdapter(max_retries=retry_strategy)\nsession.mount(\"http://\", adapter)\nsession.mount(\"https://\", adapter)\n\ndef rotate_ip():\n    \"\"\"Gọi API rotate của RoProxy để lấy IP mới.\"\"\"\n    url = f\"https://backend-api.ro-proxy.com/api/session/{SESSION_ID}/rotate\"\n    headers = {\"Authorization\": f\"Bearer {API_KEY}\"}\n    resp = session.post(url, headers=headers)\n    # API trả về 200 OK ngay cả khi không có IP mới; chúng ta chỉ cần đảm bảo request thành công\n    resp.raise_for_status()\n    # Tùy chọn: parse JSON để ghi nhận IP mới (ví dụ: resp.json().get('ip'))\n    return resp.json()\n\ndef fetch_url(target_url, max_retries=3):\n    for attempt in range(max_retries):\n        try:\n            # Xoay IP trước mỗi request\n            rotate_ip()\n            # Thêm delay nhỏ để tránh rate limit\n            time.sleep(0.5)\n            response = session.get(target_url, proxies=proxies, timeout=10)\n            response.raise_for_status()\n            return response.text\n        except requests.exceptions.HTTPError as e:\n            if e.response.status_code == 429:\n                # Chờ và thử lại sau\n                time.sleep(2 ** attempt)\n                continue\n            raise\n        except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:\n            # Thử lại với backoff\n            time.sleep(2 ** attempt)\n            continue\n    raise Exception(f\"Không thể lấy {target_url} sau {max_retries} lần thử\")\n\n# Ví dụ sử dụng\nurls = [\n    \"https://example.com/product/1\",\n    \"https://example.org/item/42\",\n    \"https://sample.net/data.json\",\n]\n\nfor url in urls:\n    html = fetch_url(url)\n    print(f\"Đã lấy {url}, độ dài {len(html)} ký tự\")\n```\n\n**Giải thích các bước**\n\n1. **Biến môi trường** – Script tải GATEWAY_HOST, HTTP_PORT, SOCKS5_PORT, USERNAME, PASSWORD, API_KEY, SESSION_ID từ hệ thống. Việc sử dụng biến môi trường giúp bạn có thể tái sử dụng script mà không cần hard‑code thông tin xác thực.\n2. **Xây dựng proxy** – Chúng ta tạo URL proxy HTTP và SOCKS5 bằng các placeholder. Script này linh hoạt: nếu bạn chỉ cần HTTP, SOCKS5_PORT hoặc các biến khác bị thiếu, proxy tương ứng sẽ bị bỏ qua.\n3. **Session requests** – Sử dụng `requests.Session` với chiến lược retry giúp tăng độ ổn định khi nhà cung cấp xoay IP liên tục. Retry đặc biệt hữu ích khi bắt gặp 429 (rate limit) hoặc 5xx.\n4. **Hàm rotate_ip** – Gửi request POST đến endpoint rotate của RoProxy. API chỉ yêu cầu header Authorization; các tham số khác không cần thiết. Response được kiểm tra; bạn có thể mở rộng để lưu IP mới nếu cần.\n5. **Hàm fetch_url** – Trước mỗi request, rotate_ip được gọi, sau đó delay ngắn 0.5 giây để giảm khả năng bị phát hiện. Logic retry xử lý 429 và lỗi mạng, đảm bảo scraping mạnh mẽ.\n\n## Bước 4: Tối ưu hóa cho các website có chính sách chống bot nghiêm ngặt\n\n### 4.1 Sử dụng SOCKS5 khi cần thiết\nNếu website bạn scrape chặn proxy HTTP nhưng chấp nhận SOCKS5, hãy thiết lập SOCKS5_PORT và sử dụng proxy socks5 trong script. SOCKS5 hoạt động ở lớp thấp hơn, do đó dấu chân mạng nhỏ hơn.\n\n### 4.2 Quản lý rate limit\nMỗi IP có ngưỡng request nhất định. Rotation liên tục giúp bạn phân phối tải đều. Tuy nhiên, bạn cũng nên chèn delay ngẫu nhiên (ví dụ `random.uniform(0.5, 1.5)`) và sử dụng exponential backoff khi nhận 429.\n\n### 4.3 Xử lý CAPTCHA và fingerprint\nRotation IP giúp giảm CAPTCHA, nhưng bạn vẫn nên tích hợp thư viện detection CAPTCHA (ví dụ `2captcha`, `anti-captcha`) nếu script bắt gặp mã này. Ngoài ra, duy trì fingerprint trình duyệt ổn định (User‑Agent, Accept‑Language) giúp giảm khả năng bị yêu cầu giải CAPTCHA.\n\n### 4.4 Xác thực session và rotate trước mỗi request\nĐể đảm bảo mỗi request sử dụng IP mới, hãy gọi rotate_ip ngay trước khi request, như đã trình bày. Đối với các website kiểm tra sự liên tục của session, bạn có thể kết hợp rotate với chế độ sticky và chỉ rotate khi cần thiết (ví dụ sau mỗi N request). Đối với mục đích scraping đa nguồn, rotate trước mỗi request là chiến lược đơn giản và hiệu quả.\n\n## Bước 5: Triển khai trong CI/CD (tùy chọn)\n\nNếu bạn muốn tự động hóa việc tạo session và rotation trong pipeline CI, bạn có thể sử dụng script Python trên như một bước. Ví dụ với GitHub Actions:\n\n```yaml\n- name: Cấu hình proxy và xoay IP\n  env:\n    GATEWAY_HOST: ${{ secrets.GATEWAY_HOST }}\n    HTTP_PORT: ${{ secrets.HTTP_PORT }}\n    SOCKS5_PORT: ${{ secrets.SOCKS5_PORT }}\n    USERNAME: ${{ secrets.USERNAME }}\n    PASSWORD: ${{ secrets.PASSWORD }}\n    API_KEY: ${{ secrets.API_KEY }}\n    SESSION_ID: ${{ secrets.SESSION_ID }}\n  run: |\n    python3 scrape.py\n```\n\nPipeline có thể thiết lập các secrets này trong repository, giúp script có thể thực hiện trên nhiều môi trường mà không cần hard‑code credentials.\n\n## Kết luận\n\nXoay IP theo yêu cầu mang lại khả năng linh hoạt cao khi scraping đa nguồn, giúp mỗi request đến từ một địa chỉ IP duy nhất, giảm khả năng bị phát hiện và chặn. Với RoProxy, bạn có thể dễ dàng cấu hình một session ở chế độ per‑request, gọi API rotate trước mỗi request và duy trì quá trình thu thập dữ liệu ổn định. Bằng cách kết hợp rotation, retry và delay phù hợp, bạn sẽ đạt được tỷ lệ thành công cao và tránh các cơ chế chống bot phổ biến. Hãy thử nghiệm chiến lược này với các website mục tiêu của bạn và điều chỉnh tham số theo nhu cầu thực tế.\n\n---\n\n*Lưu ý: Script và hướng dẫn trên chỉ sử dụng các tính năng được xác nhận của RoProxy. Mọi thông tin về pool IP, tốc độ hoặc tính năng nâng cao khác không được đề cập đều không được xác nhận.*\n","https://blog-api.ro-proxy.com/api/blog/posts/cach-cau-hinh-xoay-ip-theo-yeu-cau-cho-scraping-da-nguon/assets",1793951898521]