Step-by-step guide on building a custom proxy rotator with Python

ویب سکریپنگ ہو یا ویب سائٹ ٹیسٹنگ، پراکسیز کی ضرورت سے انکار نہیں کیا جا سکتا۔ مگر بلا تعطل رسائی کے لیے آپ کو بہت سے مختلف IP پتوں کی ضرورت پڑتی ہے، اور انہیں دستی طور پر بدلنا عملی حل نہیں۔ یہی کام پراکسی روٹیٹر کرتا ہے۔ اس مضمون میں ہم Python کے ذریعے شروع سے ایک حسب ضرورت پراکسی روٹیٹر بنائیں گے۔ 

ایک اچھا پراکسی روٹیٹر کیوں ضروری ہے؟ 

روٹیٹر خودکار طور پر پراکسی پول میں گردش کرتا ہے اور ہر درخواست پر، یا مقررہ وقفے کے بعد، نیا IP ایڈریس منتخب کرتا ہے۔ یوں ہدف سرور کو تمام requests ایک ہی ماخذ سے آتی ہوئی محسوس نہیں ہوتیں اور ٹریفک مختلف پتوں اور مقامات سے آتی دکھائی دیتی ہے، جس سے اینٹی بوٹ نظام کی توجہ سے بچنے میں مدد ملتی ہے۔ اسی لیے پراکسی روٹیٹر سکریپنگ اور ملٹی اکاؤنٹنگ کا بنیادی جز ہے۔ بڑے پیمانے کے منصوبوں میں یہ مستحکم تصدیقی بہاؤ برقرار رکھنے، سائٹ کی ٹریفک پالیسی کے مطابق کام کرنے اور مخصوص علاقوں کا مواد حاصل کرنے میں مدد دیتا ہے۔ 

پراکسی روٹیٹر کے کچھ اضافی فوائد بھی ہیں۔ IP مسلسل بدلتے رہنے سے رازداری اور گمنامی بہتر ہوتی ہے اور ویب سائٹس یا ٹریکرز کے لیے آپ کی سرگرمی کا پروفائل بنانا مشکل ہو جاتا ہے۔ چونکہ آپ کا اصل پتہ پوشیدہ رہتا ہے، اس لیے مخصوص ڈیوائسز کو نشانہ بنانے والے اسکیمرز کے لیے آپ تک پہنچنا بھی دشوار ہوتا ہے۔ 

بہت سی ویب سائٹس مقام یا ترجیحات کے لحاظ سے مختلف نتائج دکھاتی ہیں۔ متعدد IPs استعمال کرنے سے زیادہ متنوع اور درست ڈیٹا ملتا ہے، اور ضرورت نہ ہو تو یہ ذاتی نوعیت کا مواد دکھائے جانے سے بھی روکتا ہے۔

قابل اعتماد پراکسی روٹیٹر: اس کے اجزاء 

ہر درخواست کے لیے صرف ایک نیا IP استعمال کرنے کے علاوہ، آپ کو کچھ اور خصوصیات بھی شامل کرنی چاہئیں، تاکہ ایک پراکسی روٹیٹر واقعی آپ کو فائدہ پہنچائے اور مسائل کا ذریعہ نہ بنے۔

  • دوبارہ کوشش کی منطق: اگر ایک پراکسی کام نہ کرے تو روٹیٹر دوسری استعمال کرے۔
  • User-Agent ہیڈرز کی گردش، تاکہ requests ایک ہی ماخذ سے آنے والی معلوم نہ ہوں۔
  • “خراب” HTTP اسٹیٹس کوڈز کو ہینڈل کرنا جیسے 403 (“حرام”)، 429 (“بہت زیادہ requests”)، 500 (“داخلی سرور کی خرابی”)؛ 
  • بار بار ناکام ہونے والی پراکسیز کو عارضی طور پر غیر فعال کرنا۔
  • اینٹی بوٹ نظام کو متحرک ہونے سے بچانے کے لیے requests کے درمیان مختصر وقفہ رکھنا؛
  • لاگنگ – تاکہ، دوبارہ کوشش کرنے کی صورت میں، آپ کو اس کی وجہ نظر آئے اور کون سی پراکسی اور User-Agent استعمال کی گئی تھی۔
  • سکریپنگ سے پہلے صحت کی جانچ: آغاز سے پہلے تمام پراکسیز کو آزما کر یقینی بنانا کہ وہ کام کر رہی ہیں۔
  • ناکام پراکسیز کو کچھ وقت کے لیے غیر فعال کرنے والا سرکٹ بریکر؛
  • اسٹکی سیشنز فی میزبان تاکہ ایک سیشن کے اندر، ڈومین وہی IP دیکھے، اگر آپ کو ضرورت ہو (ملٹی اکاؤنٹنگ یا اس کے لیے، جب آپ کو اسی سیشن پر قائم رہنے کی ضرورت ہو)۔

ہم اپنا پراکسی روٹیٹر بناتے وقت ان نکات کو ذہن میں رکھیں گے۔ 

Python سے پراکسی روٹیٹر بنانا

ہم ایک فائل میں ایک پراکسی روٹیٹر بنائیں گے۔ ہماری مثال میں، ہم نے اسے نام دیا proxy_rotator.py. ذیل میں کوڈ کے تمام حصے اور ان کی وضاحت دی گئی ہے۔ آپ انہیں کاپی اور پیسٹ کر سکتے ہیں۔ اسناد جیسا ڈیٹا ہم ہارڈ کوڈ نہیں کریں گے، اس لیے بعد میں کوڈ تبدیل کرنے کی ضرورت نہیں پڑے گی۔ 

آغاز 

  1. اس سے Python انسٹال کریں۔ سرکاری ویب سائٹ (یا اسے اپ گریڈ کریں)۔ آپ کو ورژن 3.8 یا اس سے اوپر کی ضرورت ہے۔ 
  2. انسٹال کرنے کے لیے درج ذیل کمانڈ کو چلائیں۔ requests لائبریری HTTP requests بھیجنے کے لیے درکار ہے۔ 

pip install requests

      
        
      
  1. اپنے پلان کے صفحے سے پراکسیز کی فہرست حاصل کریں۔ آپ انہیں دستی طور پر .txt فائل میں کاپی اور پیسٹ بھی کر سکتے ہیں۔ DataImpulse ڈیش بورڈ سے انہیں ڈاؤن لوڈ کریں۔ ہم نے اپنی فائل کا نام رکھا: proxies.txt. فائل کچھ یوں نظر آنی چاہیے:

http://login:password.host:port
https://login:password.host:port

اگر ضروری ہو تو آپ پراکسی فارمیٹ کو تبدیل کر سکتے ہیں۔ 

امپورٹس اور سیٹ اپ 

سب سے پہلے، وہ ماڈیولز امپورٹ کریں گے جن کی ہمیں ضرورت ہے۔ 


import argparse
import logging
import os
import random
import threading
import time
from dataclasses import dataclass
from typing import Dict, Iterable, List, Optional, Tuple

import requests
from requests import Response

      
        
        
        
        
        
        
        
        
        
        
        
      

درخواست ویب requests بھیجتی ہے، بے ترتیب پراکسی اور ہیڈر چنتا ہے، اور threading متعدد کنکشن تھریڈز سنبھالتی ہے۔ 

ڈیفالٹ ترتیبات 

اگلا حصہ کئی اہم کام کرتا ہے: یہ User-Agent تبدیل کرتا ہے، ایرر کوڈ آنے پر دوسری پراکسی پر سوئچ کرتا ہے اور پراکسی کی دستیابی جانچتا ہے۔ 


DEFAULT_USER_AGENTS: List[str] = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36",
]

DEFAULT_ROTATE_ON_STATUS = {403, 407, 409, 418, 421, 425, 429, 500, 502, 503, 504}
DEFAULT_HEALTHCHECK_URL = "http://api.ipify.org"

      
        
        
        
        
        
        
        
        
        
        
        
      

آپ چاہیں تو User-Agent تبدیل یا شامل کر سکتے ہیں اور صحت کی جانچ کے لیے کوئی دوسری ویب سائٹ منتخب کر سکتے ہیں۔ یہاں ہم استعمال کرتے ہیں httpbin.org/ip. دیگر موزوں اختیارات یہ ہیں: https://httpbin.org/get (درخواست کے ہیڈر کے ساتھ ساتھ IP دکھاتا ہے) https://api.ipify.org (یا https://api.ipify.org?format=json JSON میں اپنے IP کو واپس کرنے کے لیے، https://ifconfig.me یا https://ifconfig.me/all.json (JSON میں ہیڈرز + IP واپس کرتا ہے)، یا http://ip-api.com/json/ (ملک، شہر، ISP، اور IP دکھاتا ہے)۔ 

پراکسی آبجیکٹ 

یہ حصہ اس بات کی وضاحت کرتا ہے کہ پراکسی کیسے محفوظ کی جاتی ہیں۔


@dataclass(frozen=True)
class Proxy:
    url: str
    label: str = ""
    def to_requests_proxies(self) -> Dict[str, str]:
        return {"http": self.url, "https": self.url}

      
        
        
        
        
        
        
      

یہاں بھی آپ کو کچھ تبدیل کرنے کی ضرورت نہیں۔ 

پراکسی فائل پڑھنا 

یہ حصہ ایک سے پراکسی پڑھتا ہے۔ .txt فائل 


def parse_proxy_file(path: str) -> List[Proxy]:
    proxies: List[Proxy] = []
    with open(path, "r", encoding="utf-8") as f:
        for line in f:
            raw = line.strip()
            if not raw or raw.startswith("#"):
                continue
            raw = raw.split(" #", 1)[0].split("\t#", 1)[0].strip()
            proxies.append(Proxy(url=raw))
    if not proxies:
        raise ValueError(f"No proxies found in file: {path}")
    return proxies

      
        
        
        
        
        
        
        
        
        
        
        
        
      

دوبارہ کوشش کا وقفہ 

یہ حصہ دوبارہ کوشش کی منطق متعین کرتا ہے۔ درخواست ناکام ہونے پر روٹیٹر اگلی کوشش سے پہلے زیادہ انتظار کرتا ہے، جس سے تھروٹلنگ اور سروس لاک آؤٹ سے بچنے میں مدد ملتی ہے۔


def _exp_backoff_sleep(base: float, attempt: int, max_sleep: float) -> None:
    sleep_s = min(base * (2 ** attempt) + random.random() * base, max_sleep)
    time.sleep(sleep_s)

      
        
        
        
      

پراکسی روٹیٹر کلاس 

آپ کے گھومنے والے کا دل۔ یہ ایک پراکسی چنتا ہے، requests کو دوبارہ آزماتا ہے، اور ناکامیوں کو ٹریک کرتا ہے۔ یہ ایک حکمت عملی کا بھی فیصلہ کرتا ہے – چاہے پراکسی کو تصادفی طور پر استعمال کیا جائے یا فہرست میں چکر لگانا، ٹائم آؤٹ اور ہیڈر سیٹ کرتا ہے، اور ویب سائٹ کے لیے وہی پراکسی استعمال کرتا ہے۔ یہ requests بھیجتا ہے، پراکسیوں کو وائٹ لسٹ یا بلاک شدہ کے بطور نشان زد کرتا ہے، اور صحت کی جانچ کرتا ہے۔ 


class ProxyRotator:
    def __init__(
        self,
        proxies: Iterable[Proxy],
        strategy: str = "round_robin",  
        max_retries: int = 3,
        timeout: Tuple[float, float] = (10.0, 30.0),
        rotate_on_status: Optional[Iterable[int]] = None,
        user_agents: Optional[List[str]] = None,
        sticky_per_host: bool = True,
        circuit_threshold: int = 2, 
        circuit_cooldown: float = 60.0,  
        backoff_base: float = 0.5,
        backoff_max: float = 5.0,
        healthcheck_url: Optional[str] = None,
        logger: Optional[logging.Logger] = None,
    ) -> None:
        self.proxies: List[Proxy] = list(proxies)
        if not self.proxies:
            raise ValueError("ProxyRotator requires at least one proxy")
        if strategy not in {"round_robin", "random"}:
            raise ValueError("strategy must be 'round_robin' or 'random'")
        self.strategy = strategy

        self.max_retries = max_retries
        self.timeout = timeout
        self.rotate_on_status = set(rotate_on_status or DEFAULT_ROTATE_ON_STATUS)
        self.user_agents = user_agents or DEFAULT_USER_AGENTS
        self.sticky_per_host = sticky_per_host

        self.circuit_threshold = circuit_threshold
        self.circuit_cooldown = circuit_cooldown
        self.failure_counts: Dict[Proxy, int] = {p: 0 for p in self.proxies}
        self.disabled_until: Dict[Proxy, float] = {p: 0.0 for p in self.proxies}

        self.backoff_base = backoff_base
        self.backoff_max = backoff_max

        self.healthcheck_url = healthcheck_url

        self._local = threading.local()

        self._sticky_map: Dict[str, Proxy] = {}

        self._idx = 0

        self._lock = threading.Lock()

        self.log = logger or logging.getLogger("proxy_rotator")

    def get(self, url: str, **kwargs) -> Response:
        return self.request("GET", url, **kwargs)

    def post(self, url: str, **kwargs) -> Response:
        return self.request("POST", url, **kwargs)

    def request(self, method: str, url: str, **kwargs) -> Response:
        session = getattr(self._local, "session", None)
        if session is None:
            session = requests.Session()
            self._local.session = session

        headers = kwargs.pop("headers", {}) or {}
        headers.setdefault("User-Agent", random.choice(self.user_agents))

        timeout = kwargs.pop("timeout", self.timeout)

        last_exc: Optional[Exception] = None
        last_response: Optional[Response] = None

        for attempt in range(self.max_retries + 1):
            proxy = self._choose_proxy(url)
            if proxy is None:
                raise RuntimeError("No healthy proxies currently available")

            try:
                self.log.debug("Using proxy %s for %s %s", proxy.url, method, url)
                response = session.request(
                    method,
                    url,
                    headers=headers,
                    proxies=proxy.to_requests_proxies(),
                    timeout=timeout,
                    **kwargs,
                )

                last_response = response
                if response.status_code in self.rotate_on_status:
                    self._mark_failure(proxy, f"HTTP {response.status_code}")
                    self._maybe_unstick_host(url, proxy)
                    if attempt < self.max_retries:
                        _exp_backoff_sleep(self.backoff_base, attempt, self.backoff_max)
                        continue
                else:
                    self._mark_success(proxy)
                return response

            except requests.RequestException as exc:  
                last_exc = exc
                self._mark_failure(proxy, repr(exc))
                self._maybe_unstick_host(url, proxy)
                if attempt < self.max_retries:
                    _exp_backoff_sleep(self.backoff_base, attempt, self.backoff_max)
                    continue
                break

        if last_exc:
            raise last_exc
        assert last_response is not None 
        return last_response

    def health_check(self, url: Optional[str] = None, sample: Optional[int] = None) -> Dict[str, bool]:
        check_url = url or self.healthcheck_url or DEFAULT_HEALTHCHECK_URL
        to_test = list(self.proxies)
        if sample is not None:
            to_test = random.sample(to_test, k=min(sample, len(to_test)))

        results: Dict[str, bool] = {}
        for p in to_test:
            try:
                r = requests.get(check_url, proxies=p.to_requests_proxies(), timeout=(5, 10))
                healthy = r.ok
            except Exception:
                healthy = False
            results[p.url] = healthy
            if healthy:
                self._mark_success(p)
            else:
                self._mark_failure(p, "healthcheck")
        return results

    def _choose_proxy(self, url: str) -> Optional[Proxy]:
        host = requests.utils.urlparse(url).hostname or ""
        now = time.time()

        with self._lock:
            if self.sticky_per_host:
                sticky = self._sticky_map.get(host)
                if sticky and self.disabled_until.get(sticky, 0.0) <= now:
                    return sticky

            enabled = [p for p in self.proxies if self.disabled_until.get(p, 0.0) <= now]
            if not enabled:
                return None

            if self.strategy == "round_robin":
                proxy = enabled[self._idx % len(enabled)]
                self._idx = (self._idx + 1) % len(enabled)
            else:  
                proxy = random.choice(enabled)

            if self.sticky_per_host:
                self._sticky_map[host] = proxy
            return proxy

    def _mark_failure(self, proxy: Proxy, reason: str) -> None:
        with self._lock:
            cnt = self.failure_counts.get(proxy, 0) + 1
            self.failure_counts[proxy] = cnt
            if cnt >= self.circuit_threshold:
                self.disabled_until[proxy] = time.time() + self.circuit_cooldown
                self.log.warning("Disabling proxy %s for %.1fs (reason: %s)", proxy.url, self.circuit_cooldown, reason)

    def _mark_success(self, proxy: Proxy) -> None:
        with self._lock:
            self.failure_counts[proxy] = 0
            self.disabled_until[proxy] = 0.0

    def _maybe_unstick_host(self, url: str, proxy: Proxy) -> None:
        if not self.sticky_per_host:
            return
        host = requests.utils.urlparse(url).hostname or ""
        with self._lock:
            if self._sticky_map.get(host) == proxy:
                self._sticky_map.pop(host, None)

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
         
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

کمانڈ لائن آپشنز

ٹرمینل سے ایک سطری کمانڈ کے ذریعے روٹیٹر چلانے کے لیے یہ حصہ ضروری ہے۔


def build_arg_parser() -> argparse.ArgumentParser:
    p = argparse.ArgumentParser(description="HTTP proxy rotator")
    p.add_argument("--url", required=False, help="Target URL to request (for quick testing)")
    p.add_argument("--method", default="GET", help="HTTP method to use (default: GET)")
    p.add_argument(
        "--proxies",
        help="Path to proxies.txt file (one proxy URL per line). If omitted, reads PROXY_LIST env (comma-separated)",
    )
    p.add_argument("--strategy", choices=["round_robin", "random"], default="round_robin")
    p.add_argument("--retries", type=int, default=3, help="Max retry attempts across proxies")
    p.add_argument(
        "--timeout",
        type=float,
        default=15.0,
        help="Read timeout in seconds (connect timeout is fixed at 10s in this simple CLI)",
    )
    p.add_argument(
        "--rotate-on",
        default=",".join(str(s) for s in sorted(DEFAULT_ROTATE_ON_STATUS)),
        help="Comma-separated status codes that trigger rotation",
    )
    p.add_argument(
        "--no-sticky",
        action="store_true",
        help="Disable sticky-per-host behavior",
    )
    p.add_argument(
        "--healthcheck",
        action="store_true",
        help="Run a healthcheck across proxies and print a summary before the request",
    )
    p.add_argument(
        "--debug",
        action="store_true",
        help="Enable verbose logging",
    )
    return p


def _load_proxies_from_args(args: argparse.Namespace) -> List[Proxy]:
    if args.proxies:
        return parse_proxy_file(args.proxies)
    env = os.getenv("PROXY_LIST", "").strip()
    if env:
        return [Proxy(url=p.strip()) for p in env.split(",") if p.strip()]
    raise SystemExit("No proxies provided. Use --proxies or set PROXY_LIST env.")


def main_cli() -> None:
    parser = build_arg_parser()
    args = parser.parse_args()

    logging.basicConfig(
        level=logging.DEBUG if args.debug else logging.INFO,
        format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
    )
    log = logging.getLogger("proxy_rotator")

    proxies = _load_proxies_from_args(args)

    rotate_on_set = {int(x.strip()) for x in args.rotate_on.split(",") if x.strip()}

    rotator = ProxyRotator(
        proxies=proxies,
        strategy=args.strategy,
        max_retries=args.retries,
        timeout=(10.0, args.timeout),
        rotate_on_status=rotate_on_set,
        user_agents=DEFAULT_USER_AGENTS,
        sticky_per_host=not args.no_sticky,
        circuit_threshold=2,
        circuit_cooldown=60.0,
        backoff_base=0.5,
        backoff_max=5.0,
        healthcheck_url=DEFAULT_HEALTHCHECK_URL,
        logger=log,
    )

    if args.healthcheck:
        results = rotator.health_check()
        total = len(results)
        healthy = sum(1 for ok in results.values() if ok)
        log.info("Healthcheck: %s/%s proxies OK", healthy, total)
        for url, ok in results.items():
            log.info("  %-40s %s", url, "OK" if ok else "BAD")

    if args.url:
        try:
            resp = rotator.request(args.method.upper(), args.url)
            print(f"Status: {resp.status_code}")
            text = resp.text
            preview = text[:500].replace("\n", " ")
            print(f"Body preview (first 500 chars):\n{preview}")
        except Exception as e:
            log.error("Request failed: %s", e)
            raise
    else:
        log.info("No --url provided; nothing else to do. Add --url to test a request.")

      
        
 
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

انٹری پوائنٹ

یہ حصہ روٹیٹر شروع کرتا ہے۔ یہ پراکسیز لوڈ کرتا ہے، ضرورت ہو تو انہیں چیک کرتا ہے اور requests بھیجتا ہے۔ 


if __name__ == "__main__":
    main_cli()

      
        
        
      

پراکسی روٹیٹر چلانا 

آپ درج ذیل کمانڈ سے کمانڈ لائن پر روٹیٹر چلا سکتے ہیں۔


python proxy_rotator.py --proxies ./proxies.txt --url http://api.ipify.org

      
        
      

بدلیں ./proxies.txt کو اپنی پراکسی فائل کے اصل نام سے، اور – – URL کو اس ویب سائٹ کے ہدف URL سے جسے آپ سکریپ یا ٹیسٹ کرنا چاہتے ہیں۔ 

اس کے علاوہ، آپ یہ فلیگز شامل کر سکتے ہیں:

– – بے ترتیب حکمت عملی  – تاکہ روٹیٹر پول سے بے ترتیب پراکسی منتخب کرے۔

– – دوبارہ کوششیں 5 – ضرورت ہو تو دوبارہ کوششوں کی تعداد تبدیل کی جا سکتی ہے۔

– – صحت کی جانچ – پراکسیز کی پیشگی جانچ

– – کوئی چپچپا نہیں۔ – اسٹکی پراکسی کو غیر فعال کرنے کے لیے۔ اسے صرف تب استعمال کریں جب ایک ہی سیشن برقرار رکھنا ضروری نہ ہو۔

— ڈیبگ – یہ تفصیلی لاگز دکھاتا ہے، جو خرابی دور کرنے میں مدد دیتے ہیں۔ 

نوٹ: کبھی کبھیاگر آپ کے پاس Python 3 انسٹال ہے، تو آپ کو “python3 proxy_rotator.py” استعمال کرنے کی ضرورت پڑ سکتی ہے-پراکسی ./proxies.txt-url http://api.ipify.org“کی کمانڈ استعمال کرنا پڑ سکتی ہے۔

نتیجہ 

پراکسی روٹیٹر بنانا نہ طویل کام ہے نہ بہت مشکل، مگر اس سے آپ پراکسی پول کا بہتر استعمال کر سکتے ہیں۔ دوبارہ کوشش کی منطق، صحت کی جانچ اور وقفوں والا اچھا روٹیٹر، قابل اعتماد پراکسیز کے ساتھ مل کر، ویب سکریپنگ یا ملٹی اکاؤنٹنگ کو زیادہ مضبوط بناتا ہے۔ قابل اعتماد اور اخلاقی طور پر حاصل کیے گئے IPs کے لیے DataImpulse مدد کر سکتا ہے۔ ہمارے ذریعے آپ 195 مقامات کے 90 ملین سے زیادہ IPs حاصل کر کے بلا تعطل، مختلف خطوں پر مشتمل کنکشن برقرار رکھ سکتے ہیں۔ ہم سے رابطہ کریں: [email protected] یا دبائیں “ابھی کوشش کریں” بٹن دبا کر آغاز کریں۔ 

Share article: