بازگشت به وبلاگ

راهنمای کامل تشخیص و حل مشکل بن شدن مداوم پروکسی

دلایل مسدود شدن پروکسی را بررسی می‌کنیم و راه‌حل‌های عملی ارائه می‌دهیم: از چرخش صحیح تا تنظیم اثر انگشت مرورگر.

📅۲۴ آذر ۱۴۰۴

اگر پروکسی دائماً مسدود شود: راهنمای کامل تشخیص و حل مسئله

مسدودیت مکرر پروکسی یکی از رایج‌ترین مشکلات در تجزیه‌گری، خودکارسازی و کار با چندین حساب است. در این مقاله بررسی می‌کنیم که چرا این اتفاق می‌افتد و چگونه می‌توانیم مسئله را به‌طور سیستماتیک حل کنیم، نه اینکه بی‌نهایت فروشندگان را تغییر دهیم.

چرا واقعاً پروکسی مسدود می‌شود

قبل از اینکه راه‌حل را جستجو کنیم، باید مکانیزم مسدودیت را بفهمیم. سیستم‌های ضد تقلب مدرن از حفاظت چند‌سطحی استفاده می‌کنند و مسدودیت پروکسی تنها نتیجه است، نه علت. درک نحوه کار این سیستم‌ها به ما کمک می‌کند تا استراتژی موثری برای دور زدن آن‌ها بسازیم.

سمعه IP و لیست‌های سیاه

هر آدرس IP دارای سمعه‌ای است که بر اساس تاریخچه استفاده آن شکل می‌گیرد. اگر یک آدرس قبلاً برای اسپم، حملات DDoS یا تجزیه‌گری انبوه استفاده شده باشد، در پایگاه‌های داده‌ای مثل Spamhaus، SORBS یا لیست‌های اختصاصی سرویس‌ها قرار می‌گیرد. وقتی از طریق چنین IP‌ای متصل می‌شوید، سیستم بلافاصله با شک به شما نگاه می‌کند.

پروکسی‌های مرکز داده به‌ویژه در معرض این مشکل هستند. کل زیرشبکه‌ها می‌توانند به‌عنوان «میزبانی» علامت‌گذاری شوند و هر ترافیکی از آن‌ها به‌طور خودکار سطح بالاتری از بررسی را دریافت می‌کند. Amazon AWS، Google Cloud، DigitalOcean — دامنه IP آن‌ها خوب شناخته شده و اغلب به‌طور پیشگیرانه مسدود می‌شوند.

می‌توانید سمعه IP را از طریق سرویس‌هایی مثل IPQualityScore، Scamalytics یا AbuseIPDB بررسی کنید. اگر پروکسی شما fraud score بالاتر از 75 نشان دهد، مشکل دقیقاً این است — فروشنده یا نوع پروکسی را تغییر دهید.

الگوهای درخواست

انسان 100 درخواست را در ثانیه انجام نمی‌دهد. انسان صفحات را با دقت 2 ثانیه‌ای نمی‌پیمایند. انسان تصاویر، CSS و JavaScript را نادیده نمی‌گیرد و فقط HTML را درخواست نمی‌کند. سیستم‌های ضد تقلب دقیقاً این الگوها را تجزیه می‌کنند و هر انحرافی از رفتار «انسانی» خطر مسدودیت را افزایش می‌دهد.

آمار زمان بین درخواست‌ها به‌خصوص نشان‌دهنده است. اگر فاصله ثابتی بین درخواست‌ها وجود داشته باشد، این علامت واضحی از خودکارسازی است. اضافه کردن تاخیر تصادفی (مثلاً 1 تا 5 ثانیه) احتمال تشخیص را به‌میزان قابل‌توجهی کاهش می‌دهد.

عدم تطابق فراداده

وقتی User-Agent شما می‌گوید که از Chrome روی Windows استفاده می‌کنید، اما سرصحت‌های HTTP مشخصات Python requests را فاش می‌کنند — این یک پرچم قرمز است. وقتی آدرس IP در آلمان جغرافیایی شود، اما تنظیمات زبان مرورگر روسی را نشان دهد — پرچم قرمز دیگری. وقتی منطقه زمانی در JavaScript با جغرافیای IP مطابقت نداشته باشد — پرچم سوم.

تجمع چنین عدم‌تطابق‌هایی باعث می‌شود که سیستم اتصال را مشکوک طبقه‌بندی کند و اقدامات حفاظتی را اعمال کند: از captcha تا مسدودیت کامل IP.

اثر انگشت مرورگر

سیستم‌های حفاظت مدرن دهها پارامتر مرورگر را جمع‌آوری می‌کنند: وضوح صفحه، فونت‌های نصب‌شده، افزونه‌ها، رندرینگ WebGL، متن صوتی و بسیاری موارد دیگر. مجموعه این پارامترها یک «اثر انگشت» منحصر به فرد ایجاد می‌کند که حتی با تغییر IP ثابت می‌ماند.

اگر پروکسی را تغییر دهید اما اثر انگشت یکسان بماند، سیستم می‌فهمد که همان کاربر است. و اگر یک اثر انگشت با صدها IP متفاوت در مدت کوتاهی ظاهر شود — این علامت واضحی از خودکارسازی است.

تشخیص: چگونه دلیل مسدودیت را بفهمیم

قبل از اینکه تنظیمات را بی‌دلیل تغییر دهیم، تشخیص را انجام دهید. این ساعت‌ها آزمایش را صرفه‌جویی می‌کند و به یافتن دلیل واقعی مشکل کمک می‌کند. رویکرد سیستماتیک به تشخیص کلید حل موثر است.

مرحله 1: خود پروکسی را بررسی کنید

با بررسی اساسی عملکرد پروکسی شروع کنید، مستقل از اسکریپت اصلی شما:

import requests

proxy = {
    "http": "http://user:pass@proxy-server:port",
    "https": "http://user:pass@proxy-server:port"
}

# بررسی عملکرد اساسی
try:
    response = requests.get("https://httpbin.org/ip", proxies=proxy, timeout=10)
    print(f"IP از طریق پروکسی: {response.json()['origin']}")
except Exception as e:
    print(f"خطا در اتصال: {e}")

# بررسی نشت IP واقعی
response = requests.get("https://browserleaks.com/ip", proxies=proxy)
# با IP واقعی خود مقایسه کنید

اگر پروکسی حتی در درخواست‌های ساده کار نکند — مشکل در خود پروکسی یا اعتبارات است. صحت فرمت اتصال، موجودی حساب و محدودیت‌های فروشنده را بررسی کنید.

مرحله 2: سمعه IP را بررسی کنید

برای ارزیابی جامع از چندین سرویس استفاده کنید:

# IP پروکسی را دریافت کنید
proxy_ip = requests.get("https://api.ipify.org", proxies=proxy).text

# در این سرویس‌ها بررسی کنید:
# https://www.ipqualityscore.com/free-ip-lookup-proxy-vpn-test
# https://scamalytics.com/ip/{proxy_ip}
# https://www.abuseipdb.com/check/{proxy_ip}
# https://whatismyipaddress.com/ip/{proxy_ip}

print(f"IP {proxy_ip} را در سرویس‌های بالا بررسی کنید")

به شاخص‌های زیر توجه کنید: fraud score (باید کمتر از 50 باشد)، نوع IP (residential بهتر از datacenter است)، وجود در لیست‌های سیاه. اگر IP به‌عنوان VPN/Proxy علامت‌گذاری شده باشد — بسیاری از وب‌سایت‌ها از ابتدا با شک به آن نگاه خواهند کرد.

مرحله 3: مسئله را جدا کنید

همان پروکسی را روی وب‌سایت‌های هدف مختلف امتحان کنید. اگر مسدودیت در همه جا اتفاق بیفتد — مشکل در پروکسی یا تنظیمات شما است. اگر فقط در وب‌سایت خاصی — مشکل در حفاظت آن وب‌سایت یا رفتار شما روی آن است.

همچنین پروکسی‌های مختلف را روی یک وب‌سایت امتحان کنید. اگر همه مسدود شوند — مشکل در پروکسی نیست، بلکه در اسکریپت، اثر انگشت یا الگوی رفتار شما است. این تست بسیار مهم است که بسیاری آن را نادیده می‌گیرند.

مرحله 4: تجزیه پاسخ‌های سرور

انواع مختلف مسدودیت به‌طور متفاوتی ظاهر می‌شوند. یاد بگیرید آن‌ها را تشخیص دهید:

def analyze_response(response):
    status = response.status_code
    
    if status == 403:
        print("دسترسی ممنوع — احتمالاً IP در لیست سیاه است")
    elif status == 429:
        print("درخواست‌های بیش‌ازحد — فرکانس را کاهش دهید")
    elif status == 503:
        print("سرویس در دسترس نیست — احتمالاً حفاظت DDoS")
    elif status == 407:
        print("نیاز به احراز هویت پروکسی — اعتبارات را بررسی کنید")
    elif "captcha" in response.text.lower():
        print("Captcha شناسایی شد — مشکوک به ربات")
    elif "blocked" in response.text.lower():
        print("مسدودیت واضح — IP را تغییر دهید و رویکرد را بازنگری کنید")
    elif len(response.text) < 1000:
        print("پاسخ مشکوک‌کننده کوتاه — احتمالاً جعلی")
    else:
        print(f"وضعیت {status}، طول پاسخ: {len(response.text)}")

چرخش صحیح: فرکانس، منطق، پیاده‌سازی

چرخش پروکسی صرفاً «تغییر IP بیشتر» نیست. چرخش نادرست می‌تواند بیشتر از عدم وجود آن آسیب برساند. بیایید استراتژی‌های مختلف و زمان استفاده از آن‌ها را بررسی کنیم.

استراتژی 1: چرخش بر اساس تعداد درخواست‌ها

ساده‌ترین رویکرد — تغییر IP پس از تعداد معینی از درخواست‌ها. برای تجزیه‌گری مناسب است که نیاز به جلسه نیست:

import random

class ProxyRotator:
    def __init__(self, proxy_list, requests_per_proxy=50):
        self.proxies = proxy_list
        self.requests_per_proxy = requests_per_proxy
        self.current_proxy = None
        self.request_count = 0
    
    def get_proxy(self):
        if self.current_proxy is None or self.request_count >= self.requests_per_proxy:
            # تصادفی‌سازی تعداد درخواست‌ها
            self.requests_per_proxy = random.randint(30, 70)
            self.current_proxy = random.choice(self.proxies)
            self.request_count = 0
        
        self.request_count += 1
        return self.current_proxy

# استفاده
rotator = ProxyRotator(proxy_list)
for url in urls_to_scrape:
    proxy = rotator.get_proxy()
    response = requests.get(url, proxies={"http": proxy, "https": proxy})

توجه کنید به تصادفی‌سازی در تعداد درخواست‌ها روی پروکسی. عدد ثابت (مثلاً دقیقاً 50) یک الگو است که می‌تواند شناسایی شود. دامنه تصادفی رفتار را کمتر قابل‌پیش‌بینی می‌کند.

استراتژی 2: چرخش بر اساس زمان

برای کارهایی که جلسه مهم است (مثلاً کار با حساب‌ها)، بهتر است IP را به زمان متصل کنید:

import time
import random

class TimeBasedRotator:
    def __init__(self, proxy_list, min_minutes=10, max_minutes=30):
        self.proxies = proxy_list
        self.min_seconds = min_minutes * 60
        self.max_seconds = max_minutes * 60
        self.current_proxy = None
        self.rotation_time = 0
    
    def get_proxy(self):
        current_time = time.time()
        
        if self.current_proxy is None or current_time >= self.rotation_time:
            self.current_proxy = random.choice(self.proxies)
            # فاصله تصادفی تا چرخش بعدی
            interval = random.randint(self.min_seconds, self.max_seconds)
            self.rotation_time = current_time + interval
            print(f"پروکسی جدید، چرخش بعدی در {interval//60} دقیقه")
        
        return self.current_proxy

استراتژی 3: جلسات چسبناک برای حساب‌ها

هنگام کار با چندین حساب، بسیار مهم است که هر حساب از IP ثابت استفاده کند. تغییر IP برای حساب وارد شده — راه مطمئن برای بان است:

class AccountProxyManager:
    def __init__(self, proxy_pool):
        self.proxy_pool = proxy_pool
        self.account_proxies = {}  # account_id -> proxy
        self.used_proxies = set()
    
    def get_proxy_for_account(self, account_id):
        # اگر پروکسی برای حساب تخصیص داده شده — آن را برگردانید
        if account_id in self.account_proxies:
            return self.account_proxies[account_id]
        
        # پروکسی آزاد را پیدا کنید
        available = [p for p in self.proxy_pool if p not in self.used_proxies]
        
        if not available:
            raise Exception("پروکسی آزادی برای حساب‌های جدید وجود ندارد")
        
        proxy = random.choice(available)
        self.account_proxies[account_id] = proxy
        self.used_proxies.add(proxy)
        
        return proxy
    
    def release_account(self, account_id):
        """پروکسی را هنگام حذف حساب آزاد کنید"""
        if account_id in self.account_proxies:
            proxy = self.account_proxies.pop(account_id)
            self.used_proxies.discard(proxy)

# استفاده
manager = AccountProxyManager(residential_proxy_list)

for account in accounts:
    proxy = manager.get_proxy_for_account(account.id)
    # تمام اقدامات این حساب از طریق یک IP

استراتژی 4: چرخش تطبیقی

رویکرد پیشرفته‌ترین — تغییر پروکسی در پاسخ به سیگنال‌های وب‌سایت هدف:

class AdaptiveRotator:
    def __init__(self, proxy_list):
        self.proxies = proxy_list
        self.current_proxy = random.choice(proxy_list)
        self.proxy_scores = {p: 100 for p in proxy_list}  # «سلامت» اولیه پروکسی
    
    def get_proxy(self):
        return self.current_proxy
    
    def report_result(self, success, response_code=200):
        """بعد از هر درخواست فراخوانی می‌شود"""
        if success and response_code == 200:
            # درخواست موفق — امتیاز را کمی افزایش دهید
            self.proxy_scores[self.current_proxy] = min(100, 
                self.proxy_scores[self.current_proxy] + 1)
        elif response_code == 429:
            # محدودیت نرخ — امتیاز را کاهش دهید و چرخش کنید
            self.proxy_scores[self.current_proxy] -= 30
            self._rotate()
        elif response_code == 403:
            # بان — امتیاز را صفر کنید و چرخش کنید
            self.proxy_scores[self.current_proxy] = 0
            self._rotate()
        elif response_code == 503:
            # احتمالاً حفاظت — امتیاز را کاهش دهید و چرخش کنید
            self.proxy_scores[self.current_proxy] -= 20
            self._rotate()
    
    def _rotate(self):
        # پروکسی با بهترین امتیاز را انتخاب کنید
        available = [(p, s) for p, s in self.proxy_scores.items() if s > 20]
        if not available:
            # تمام پروکسی‌ها «کشته» شده‌اند — امتیازات را بازنشانی کنید
            self.proxy_scores = {p: 50 for p in self.proxies}
            available = list(self.proxy_scores.items())
        
        # انتخاب وزن‌دار بر اساس امتیاز
        self.current_proxy = max(available, key=lambda x: x[1])[0]
        print(f"چرخش به پروکسی با امتیاز {self.proxy_scores[self.current_proxy]}")

اثر انگشت مرورگر و نقش آن در مسدودیت‌ها

Fingerprint مجموعه‌ای از ویژگی‌های مرورگر است که امکان شناسایی کاربر را حتی بدون cookies فراهم می‌کند. اگر IP را تغییر دهید اما اثر انگشت یکسان بماند، سیستم حفاظت به‌آسانی تمام جلسات شما را به هم متصل می‌کند.

اثر انگشت از چه تشکیل شده است

اثر انگشت مدرن دهها پارامتر را شامل می‌شود. در اینجا دسته‌های اصلی آمده‌اند:

دسته پارامترها وزن در شناسایی
User-Agent مرورگر، نسخه، سیستم‌عامل متوسط
صفحه نمایش وضوح، عمق رنگ، نسبت پیکسل متوسط
فونت‌ها فهرست فونت‌های نصب‌شده بالا
WebGL Renderer، vendor، هش رندرینگ بسیار بالا
Canvas هش تصویر رسم‌شده بسیار بالا
صوت AudioContext fingerprint بالا
منطقه زمانی منطقه زمانی، offset متوسط
زبان‌ها navigator.languages متوسط
افزونه‌ها navigator.plugins پایین (در مرورگرهای مدرن)

سازگاری اثر انگشت و IP

بسیار مهم است که اثر انگشت با جغرافیای IP مطابقت داشته باشد. اگر پروکسی در آلمان باشد، اثر انگشت باید مثل کاربر آلمانی باشد:

// مثال عدم‌سازگاری (بد):
// IP: آلمان
// منطقه زمانی: America/New_York
// زبان‌ها: ["ru-RU", "ru"]
// این مشکوک خواهد شد

// اثر انگشت سازگار (خوب):
// IP: آلمان
// منطقه زمانی: Europe/Berlin
// زبان‌ها: ["de-DE", "de", "en-US", "en"]

ابزارهای مدیریت اثر انگشت

برای کار جدی از ابزارهای تخصصی استفاده کنید:

Playwright با Stealth:

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={"server": "http://proxy:port", "username": "user", "password": "pass"}
    )
    
    context = browser.new_context(
        viewport={"width": 1920, "height": 1080},
        locale="de-DE",
        timezone_id="Europe/Berlin",
        geolocation={"latitude": 52.52, "longitude": 13.405},
        permissions=["geolocation"]
    )
    
    page = context.new_page()
    stealth_sync(page)  # اعمال پچ‌های stealth
    
    page.goto("https://target-site.com")

Puppeteer با puppeteer-extra:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch({
    args: [`--proxy-server=http://proxy:port`]
});

const page = await browser.newPage();

// منطقه زمانی را بازنویسی کنید
await page.evaluateOnNewDocument(() => {
    Object.defineProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', {
        value: function() {
            return { timeZone: 'Europe/Berlin' };
        }
    });
});

مرورگرهای ضد‌تشخیص

برای کار با حساب‌ها اغلب از مرورگرهای ضد‌تشخیص (Multilogin، GoLogin، Dolphin Anty و دیگران) استفاده می‌شود. آن‌ها امکان ایجاد پروفایل‌های جدا شده با اثر انگشت منحصر به فرد را فراهم می‌کنند. هر پروفایل مجموعه‌ای از پارامترها، cookies، localStorage — محیط کاملاً جدا شده‌ای دارد.

مزیت مرورگرهای ضد‌تشخیص — آن‌ها مسئله اثر انگشت را «از جعبه» حل می‌کنند. معایب — هزینه و پیچیدگی خودکارسازی (اگرچه بسیاری API دارند).

الگوهای رفتاری: چگونه مثل ربات نباشیم

حتی با اثر انگشت ایده‌آل و IP تمیز می‌توانید به دلیل رفتار غیرانسانی بان شوید. سیستم‌های مدرن نه تنها پارامترهای فنی، بلکه الگوهای تعامل با وب‌سایت را نیز تجزیه می‌کنند.

تاخیرهای زمانی

انسان درخواست‌ها را با فاصله ثابت انجام نمی‌دهد. تاخیرهای تصادفی با توزیع نرمال اضافه کنید:

import random
import time
import numpy as np

def human_delay(min_sec=1, max_sec=5, mean=2.5):
    """
    تاخیری شبیه به انسان ایجاد می‌کند.
    از توزیع لگ‌نرمال استفاده می‌کند — 
    اکثر تاخیرها کوتاه هستند، اما گاهی طولانی‌اند.
    """
    delay = np.random.lognormal(mean=np.log(mean), sigma=0.5)
    delay = max(min_sec, min(max_sec, delay))
    return delay

def human_typing_delay():
    """تاخیر بین فشار کلیدها هنگام تایپ"""
    return random.uniform(0.05, 0.25)

# استفاده
for url in urls:
    response = requests.get(url, proxies=proxy)
    process(response)
    time.sleep(human_delay())  # تاخیر تصادفی بین درخواست‌ها

تقلید ناوبری

انسان مستقیم به صفحه محصول نمی‌رود. او به صفحه اصلی می‌رود، از جستجو استفاده می‌کند، دسته‌ها را مرور می‌کند. این مسیر را تقلید کنید:

async def human_like_navigation(page, target_url):
    """ناوبری انسان‌مانند به صفحه هدف را تقلید می‌کند"""
    
    # 1. به صفحه اصلی می‌رویم
    await page.goto("https://example.com")
    await page.wait_for_timeout(random.randint(2000, 4000))
    
    # 2. گاهی صفحه اصلی را اسکرول می‌کنیم
    if random.random() > 0.5:
        await page.evaluate("window.scrollBy(0, 300)")
        await page.wait_for_timeout(random.randint(1000, 2000))
    
    # 3. از جستجو یا ناوبری استفاده می‌کنیم
    if random.random() > 0.3:
        search_box = await page.query_selector('input[type="search"]')
        if search_box:
            await search_box.type("search query", delay=100)
            await page.keyboard.press("Enter")
            await page.wait_for_timeout(random.randint(2000, 4000))
    
    # 4. به صفحه هدف می‌رویم
    await page.goto(target_url)
    
    # 5. صفحه را مثل انسان اسکرول می‌کنیم
    await human_scroll(page)

async def human_scroll(page):
    """اسکرول انسان‌مانند را تقلید می‌کند"""
    scroll_height = await page.evaluate("document.body.scrollHeight")
    current_position = 0
    
    while current_position < scroll_height * 0.7:  # تا انتها نه
        scroll_amount = random.randint(200, 500)
        await page.evaluate(f"window.scrollBy(0, {scroll_amount})")
        current_position += scroll_amount
        await page.wait_for_timeout(random.randint(500, 1500))

حرکات موس

برخی سیستم‌ها حرکات موس را ردیابی می‌کنند. حرکت مستقیم از نقطه A به B — علامت ربات است. انسان موس را با منحنی و تصحیح‌های میکرو حرکت می‌دهد:

import bezier
import numpy as np

def generate_human_mouse_path(start, end, num_points=50):
    """
    مسیر موس شبیه به انسان ایجاد می‌کند،
    با استفاده از منحنی‌های بزیه و نویز کوچک.
    """
    # نقاط کنترل برای منحنی بزیه
    control1 = (
        start[0] + (end[0] - start[0]) * random.uniform(0.2, 0.4) + random.randint(-50, 50),
        start[1] + (end[1] - start[1]) * random.uniform(0.2, 0.4) + random.randint(-50, 50)
    )
    control2 = (
        start[0] + (end[0] - start[0]) * random.uniform(0.6, 0.8) + random.randint(-50, 50),
        start[1] + (end[1] - start[1]) * random.uniform(0.6, 0.8) + random.randint(-50, 50)
    )
    
    # منحنی بزیه ایجاد کنید
    nodes = np.asfortranarray([
        [start[0], control1[0], control2[0], end[0]],
        [start[1], control1[1], control2[1], end[1]]
    ])
    curve = bezier.Curve(nodes, degree=3)
    
    # نقاط روی منحنی ایجاد کنید
    points = []
    for t in np.linspace(0, 1, num_points):
        point = curve.evaluate(t)
        # نویز میکرو اضافه کنید
        x = point[0][0] + random.uniform(-2, 2)
        y = point[1][0] + random.uniform(-2, 2)
        points.append((x, y))
    
    return points

async def human_click(page, selector):
    """روی عنصر کلیک می‌کند با حرکت موس انسان‌مانند"""
    element = await page.query_selector(selector)
    box = await element.bounding_box()
    
    # نقطه هدف — نه مرکز، بلکه نقطه تصادفی درون عنصر
    target_x = box['x'] + random.uniform(box['width'] * 0.2, box['width'] * 0.8)
    target_y = box['y'] + random.uniform(box['height'] * 0.2, box['height'] * 0.8)
    
    # موقعیت فعلی موس (یا شروع تصادفی)
    start_x = random.randint(0, 1920)
    start_y = random.randint(0, 1080)
    
    # مسیر ایجاد کنید
    path = generate_human_mouse_path((start_x, start_y), (target_x, target_y))
    
    # موس را در مسیر حرکت دهید
    for x, y in path:
        await page.mouse.move(x, y)
        await page.wait_for_timeout(random.randint(5, 20))
    
    # تاخیر کوچک قبل از کلیک
    await page.wait_for_timeout(random.randint(50, 150))
    await page.mouse.click(target_x, target_y)

بارگذاری منابع

مرورگر واقعی نه تنها HTML، بلکه CSS، JavaScript، تصاویر، فونت‌ها را بارگذاری می‌کند. اگر از requests استفاده می‌کنید و فقط HTML را درخواست می‌کنید — این مشکوک است. هنگام کار با headless-browser این مشکل خودکار حل می‌شود، اما با HTTP-client باید این را در نظر بگیریم.

انتخاب نوع پروکسی برای کار

انواع مختلف پروکسی ویژگی‌های متفاوتی دارند و برای کارهای مختلف مناسب هستند. انتخاب نادرست — دلیل رایج مسدودیت است.

پروکسی مرکز داده

پروکسی مرکز داده — آدرس‌های IP متعلق به فروشندگان میزبانی هستند. آن‌ها بر اساس تعلق به AS (سیستم‌های خودمختار) مراکز داده بزرگ قابل شناسایی هستند.

مزایا:

  • سرعت و پایداری بالا
  • هزینه پایین
  • مجموعه بزرگ IP

معایب:

  • به‌آسانی شناسایی می‌شوند
  • اغلب در لیست‌های سیاه
  • برای وب‌سایت‌های با حفاظت جدی مناسب نیستند

مناسب برای: ابزارهای SEO، بررسی دسترسی، کار با API بدون حفاظت سخت، تست.

پروکسی مسکونی

پروکسی مسکونی — آدرس‌های IP کاربران واقعی، از طریق برنامه‌های شریک یا SDK در برنامه‌ها ارائه شده‌اند. آن‌ها متعلق به فروشندگان اینترنت معمولی (ISP) هستند.

مزایا:

  • مثل کاربران عادی به نظر می‌رسند
  • fraud score پایین
  • جغرافیای وسیع
  • شناسایی سخت

معایب:

  • هزینه بالاتر (پرداخت برای ترافیک)
  • سرعت به کاربر نهایی بستگی دارد
  • IP می‌تواند «رفت» (کاربر دستگاه را خاموش کرد)

مناسب برای: تجزیه وب‌سایت‌های محافظت‌شده، کار با شبکه‌های اجتماعی، تجارت الکترونیک، هر کاری که شناسایی نشدن مهم باشد.

پروکسی موبایل

پروکسی موبایل — آدرس‌های IP اپراتورهای موبایل (MTS، Beeline، Megafon و نظایر آن در کشورهای دیگر). آن‌ها به دلیل تکنولوژی CGNAT وضعیت خاصی دارند.

مزایا:

  • حداکثر اعتماد از سوی وب‌سایت‌ها
  • یک IP توسط هزاران کاربر واقعی استفاده می‌شود — سخت برای بان
  • ایده‌آل برای کار با حساب‌ها
  • تغییر IP بر درخواست (اتصال مجدد به شبکه)

معایب:

  • بالاترین هزینه
  • سرعت محدود
  • انتخاب جغرافیایی کمتر

مناسب برای: مولتی‌اکاونتینگ، کار با Instagram/Facebook/TikTok، ثبت‌نام حساب، هر کاری با خطر بان بالا.

جدول مقایسه

پارامتر مرکز داده مسکونی موبایل
شناسایی‌پذیری بالا پایین بسیار پایین
سرعت بالا متوسط پایین-متوسط
هزینه $ $$ $$$
برای شبکه‌های اجتماعی مناسب نیست مناسب ایده‌آل
برای تجزیه‌گری وب‌سایت‌های ساده هر وب‌سایتی بیش‌ازحد

تکنیک‌های پیشرفته برای دور زدن حفاظت

وقتی روش‌های اساسی کار نکنند، باید از تکنیک‌های پیچیده‌تری استفاده کنید. بیایید چند رویکرد پیشرفته را بررسی کنیم.

کار با Cloudflare و حفاظت‌های مشابه

Cloudflare، Akamai، PerimeterX — این سیستم‌ها از چالش‌های JavaScript برای بررسی مرورگر استفاده می‌کنند. درخواست ساده HTTP نمی‌تواند عبور کند. گزینه‌های حل:

1. استفاده از مرورگر واقعی:

from playwright.sync_api import sync_playwright

def bypass_cloudflare(url, proxy):
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=False,  # گاهی headless شناسایی می‌شود
            proxy={"server": proxy}
        )
        
        page = browser.new_page()
        page.goto(url)
        
        # منتظر عبور از بررسی (معمولاً 5-10 ثانیه)
        page.wait_for_timeout(10000)
        
        # بررسی کنید که عبور کردیم یا نه
        if "challenge" not in page.url:
            # کوکی‌ها را برای درخواست‌های بعدی ذخیره کنید
            cookies = page.context.cookies()
            return cookies
        
        browser.close()
        return None

2. استفاده از راه‌حل‌های آماده:

# cloudscraper — کتابخانه برای دور زدن Cloudflare
import cloudscraper

scraper = cloudscraper.create_scraper(
    browser={
        'browser': 'chrome',
        'platform': 'windows',
        'desktop': True
    }
)

scraper.proxies = {"http": proxy, "https": proxy}
response = scraper.get("https://protected-site.com")

حل Captcha

اگر وب‌سایت captcha نشان دهد، چندین رویکرد وجود دارد:

سرویس‌های حل: 2Captcha، Anti-Captcha، CapMonster. آن‌ها captcha را برای شما حل می‌کنند