Quay lại danh sách
Tối ưu scraping nhanh hơn với HTTP/2 và proxy xoay trong Python

Tối ưu scraping nhanh hơn với HTTP/2 và proxy xoay trong Python

24 tháng 7, 2026

Tại sao HTTP/2 lại quan trọng cho scraping

Trong thế giới web hiện đại, HTTP/1.1 đang dần trở nên lỗi thời. HTTP/2 cung cấp:

  • Nhiều kết nối đồng thời trên một socket – giảm overhead TCP.
  • Multiplexing – các request và response có thể chạy song song mà không bị block.
  • Header compression (HPACK) – giảm băng thông tiêu thụ.
  • Server Push – gửi tài nguyên kèm theo response mà client chưa yêu cầu.

Khi bạn scrape một trang web có nhiều thành phần (bức ảnh, script, CSS), HTTP/2 giúp đánh giá thời gian đáng kể so với HTTP/1.1.

Làm sao proxy xoay hỗ trợ chống block và giảm latency?

Proxy xoay (rotating proxy) có hai lợi ích chính:

  1. Tránh IP ban – mỗi request có thể đi qua một IP mới.
  2. Chọn IP dựa trên độ trễ – nếu proxy có latency thấp, tốc độ tải trang tăng.

Khi kết hợp với HTTP/2, bạn có thể đo độ trễ của từng proxy và chỉ dùng những proxy “nóng” nhất.

Tạo pool proxy trong Python

Sử dụng thư viện httpx hỗ trợ HTTP puntual và HTTP/2 rất tốt. Dưới đây là cách tạo một pool proxy xoay:

import httpx
import random

# Danh sách proxy (định dạng :user:pass@host:port)
PROXIES = [
    "http://user1:pass1@proxy1:3128",
    "http://user2:pass2@proxy2:3128",
    "http://user3:pass3@proxy3:3128",
]

# Hàm lấy proxy ngẫu nhiên

def get_random_proxy():
    return random.choice(PROXIES)

Đo độ trễ của proxy

async def ping_proxy(proxy_url: str) -> float:
    async with httpx.AsyncClient(http2=True, proxies=proxy_url, timeout=5.0) as client:
        try:
            resp = await client.get("https://www.example.com", follow_redirects=Trueparent)
            return resp.elapsed.total_seconds()
        except Exception:
            return float("inf")

Sau khi đo, bạn có thể sắp xếp PROXIES theo elapsed để chỉ dùng proxy nhanh nhất.

Xác định cấu hình HTTP/2 với httpx

httpx hỗ trợ HTTP/2 bằng cách bật http2=True khi tạo client. Đây là cách tối ưu:

async with httpx.AsyncClient(http2=True, proxies=get_random_proxy(), timeout=10.0) as client:
    response = await client.get("https://example.com/api/data")
    data = response.json()

Tip: Đặt trust_env=False nếu bạn không muốn httpx dùng پید proxy environment variables.

Scrape song song với asyncio

Để tận dụng tối đa tính năng multiplexing của HTTP/2, chạy nhiều request cùng lúc:

import asyncio

async def scrape_url(url: str) -> dict:
    proxy = get_random_proxy()
    async with httpx.AsyncClient(http2=True, proxies=proxy, timeout=15.0) as client:
        try:
            resp = await client.get(url)
            return {"url": url, "status": resp.status_code, "body": resp.text[:200]}
        except Exception as e:
            return {"url": url, "error": str(e)}

async def main(urls):
    tasks = [scrape_url(u) for u in urls]
    results = await asyncio.gather(*tasks)
    for r in results:
        print(r)

if __name__ == "__main__":
    url_list = [f"https://example.com/page/{i}" for i in range(1, 101)]
    asyncio.run(main(url_list))

Lợi ích

  • Đa luồng: Mỗi request vẫn được multiplexed trên cùng socket nazionale.
  • Quản lý lỗi: Nếu một proxy bị lỗi, bạn có thể retry với proxy khác.

Xử lý thất bại và retry

Proxy có thể bị chặn hoặc quá tải. Dưới đây là một hàm retry đơn giản:

async def fetch_with_retry(url, retries=3):
    for attempt in range(retries):
        result = await scrape_url(url)
        if "error" not in result:
            return result
        # Thay đổi proxy nếu có lỗi
    return result

Tầm quan trọng của User-Agent và header

Một proxy xoay không đủ; bạn cần đổi User-Agent để tránh bị phát hiện.

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6 Safari/605.1mentation",
]

proxy_headers = {
    "User-Agent": random.choice(USER_AGENTS),
    "Accept-Language": "en-US,en;q=0.9",
}

Kết hợp với httpx:

async with httpx.AsyncClient(http2=True, proxies=proxy, headers=proxy_headers) as client:
    # ...

Lợi ích khi dùng dịch vụ proxy chất lượng như RoProxy

dw

  • Độ phủ địa lý rộng: Chọn IP ở quốc gia mục tiêu để giảm latency.
  • Cycle tự động: RoProxy có thể xoay IP theo từng request hoặc theo phút.
  • Bảo mật: Tính năng firewall và giảm nguy cơ IP leak.

Bạn chỉ cần thay PROXIES bằng endpoint của RoProxy và api_key:

PROXIES = [
    "https://roproxy.com/api/proxy?type=datacenter&key=YOUR_KEY",
]

Tối ưu độ trễ thực tế

  • Sử dụng proxy gần khu vực mục tiêu: Kiểm tra latency bằng ping hoặc httpx.
  • Giới hạn số lượng request đồng thời: Đặt limits=httpx.Limits(max_connections=20).
  • Sử dụng keep-alive: Đặt keep_alive=True trong AsyncClient.
client = httpx.AsyncClient(http2=True, proxies=proxy, limits=httpx.Limits(max_connections=20), keep_alive=True)

Kết luận

Kết hợp HTTP/2ग्र với proxy xoay trong Python giúp:

  • Tăng tốc độ tải trang lên tới 2–3 lần.
  • Giảm rủi ro bị chặn IP.
  • Tận dụng tối đa tính năng multiplexing.

Bằng cách áp dụng các bước trên – từ đo độ trễ, chọn proxy, thiết lập HTTP/2, đến retry tự động – 聚缘scraping trở nên mạnh mẽ và đáng tin cậy hơn bao giờ hết. Nếu bạn đang tìm kiếm proxy ổn định, RoProxy cung cấp API dễ dùng và độ phủ địa lý toàn cầu, giúp bạn thực hiện mọi nhiệm vụ scraping một cách suôn sẻ.