TL;DR
Với HTTPX, truyền một URL proxy vào AsyncClient(proxy=...), tái sử dụng client giữa các yêu cầu, và giới hạn độ song song với một semaphore. Để xoay vòng, gán một nhóm worker nhỏ cho các điểm cuối proxy thay vì tạo một client mới cho mỗi URL. Số lần thử lại nên được giới hạn, có thể quan sát được, và bị hạn chế cho các lỗi tạm thời.
Cấu hình một Proxy HTTPX
HTTPX hỗ trợ định tuyến proxy trực tiếp. Tài liệu chính thức về proxy của nó trình bày về tham số proxy và các gói vận chuyển; hướng dẫn async của nó khuyên nên tái sử dụng các client để việc quản lý kết nối có thể hoạt động.
pip install httpx
import asyncio import httpx PROXY = "http://USERNAME:PASSWORD@gate.example:8000" async def main(): timeout = httpx.Timeout(20.0, connect=10.0) limits = httpx.Limits(max_connections=20, max_keepalive_connections=10) async with httpx.AsyncClient( proxy=PROXY, timeout=timeout, limits=limits, follow_redirects=True, ) as client: response = await client.get("https://example.com/authorized-page") response.raise_for_status() print(response.status_code, len(response.content)) asyncio.run(main())
Sử dụng biến môi trường hoặc một trình quản lý bí mật cho thông tin xác thực trong môi trường sản xuất. Không nên cam kết chúng vào kiểm soát nguồn.
Mô hình tư duy: Async tăng công việc đồng thời; nó không tăng ngân sách yêu cầu an toàn của mục tiêu.
Xoay vòng Proxy mà không làm hỏng các nhóm kết nối
Ví dụ này gán các URL cho các client dài hạn. Nó sử dụng độ song song có giới hạn và trả về các kết quả có cấu trúc. Thay thế các điểm cuối placeholder bằng các điểm cuối Nstdata proxy được ủy quyền.
import asyncio import itertools import httpx URLS = [ "https://example.com/page/1", "https://example.com/page/2", ] PROXIES = [ "http://USER:PASS@gate-1.example:8000", "http://USER:PASS@gate-2.example:8000", ] async def fetch(client, url, semaphore): async with semaphore: try: r = await client.get(url) r.raise_for_status() return {"url": url, "status": r.status_code, "bytes": len(r.content)} except httpx.HTTPError as exc: return {"url": url, "error": type(exc).__name__} async def main(): semaphore = asyncio.Semaphore(8) clients = [ httpx.AsyncClient(proxy=p, timeout=20, follow_redirects=True) for p in PROXIES ] try: tasks = [ fetch(client, url, semaphore) for url, client in zip(URLS, itertools.cycle(clients)) ] print(await asyncio.gather(*tasks)) finally: await asyncio.gather(*(client.aclose() for client in clients)) asyncio.run(main())
Đầu ra đại diện:
[{'url': 'https://example.com/page/1', 'status': 200, 'bytes': 12480}, {'url': 'https://example.com/page/2', 'error': 'ReadTimeout'}]
Chỉ thử lại những gì có thể phục hồi
Thử lại các lỗi kết nối, thời gian chờ, 429, và các phản hồi 5xx đã chọn với backoff lũy tiến và jitter. Không thử lại các lỗi xác thực hoặc mọi 4xx. Giới hạn số lần thử và ghi lại điểm cuối proxy, máy chủ mục tiêu, độ trễ, trạng thái, và kết quả cuối cùng mà không ghi lại thông tin xác thực.
Các phiên tạm thời hoạt động tốt hơn cho các luồng nhiều yêu cầu phụ thuộc vào cookie. Cách xoay vòng hoạt động tốt hơn cho các yêu cầu độc lập khi được phép. Thay đổi proxy cho mỗi yêu cầu có thể phá hủy việc tái sử dụng kết nối và làm cho việc khắc phục sự cố trở nên khó khăn hơn.
Các lỗi thường gặp
407 Proxy Authentication Required: thông tin xác thực hoặc định dạng điểm cuối không đúng.- Lỗi TLS: xác minh chứng chỉ; không vô hiệu hóa xác minh như một cách sửa chữa chung.
429: giảm độ song song và tôn trọngRetry-After.- Các trang thách thức lặp lại: dừng lại và xác nhận quy tắc truy cập hơn là leo thang sự lẩn tránh.
- Độ trễ cao hơn với async: giới hạn độ song song quá cao hoặc đường truyền phía trên đã bão hòa.
Lời kết
Mô hình proxy HTTPX tin cậy là một AsyncClient được tái sử dụng, thời gian chờ rõ ràng, độ song song có giới hạn, lỗi có cấu trúc, và thử lại bảo thủ. Sử dụng các điểm cuối proxy Nstdata khi định tuyến vị trí hoặc phiên là yêu cầu thực sự, và đo lường các phản hồi có thể sử dụng thay vì khối lượng yêu cầu thô.
Trải nghiệm Nstdata — Bắt đầu dùng thử miễn phí ngay hôm nay
Câu hỏi thường gặp
HTTPX có hỗ trợ các proxy SOCKS không?
Có, với phụ thuộc SOCKS tùy chọn. Theo dõi tài liệu cài đặt và proxy HTTPX hiện tại.
Có nên chia sẻ một AsyncClient giữa các tác vụ không? Có, khi những nhiệm vụ đó chia sẻ cấu hình và vòng đời. Việc tái sử dụng của khách hàng cho phép tạo nhóm kết nối.
Tôi nên gửi bao nhiêu yêu cầu đồng thời?
Bắt đầu thấp và chỉ tăng trong giới hạn tốc độ được ủy quyền của mục tiêu và ngân sách lỗi mà bạn đã đo lường.





