ছোট 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-এর ফিল্ড; Requests-এর status_code ও text বিকল্প নয়। সাইটের প্রত্যাখ্যান সচল প্রক্সি দিয়েও আসতে পারে। প্রতিক্রিয়ার আগে ব্যতিক্রম হলে অনুরোধ সম্পূর্ণ হয়নি বোঝায়।

retries=False পরীক্ষামূলক পছন্দ, প্রোডাকশনের পুনরায় চেষ্টার নীতি নয়। সংযোগের 5 সেকেন্ড ও পড়ার 10 সেকেন্ড নিজ নিজ ধাপ সীমিত করে; এগুলো মিলে নিশ্চিত মোট 15 সেকেন্ডের শেষসীমা হয় না। DNS ও প্রতিক্রিয়ার অগ্রগতি মোট অপেক্ষা বদলাতে পারে।

উদাহরণ বডি আগে লোড করে এবং শেষে ম্যানেজারের পুল পরিষ্কার করে। একই এন্ডপয়েন্ট দিয়ে পুনরাবৃত্ত অনুরোধের জন্য কাজ শেষ হওয়া পর্যন্ত ম্যানেজার রাখুন, যাতে সংযোগ আবার ব্যবহার হয়। preload_content=False-এ গেলে জীবনচক্র বদলায়: আহ্বানকারীকে স্ট্রিম করা প্রতিক্রিয়া পড়ে মুক্ত করতে হবে।

শ্রবণকারী সেবার সঙ্গে মানানসই ম্যানেজার বাছুন। অন্য কোথাও URL রাখলেই সাধারণ PoolManager প্রক্সি-সচেতন হয় না; SOCKS urllib3.contrib.socks.SOCKSProxyManager ও তার ঐচ্ছিক নির্ভরতা ব্যবহার করে। ওপরের কোড HTTP ProxyManager পথ অনুসরণ করে।

সম্পর্কিত নিবন্ধ