برای تشخیص کوچک پروکسی در urllib3، از ProxyManager با تلاش‌های مجدد غیرفعال استفاده کنید. این کار نخستین تلاش را گزارش می‌کند، نه اینکه وقت بیشتری صرف تکرار مدخلی کند که دیگر کار نمی‌کند. در پروژه‌ای تحت مدیریت uv:

uv add urllib3

نقطهٔ اتصال نمونهٔ مستندات را با پروکسی HTTP سرویس خود یا مدخلی از فهرست پروکسی‌های HTTP عوض کنید و درخواست را با همان مدیر بفرستید:

import urllib3

proxy = urllib3.ProxyManager(
    "http://203.0.113.10:8080",
    timeout=urllib3.Timeout(connect=5, read=10),
    retries=False,
)

try:
    response = proxy.request("GET", "https://example.com/")
    print(response.status)
    print(response.data.decode("utf-8", errors="replace")[:200])
finally:
    proxy.clear()

ابتدا response.status را بخوانید، سپس response.data را بررسی کنید. این‌ها فیلدهای urllib3 هستند؛ status_code و text به سبک Requests جایگزینشان نیستند. ردشدن از سوی سایت می‌تواند از پروکسی سالم برسد. در مقابل، استثنا پیش از پاسخ نشان می‌دهد درخواست کامل نشده است.

retries=False انتخابی تشخیصی است، نه سیاست تلاش مجدد برای محیط عملیاتی. تنظیم اتصال 5 ثانیه‌ای و خواندن 10 ثانیه‌ای هر کدام مرحلهٔ خود را محدود می‌کنند؛ مجموع آن‌ها مهلت کل تضمین‌شدهٔ 15 ثانیه نیست. DNS و پیشرفت دریافت پاسخ می‌توانند بر انتظار کل اثر بگذارند.

مثال بدنه را از پیش بارگیری می‌کند و در پایان مخزن‌های اتصال مدیر را خالی می‌کند. برای درخواست‌های تکراری به همان نقطه، مدیر را تا پایان کار نگه دارید تا اتصال‌ها دوباره استفاده شوند. رفتن به preload_content=False چرخهٔ عمر را عوض می‌کند: فراخوان باید پاسخ جریانی را بخواند و آزاد کند.

مدیر را متناسب با شنونده انتخاب کنید. PoolManager معمولی صرفاً به‌دلیل ذخیره‌شدن URL در جایی دیگر از پروکسی آگاه نمی‌شود؛ SOCKS از urllib3.contrib.socks.SOCKSProxyManager و وابستگی‌های اختیاری آن استفاده می‌کند. کد بالا مسیر HTTP ‏ProxyManager را دنبال می‌کند.

مقالات مرتبط