[{"data":1,"prerenderedAt":20},["ShallowReactive",2],{"blog:post:vi:trien-khai-he-thong-scraping-dau-ngu-voi-proxy-rotating-fastapi-grafana":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},"trien-khai-he-thong-scraping-dau-ngu-voi-proxy-rotating-fastapi-grafana","vi","Triển khai hệ thống scraping đa nguồn với proxy rotating, FastAPI và Grafana","Hướng dẫn chi tiết cách xây dựng một hệ thống scraping đa nguồn, sử dụng proxy rotating qua FastAPI, và giám sát hiệu năng với Grafana.","2026-07-29",[10,11,12,13,14],"scraping","proxy","fastapi","grafana","monitoring",[10,11,12,13,14],"https://blog-api.ro-proxy.com/api/blog/posts/trien-khai-he-thong-scraping-dau-ngu-voi-proxy-rotating-fastapi-grafana/thumbnail.svg?lang=vi",[5],"## Giới thiệu\nTrong thế giới dữ liệu ngày nay, việc thu thập thông tin từ nhiều nguồn website vẫn là một thách thức lớn. Đặc biệt là khi bạn muốn xây dựng một nền tảng scraping đa nguồn, bạn phải cân nhắc không chỉ về tốc độ lẫn độ tin cậy mà còn về mặt bảo mật và quản lý IP.\n\nĐây là một bài hướng dẫn thực tế, hướng tới các developer muốn:\n\n* Tạo một API scraping dễ mở rộng bằng FastAPI.\n* Sử dụng proxy rotating để tránh bị chặn.\n* Giám sát các metric như latency, số request, error rate bằng Grafana.\n\nTất cả các thành phần sẽ dùng mã nguồn mở (Python, Docker, Prometheus, Grafana) và một proxy service chất lượng – bạn có thể thay thế bằng RoProxy khi muốn.\n\n## 1. Kiến trúc tổng quan\n\n```\n+----------------+          +---------------- larga\n|   Front‑end    |          |   Proxy Layer   |\n|  (FastAPI)    |\u003C-------->+-------------------\n+----------------+   HTTP   |  proxy-rotator   |\n                           +----------------\n+----------------+    HTTP   +----------------\n|   Scraper      |\u003C-------->+  Target Website |\n|   (Python)     |          +----------------\n+----------------+                      |\n                                     (Crawl)\n```\n\n* **FastAPI**: là API gateway nhận request từ client (web/app), chuyển tiếp tới scraper.\n* **Proxy‑rotator**: module quản lý danh sách proxy regra, lựa chọn rando‑IP mới cho mỗi request.\n* **Scraper**: thực thi crawler, gửi HTTP requests thông qua proxy.\n* **Grafana + Prometheus**: thu thập metric từ FastAPI và scraper.\n\n## 2. Chuẩn bị môi trường\n\n### 2.1 Docker Compose\nChúng ta sẽ đóng gói từng component vào container riêng.\n\n```\n# docker-compose.yml\nversion: \"3.8\"\nservices:\n  fastapi:\n    build: ./fastapi\n    depends_on:\n      - prometheus\n    environment:\n      - PROXY_URL=http://proxy-rotator:8000/get\n  scraper:\n    build: ./scraper\n    depends_on:\n      - fastapi\n    environment:\n      - PROXY_URL=http://proxy-rotator:8000/get\n  proxy-rotator:\n    build: ./proxy_rotator\n    environment:\n      - PROXY_LIST=proxies.txt\n  prometheus:\n    image: prom/prometheus:latest\n    volumes:\n      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml\n    command: --config.file=/etc/prometheus/prometheus.yml\n  grafana:\n    image: grafana/grafana:latest\n    depends_on:\n      - prometheus\n    environment:\n      - GF_SECURITY_ADMIN_PASSWORD=admin\n    ports:\n      - \"3000:3000\"\n```\n\n### 2.2 Tệp `proxies.txt`\n\n```\nhttp://user:pass@proxy1:3128\nhttp://user:pass@proxy2:3128\nhttp://user:pass@proxy3:3128\n```\n\nBạn có thể lấy danh sách proxy miễn phí/đặt hàng từ RoProxy.\n\n## 3. Xây dựng Proxy‑Rotator\n\nMục Giá: Cung cấp một endpoint `/get` trả về một proxy ngẫu nhiên.\n\n```python\n# proxy_rotator/app.py\nimport os, random, json\nfrom fastapi import FastAPI\n\n(`/proxy-rotator`)\napp = FastAPI()\n\nproxy_file = os.getenv(\"PROXY_LIST\", \"proxies.txt\")\nwith open(proxy_file) as f:\n    proxies = [line.strip() for line in f if line.strip()]\n\n@app.get(\"/get\")\nasync def get_proxy():\n    proxy = random.choice(proxies)\n    return {\"proxy\": proxy}\n```\n\nBuild:\n```\nFROM python:3.11-slim\nWORKDIR /app\nCOPY app.py .\nRUN pip install fastapi uvicorn\nCMD [\"uvicorn\", \"app:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]\n```\n\n## 4. FastAPI Gateway\n\nFastAPI sẽ nhận request dạng `GET /crawl?url=https://target.com`.\n\n```python\n# fastapi/main.py\nimport httpx, os\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import HttpUrl\n\napp = FastAPI()\nproxy_rotator_url = os.getenv(\"PROXY_URL\", \"http://proxy-rotator:8000/get\")\n\n@app.get(\"/crawl\")\nasync def crawl(url: HttpUrl):\n    # 1. Nhận proxy\n    async with httpx.AsyncClient() as client:\n        r = await client.get(proxy_rotator_url)\n        r.raise_for_status()\n        proxy = r.json()[\"proxy\"]\n    # 2. Gửi request tới target\n    async with httpx.AsyncClient(proxies={\"http\": proxy, \"https\": proxy}, timeout=10) as client:\n        try:\n            resp = await client.get(str(url))\n            resp.raise_for_status()\n        except httpx.HTTPError as exc:\n            raise HTTPException(status_code=502, detail=str(exc))\n    # 3. Trả về nội dung\n    return {\"content\": resp.text}\n```\n\n## 5. Scraper (Python)\n\nĐây là một module có thể được gọi độc lập hoặc được FastAPI gọi để thực thi scraping sâu.\n\n```python\n# scraper/worker.py\nimport httpx, asyncio, os, json\nfrom bs4 import BeautifulSoup\n\nproxy_rotator_url = os.getenv(\"PROXY_URL\", \"http://proxy-rotator:8000/get\")\n\nasync def fetch(url):\n    async with httpx.AsyncClient() as client:\n        r = await client.get(proxy_rotator_url)\n        r.raise_for_status()\n        proxy = r.json()[\"proxy\"]\n    async with httpx.AsyncClient(proxies={\"http\": proxy, \"https\": proxy}, timeout=10) as client:\n        r = await client.get(url)\n        r.raise_for_status()\n    return r.text\n\nasync def parse(html):\n    soup = BeautifulSoup(html, \"html.parser\")\n    titles = [t.text.strip() for t in soup.select(\"h1, .title\")]\n    return titles\n\nasync def main(url):\n    html = await fetch(url)\n    titles = await parse(html)\n    print(titles)\n\nif __name__ == \"__main__\":\n    asyncio.run(main(\"https://example.com\"))\n```\n\n## 6. Giám sát với Prometheus & Grafana\n\n### 6.1 Prometheus Scrape config\n\n```yaml\n# prometheus/prometheus.yml\nglobal:\n  scrape_interval: 15s\n\nscrape_configs:\n  - job_name: \"fastapi\"\n    static_configs:\n      - targets: [\"fastapi:8000\"]\n    metrics_path: \"/metrics\"\n  - job_name: \"scraper\"\n    static_configs:\n      - targets: [\"scraper:8000\"]\n    metrics_path: \"/metrics\"\n```\n\nFastAPI và Scraper cần expose `/metrics` endpoint (được FastAPI-Users hoặc Starlette metrics cung cấp).\n\n### 6.2 Dashboard Grafana\n\nSau khi truy cập `http://localhost:3000` (đăng nhập admin/admin), bạn có thể nhập Prometheus làm dữ liệu nguồn, tạo dashboard với các panels:\n\n* **HTTP latency** – biểu đồ line của latency request.\n* **Error rate** – tỷ lệ 5xx.\n* **Active proxies** – số proxy đang được sử dụng.\n\n## 7. Tối ưu performance\n\n1. **Connection pooling** – `httpx.AsyncClient` đã hỗ trợ pool, giữ connection mở.\n2. **Batching** – nếu cần scrape nhiều URL,lp thực hiện batch async.\n3. **Proxy rotation policy** – thay vì chọn ngẫu nhiên, bạn có thể giới hạn số lần dùng một proxy, sau khi đạt giới hạn tự xoay.\n4. **Retry logic** – add `httpx.Retry` để tự động retry khi gặp lỗi 429.\n\n## 8. Bảo mật và giới hạn\n\n| Mục tiêu | Lệnh thực hiện |\n|-----------|----------------|\n| Tránh rò IP | Cấu hình `PROXY_URL` trong container, không lưu proxy trong code |\n| Vô hiệu DNS leak | Sử dụng `--proxy` cho httpx, tránh DNS query qua đường mạng cổng ngoài |\n| Giới hạn truy cập | Sử dụng `nginx` hoặc `traefik` làm reverse proxy, limit rate |\n\n## 9. Kết luận\n\nBằng cách pha trộn FastAPI, proxy rotating, và hệ thống giám sát, bạn đãMDB một nền tảng scraping đa nguồn, có thể mở rộng và đáng tin cậy. Khi quy mô tăng lên, bạn chỉ cần thêm node mới vào Docker Compose hoặc chuyển sang Kubernetes.\n\nNếu bạn muốn một dịch vụ proxy chuyên nghiệp với IP đồng bộ, độ trễ thấp và SLA cao, hãy thử RoProxy – giải pháp proxy tối ưu cho mọi nhu cầu scraping.\n","https://blog-api.ro-proxy.com/api/blog/posts/trien-khai-he-thong-scraping-dau-ngu-voi-proxy-rotating-fastapi-grafana/assets",1790057944160]