שימוש בכתובת IP של פרוקסי עם urllib3
בחרו ProxyManager לפרוקסי HTTP, בדקו את שדות התגובה של urllib3 והביאו בחשבון ניסיונות חוזרים ומנהל SOCKS נפרד.
לאבחון פרוקסי קטן ב־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.