Socks5Proxy

Python requests প্রোক্সি সেটিং, SOCKS5 এবং HTTP প্রোক্সি সংযোগ

এই গাইডে Python requests লাইব্রেরিতে Socks5Proxy-এর HTTP ও SOCKS5 প্রোক্সি সংযোগ, username/password অথেন্টিকেশন, তালিকা রোটেশন ও রিট্রাই কোড ধাপে ধাপে বর্ণনা করা হয়েছে।

কী প্রস্তুত করতে হবে?

Python 3.8 এবং requests লাইব্রেরি প্রয়োজন। SOCKS5 ব্যবহার করতে SOCKS সমর্থন বান্ডেল ইনস্টল করতে হবে। requests[socks] ইনস্টল করলে PySocks একসাথে ইনস্টল হয় এবং socks5 এবং socks5h ঠিকানা ব্যবহার করা যায়।

প্রক্সি তথ্য ড্যাশবোর্ডের আমার প্রক্সি স্ক্রিনে দেখতে পাবেন। এই উদাহরণে IP 198.51.100.23, HTTP পোর্ট 8000, SOCKS5 পোর্ট 1080, ইউজারনেম spx_user, পাসওয়ার্ড spx_pass ব্যবহার করা হয়েছে। প্রকৃত মান দিয়ে প্রতিস্থাপন করুন।

pip install "requests[socks]"

HTTP প্রোক্সি কিভাবে সংযুক্ত করবো?

requests proxies ডিকশনারিতে ঠিকানা দিলে সেই প্রোক্সি দিয়ে রিকোয়েস্ট পাঠায়। http এবং https উভয় কী-এ একই HTTP প্রোক্সি ঠিকানা দেওয়া গুরুত্বপূর্ণ। https কী না থাকলে HTTPS ঠিকানা রিকোয়েস্ট প্রোক্সি ছাড়াই সরাসরি চলে যায়।

HTTPS সাইট রিকোয়েস্ট CONNECT পদ্ধতিতে প্রোক্সি দিয়ে যায়, যাতে ডেটা শুরু থেকে শেষ পর্যন্ত এনক্রিপ্টেড থাকে। নিচের কোডটি IP চেক ঠিকানা দিয়ে রিকোয়েস্ট করে রেসপন্সে প্রোক্সি IP দেখায় কিনা চেক করে।

import requests

proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json())  # the "ip" field should show the proxy IP

SOCKS5 প্রোক্সি কিভাবে কানেক্ট করবো?

SOCKS5-এর জন্য অ্যাড্রেসে socks5h ব্যবহারের পরামর্শ দিই। socks5h ডোমেইন নেম রেজোলিউশন প্রোক্সি সাইডে করে, ফলে আপনার সার্ভারের DNS রিকোয়েস্ট বাইরে দেখা যায় না এবং প্রোক্সির দেশ অনুযায়ী নেম রেজোল্ভ হয়। socks5 ব্যবহার করলে নেম রেজোলিউশন আপনার সার্ভারে হয় এবং শুধু আইপি প্রোক্সিতে যায়।

পোর্ট SOCKS5 পোর্ট ব্যবহার করতে হবে। HTTP পোর্টে SOCKS5 ঠিকানা দিলে কানেকশন হবে না, তাই প্রতিটি লাইনে দুটি পোর্ট আলাদাভাবে চিহ্নিত করুন।

import requests

proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())

একাধিক প্রক্সি ঘুরিয়ে ফিরিয়ে অনুরোধ পাঠাতে চাইলে কী করতে হবে?

বহু পৃষ্ঠা সংগ্রহ করার সময় প্রোক্সি তালিকা ডাউনলোড করে প্রতি রিকোয়েস্টে পরবর্তী প্রোক্সি ব্যবহার করা সাধারণ পদ্ধতি। নিচের কোডটি API থেকে SOCKS5 তালিকা নিয়ে ক্রমান্বয়ে ব্যবহার করে, ব্যর্থ রিকোয়েস্ট অন্য প্রোক্সি দিয়ে সর্বোচ্চ ৩ বার পুনরায় পাঠায়। একই ডোমেইনে খুব দ্রুত রিকোয়েস্ট না করার জন্য কিছুক্ষণ বিরতি নেওয়ার ব্যবস্থাও রয়েছে।

ব্যর্থ প্রোক্সি সরাসরি ফেলে দেওয়ার চেয়ে কিছুক্ষণ বিশ্রাম দিন এবং পরে আবার ব্যবহার করুন। অস্থায়ী ত্রুটি লক্ষ্য সাইটের অবস্থার কারণে হতে পারে।

import itertools
import time
import requests

API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"

lines = requests.get(
    API + "/proxies/download",
    params={"format": "user:pass@ip:port", "protocol": "socks5"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()
pool = itertools.cycle(lines)

def fetch(url, tries=3):
    for _ in range(tries):
        p = "socks5h://" + next(pool)
        try:
            r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
            if r.status_code == 200:
                return r.text
        except requests.RequestException:
            pass
        time.sleep(1)
    return None

for page in range(1, 6):
    html = fetch("https://example.com/list?page=" + str(page))
    print(page, "ok" if html else "failed")
    time.sleep(0.5)

সেশন এবং কুকি ধরে রাখতে কী করতে হবে?

লগইন বা পৃষ্ঠা নেভিগেশনের মতো কুকি ধারাবাহিকতা প্রয়োজন এমন প্রক্রিয়াগুলির জন্য requests.Session-এ একটি প্রক্সি ঠিকানা নির্দিষ্ট করে ব্যবহার করুন। সেশন অবজেক্টের proxies বৈশিষ্ট্যে ঠিকানা যোগ করলে সেই সেশনের সব অনুরোধ একই IP ঠিকানা থেকে যাবে। প্রক্রিয়া শেষ হলে সেশন বন্ধ করে পরবর্তী প্রক্সি দিয়ে নতুন সেশন তৈরি করুন।

প্রতি সেশনে User-Agent এবং Accept-Language হেডারও নির্ধারণ করলে টার্গেট সাইটে প্রদর্শিত চিত্র স্থির থাকবে।

import requests

s = requests.Session()
s.proxies = {
    "http": "http://spx_user:spx_pass@198.51.100.23:8000",
    "https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})

s.get("https://example.com/", timeout=20)          # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20)  # same IP, same cookies
print(r.status_code)
s.close()

IP অনুমোদন দিয়ে সংযোগ করার সময় কিভাবে ব্যবহার করবেন?

ড্যাশবোর্ডে এই কোড চলছে এমন সার্ভারের IPv4 রেজিস্টার করুন, তারপর ঠিকানা থেকে ইউজারনেম ও পাসওয়ার্ড বাদ দিয়ে ব্যবহার করুন। পাসওয়ার্ড কোড বা কনফিগ ফাইলে রাখার দরকার নেই, তাই একাধিক সার্ভারে একই কোড ডিপ্লয় করা সহজ। লিস্ট পেতে format=ip:port সিলেক্ট করুন।

import requests

proxy = "http://198.51.100.23:8000"  # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)

একাধিক অনুরোধ একই সাথে দ্রুত পাঠাতে চাইলে কী করতে হবে?

requests একটি রিকোয়েস্ট শেষ হওয়া পর্যন্ত অপেক্ষা করে, তাই অনেক পৃষ্ঠা দ্রুত পেতে একাধিক কাজ একসাথে চালাতে হবে। সবচেয়ে সহজ পদ্ধতি concurrent.futures-এর ThreadPoolExecutor। কাজের সংখ্যা প্রোক্সি সংখ্যার চেয়ে কম রাখলে একটি IP-এ রিকোয়েস্ট জমা হয় না।

নিচের কোডটি 20টি ওয়ার্কার দিয়ে ঠিকানা লিস্ট ভাগ করে নেয়, এবং প্রতিটি কাজে লিস্ট থেকে পরবর্তী প্রক্সি বেছে নেয়। itertools.cycle একাধিক থ্রেডে একসাথে ব্যবহার করলেও পরবর্তী মান নিতে সমস্যা হয় না, তবে সঠিক ক্রম প্রয়োজন হলে লক ব্যবহার করুন।

import itertools
from concurrent.futures import ThreadPoolExecutor
import requests

lines = open("proxies.txt").read().split()  # user:pass@ip:port per line
pool = itertools.cycle(lines)

def get(url):
    p = "http://" + next(pool)
    try:
        return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
    except requests.RequestException as e:
        return url, type(e).__name__

urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
    for url, result in ex.map(get, urls):
        print(url, result)

httpx বা aiohttp এর মতো অ্যাসিঙ্ক্রোনাস লাইব্রেরিও ব্যবহার করা যায়?

হ্যাঁ। httpx ক্লায়েন্ট তৈরি করার সময় proxy আর্গুমেন্টে এড্রেস দিলেই হয়, SOCKS5-এর জন্য httpx[socks] ইন্সটল করলে socks5 এড্রেস ব্যবহার করা যায়। অ্যাসিঙ্ক ক্লায়েন্ট AsyncClient-ও একই আর্গুমেন্ট নেয়।

aiohttp প্রতিটি অনুরোধে proxy আর্গুমেন্টে HTTP প্রক্সি ঠিকানা এবং proxy_auth এ aiohttp.BasicAuth পাঠায়। aiohttp ডিফল্টভাবে SOCKS সমর্থন করে না তাই SOCKS5 প্রয়োজন হলে aiohttp-socks প্যাকেজের কানেক্টর ব্যবহার করতে হবে।

অ্যাসিনক্রোনাস মেথড হাজার রিকোয়েস্ট কম রিসোর্সে একসাথে প্রসেস করতে পারে, কিন্তু কনকারেন্ট রিকোয়েস্ট সংখ্যা লিমিট না করলে টার্গেট সাইট এবং প্রক্সিতে একসাথে চাপ পড়ে। asyncio.Semaphore দিয়ে কনকারেন্ট রিকোয়েস্ট সংখ্যা নির্ধারণ করুন।

import httpx

with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
    print(client.get("https://api.ipify.org").text)

ঘন ঘন হওয়া ত্রুটির সমাধান কী?

SOCKS সমর্থনের জন্য প্রয়োজনীয় ডিপেন্ডেন্সি অনুপস্থিত এই ত্রুটির অর্থ হল requests[socks] ইনস্টল করা হয়নি। একই ভার্চুয়াল এনভায়রনমেন্টে আবার ইনস্টল করুন।

407 Proxy Authentication Required এর অর্থ হলো ব্যবহারকারী নাম বা পাসওয়ার্ড ভুল, অথবা IP অথোরাইজেশন ব্যবহার করলে সার্ভার IP নিবন্ধিত হয়নি। পাসওয়ার্ডে বিশেষ অক্ষর থাকলে urllib.parse.quote দিয়ে পরিবর্তন করে নিতে হবে।

সংযোগ সময়সীমা শেষ হওয়া সাধারণত ভুল পোর্ট ব্যবহারের কারণে হয়। HTTP ঠিকানায় HTTP পোর্ট ব্যবহার করেছেন কিনা, এবং socks5h ঠিকানায় SOCKS5 পোর্ট ব্যবহার করেছেন কিনা তা নিশ্চিত করুন। timeout মান অবশ্যই সেট করুন যাতে প্রতিক্রিয়া না পাওয়া অনুরোধ পুরো কাজ বন্ধ করে দেয় না।

  • SOCKS এরর: pip install "requests[socks]"
  • 407: ব্যবহারকারী নাম·পাসওয়ার্ড অথবা নিবন্ধিত IP চেক করুন
  • সময় শেষ: HTTP পোর্ট এবং SOCKS5 পোর্ট পার্থক্য
  • সমস্ত অনুরোধে timeout যোগ করুন
Python requests প্রোক্সি সেটিং, SOCKS5·HTTP সংযোগ | Socks5Proxy