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

چگونه بدون مسدودیت سایت‌های خبری را پارس کنیم: تنظیم پروکسی و دور زدن حفاظت

راهنمای کامل برای تنظیم پارس کردن سایت‌های خبری: انتخاب نوع پروکسی، دور زدن سیستم‌های ضد ربات، تنظیم چرخش IP و نمونه کدها در پایتون.

📅۱۶ اسفند ۱۴۰۴
```html

سایت‌های خبری — یکی از محافظت‌شده‌ترین منابع در اینترنت هستند. Cloudflare، محدودیت نرخ، مسدودیت‌های IP — همه این‌ها پارس کردن اخبار را به یک چالش فنی جدی تبدیل می‌کند. در این راهنما بررسی می‌کنیم که چگونه پروکسی را به درستی برای جمع‌آوری پایدار داده‌ها از پورتال‌های خبری تنظیم کنیم، چه نوع پروکسی را برای وظایف مختلف انتخاب کنیم و چگونه از سیستم‌های حفاظتی مدرن عبور کنیم.

چرا سایت‌های خبری پروکسی‌ها را مسدود می‌کنند

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

سایت‌های خبری مدرن از حفاظت چند لایه استفاده می‌کنند:

  • Cloudflare و مشابه‌ها — JavaScript، اثر انگشت TLS مرورگر، الگوهای رفتاری را بررسی می‌کنند
  • محدودیت نرخ — تعداد درخواست‌ها از یک IP را محدود می‌کنند (معمولاً 10-50 درخواست در دقیقه)
  • مسدودیت بر اساس User-Agent — هدرهای استاندارد کتابخانه‌ها (Python-requests، curl) را مسدود می‌کنند
  • CAPTCHA — در صورت فعالیت مشکوک نمایش داده می‌شود
  • مسدودیت‌های جغرافیایی — برخی پورتال‌های خبری فقط از کشورهای خاص قابل دسترسی هستند

نشانه‌های معمولی که سایت‌های خبری پروکسی‌ها را شناسایی می‌کنند: IP یکسان درخواست‌های زیادی را به طور متوالی ارسال می‌کند، عدم وجود JavaScript، ترتیب غیر استاندارد هدرهای HTTP، سرعت درخواست‌ها بسیار سریع (انسان نمی‌تواند 10 صفحه در ثانیه باز کند)، عدم وجود کوکی‌ها و referrer.

مهم: پارس کردن سایت‌های خبری در منطقه خاکستری قرار دارد. همیشه robots.txt و شرایط خدمات منبع هدف را بررسی کنید. برای استفاده تجاری از داده‌ها، توصیه می‌شود از API‌های رسمی استفاده کنید یا توافق‌نامه‌های همکاری منعقد کنید.

چه نوع پروکسی را برای پارس کردن اخبار انتخاب کنیم

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

نوع پروکسی سرعت هزینه کی استفاده کنیم
پروکسی‌های دیتا سنتر بالا (50-100 میلی‌ثانیه) پایین سایت‌های بدون Cloudflare، حجم بالای داده‌ها، تست
پروکسی‌های مسکونی متوسط (200-500 میلی‌ثانیه) بالا سایت‌های با Cloudflare، حفاظت سخت‌گیرانه، هدف‌گذاری جغرافیایی
پروکسی‌های موبایل متوسط (300-600 میلی‌ثانیه) بسیار بالا حفاظت حداکثری، نسخه‌های موبایل سایت‌های خبری

پروکسی‌های دیتا سنتر برای پارس کردن اخبار

مناسب برای پارس کردن سایت‌های خبری بدون حفاظت جدی: نشریات منطقه‌ای، وبلاگ‌ها، پورتال‌های خبری کوچک. مزایا: سرعت بالا (مهم در پارس کردن صدها منبع)، هزینه پایین (می‌توان یک مجموعه از 50-100 IP را اجاره کرد)، اتصال پایدار.

معایب: به راحتی از طریق ASN (وابستگی به دیتا سنتر) شناسایی می‌شوند، اغلب قبلاً در لیست سیاه سایت‌های بزرگ قرار دارند، در 70% موارد از Cloudflare Challenge عبور نمی‌کنند. از پروکسی‌های دیتا سنتر برای پارس کردن انبوه فیدهای RSS، sitemap.xml، API endpoints یا برای جمع‌آوری متاداده‌ها (هدرها، تاریخ‌های انتشار) بدون بارگذاری محتوای کامل استفاده کنید.

پروکسی‌های مسکونی — استاندارد طلایی

پروکسی‌های مسکونی — آدرس‌های IP کاربران واقعی خانگی هستند که توسط ارائه‌دهندگان اینترنت ارائه می‌شوند. برای سایت‌های خبری، آن‌ها به عنوان بازدیدکنندگان عادی به نظر می‌رسند که این امر در کار با منابع محافظت‌شده بسیار مهم است.

زمانی که پروکسی‌های مسکونی الزامی هستند: پارس کردن پورتال‌های خبری بزرگ (CNN، BBC، Reuters، RBC، Kommersant)، سایت‌های تحت Cloudflare یا حفاظت مشابه، جمع‌آوری داده‌ها از کشورهای خاص (هدف‌گذاری جغرافیایی)، جلسات طولانی با احراز هویت. پروکسی‌های مسکونی از بررسی‌های JavaScript Cloudflare عبور می‌کنند، دارای شهرت IP پاک هستند، و از sticky sessions (ثابت نگه‌داشتن IP برای 10-30 دقیقه) پشتیبانی می‌کنند.

نکته عملی: از پروکسی‌های مسکونی با چرخش بر اساس زمان (sticky sessions) استفاده کنید، نه بر اساس درخواست‌ها. به عنوان مثال، یک IP به مدت 10 دقیقه کار می‌کند، 20-30 مقاله جمع‌آوری می‌کند و سپس تغییر می‌کند. این طبیعی‌تر به نظر می‌رسد تا تغییر IP برای هر درخواست.

پروکسی‌های موبایل برای موارد خاص

پروکسی‌های موبایل از IP اپراتورهای موبایل (MTS، Beeline، Tele2) استفاده می‌کنند. آن‌ها حداکثر اعتماد را دارند، زیرا میلیون‌ها نفر از اینترنت موبایل برای خواندن اخبار استفاده می‌کنند. از آن‌ها برای پارس کردن نسخه‌های موبایل سایت‌های خبری (که اغلب دارای حفاظت ساده‌تری هستند)، سایت‌های با حفاظت فوق‌العاده سخت‌گیرانه، صفحات AMP Google News استفاده کنید.

ویژگی پروکسی‌های موبایل: IP به طور خودکار تغییر می‌کند (اپراتورهای موبایل از CGNAT استفاده می‌کنند)، یک IP می‌تواند به طور همزمان متعلق به صدها کاربر باشد که مسدود کردن آن را بی‌معنی می‌کند. معایب — هزینه بالا، بنابراین از آن‌ها به صورت نقطه‌ای استفاده کنید، فقط برای اهداف بسیار محافظت‌شده.

دور زدن Cloudflare و دیگر سیستم‌های ضد ربات

Cloudflare — دشمن اصلی پروکسی‌های سایت‌های خبری است. حدود 40% از پورتال‌های خبری بزرگ از Cloudflare برای حفاظت در برابر ربات‌ها استفاده می‌کنند. کتابخانه‌های استاندارد (requests، urllib) از بررسی عبور نمی‌کنند، زیرا Cloudflare اثر انگشت TLS، اجرای JavaScript، ترتیب هدرهای HTTP و الگوهای رفتاری را تجزیه و تحلیل می‌کند.

استراتژی‌های دور زدن Cloudflare

1. مرورگرهای بدون سر (Selenium، Playwright، Puppeteer)

شبیه‌سازی مرورگر واقعی با اجرای JavaScript. Cloudflare اثر انگشت TLS صحیح Chrome/Firefox را می‌بیند و درخواست را عبور می‌دهد. معایب: کند (2-5 ثانیه برای هر صفحه)، نیاز به منابع زیادی (RAM، CPU).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# تنظیم پروکسی برای Selenium
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://username:password@proxy.example.com:8080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://news-site.com/article')

# منتظر بارگذاری JavaScript
driver.implicitly_wait(10)
html = driver.page_source
driver.quit()

2. کتابخانه‌های با TLS-fingerprinting (curl_cffi، tls-client)

اثر انگشت TLS مرورگر واقعی را بدون اجرای مرورگر بدون سر شبیه‌سازی می‌کنند. 10-20 برابر سریع‌تر از Selenium کار می‌کنند، اما JavaScript را اجرا نمی‌کنند. برای سایت‌های با بررسی پایه Cloudflare (بدون JS-challenge) مناسب هستند.

from curl_cffi import requests

proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

response = requests.get(
    'https://news-site.com/article',
    proxies=proxies,
    impersonate='chrome110'  # شبیه‌سازی اثر انگشت TLS Chrome 110
)

print(response.text)

3. خدمات دور زدن Cloudflare (scraperapi، scrapingbee)

API‌های پولی که به طور خودکار از Cloudflare عبور می‌کنند. شما URL را ارسال می‌کنید، آن‌ها HTML آماده را برمی‌گردانند. مزایا: نیازی به درک جزئیات فنی نیست، چرخش خودکار پروکسی، پردازش CAPTCHA. معایب: هزینه بالا در حجم‌های بزرگ (از 50 دلار در ماه برای 100K درخواست).

هدرهای HTTP صحیح

حتی با پروکسی، ارسال هدرهای صحیح مهم است، در غیر این صورت سایت ربات را از طریق User-Agent غیر استاندارد یا عدم وجود Accept-Language شناسایی می‌کند.

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Cache-Control': 'max-age=0'
}

به طور دوره‌ای User-Agent را به‌روز کنید — از نسخه‌های به‌روز مرورگرها استفاده کنید. می‌توانید اثر انگشت خود را در سایت‌های whoer.net یا browserleaks.com بررسی کنید.

تنظیم چرخش IP و مدیریت درخواست‌ها

چرخش صحیح پروکسی — کلید پارس پایدار بدون مسدودیت است. سایت‌های خبری فرکانس درخواست‌ها از یک IP را زیر نظر دارند و تجاوز از حد مجاز منجر به مسدودیت موقت یا دائمی می‌شود.

انواع چرخش پروکسی

چرخش بر اساس درخواست‌ها — هر درخواست از طریق یک IP جدید می‌رود. برای پارس کردن سریع تعداد زیادی از سایت‌های مختلف مناسب است و ریسک مسدودیت بر اساس فرکانس درخواست‌ها را به حداقل می‌رساند. معایب: برای سایت‌های با جلسات (کوکی‌ها، احراز هویت) مناسب نیست و ممکن است برای برخی از حفاظت‌ها مشکوک به نظر برسد.

چرخش بر اساس زمان (sticky sessions) — یک IP برای مدت زمان مشخصی (5-30 دقیقه) استفاده می‌شود و سپس تغییر می‌کند. برای پارس کردن یک پورتال خبری با صفحات متعدد مناسب است، کوکی‌ها و جلسات را حفظ می‌کند و مانند رفتار یک کاربر واقعی به نظر می‌رسد. برای اکثر وظایف پارس کردن اخبار توصیه می‌شود.

چرخش بر اساس جغرافیای — تغییر IP از کشورهای/شهرهای مختلف. برای پارس کردن محتوای وابسته به جغرافیا (اخبار منطقه‌ای)، دور زدن مسدودیت‌های جغرافیایی استفاده می‌شود.

فرکانس بهینه درخواست‌ها

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

  • پورتال‌های خبری بزرگ (RBC، Kommersant، Vedomosti) — 2-5 ثانیه بین درخواست‌ها از یک IP
  • سایت‌های متوسط — 1-3 ثانیه
  • وبلاگ‌های کوچک و نشریات منطقه‌ای — 0.5-1 ثانیه

تأخیرهای تصادفی (randomization) اضافه کنید تا الگوی درخواست‌ها طبیعی به نظر برسد:

import time
import random

def fetch_article(url, proxies):
    response = requests.get(url, proxies=proxies, headers=headers)
    
    # تأخیر تصادفی از 2 تا 5 ثانیه
    delay = random.uniform(2, 5)
    time.sleep(delay)
    
    return response.text

مثال چرخش پروکسی از مجموعه

اگر لیستی از پروکسی‌ها دارید، می‌توانید چرخش ساده‌ای را به صورت دستی پیاده‌سازی کنید:

import itertools
import requests

# مجموعه پروکسی
proxy_list = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
]

# ایجاد یک تکرارگر بی‌پایان
proxy_pool = itertools.cycle(proxy_list)

def get_next_proxy():
    proxy = next(proxy_pool)
    return {'http': proxy, 'https': proxy}

# استفاده
urls = ['https://news1.com/article', 'https://news2.com/article']

for url in urls:
    proxies = get_next_proxy()
    response = requests.get(url, proxies=proxies, headers=headers)
    print(f'Fetched {url} via {proxies["http"]}')

مثال‌های کد: Python + Scrapy + پروکسی

Scrapy — فریم‌ورک حرفه‌ای برای پارس کردن است که به طور پیش‌فرض از پروکسی، middleware، چرخش و پردازش خطاها پشتیبانی می‌کند. یک مثال کامل از پارسر سایت خبری با چرخش پروکسی را بررسی می‌کنیم.

نصب وابستگی‌ها

pip install scrapy scrapy-rotating-proxies

تنظیم Scrapy با پروکسی (settings.py)

# settings.py

# فعال کردن middleware برای چرخش پروکسی
ROTATING_PROXY_LIST = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
]

DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# تنظیمات برای دور زدن مسدودیت‌ها
CONCURRENT_REQUESTS = 8  # حداکثر 8 درخواست همزمان
DOWNLOAD_DELAY = 2  # تأخیر 2 ثانیه بین درخواست‌ها
RANDOMIZE_DOWNLOAD_DELAY = True  # تأخیر تصادفی

# User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'

# تلاش‌های مجدد در صورت خطا
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]

Spider برای پارس کردن اخبار

# news_spider.py

import scrapy
from datetime import datetime

class NewsSpider(scrapy.Spider):
    name = 'news_parser'
    
    # لیست سایت‌های خبری برای پارس کردن
    start_urls = [
        'https://example-news.com/latest',
    ]
    
    def parse(self, response):
        # پارس کردن لیست مقالات در صفحه اصلی
        articles = response.css('article.news-item')
        
        for article in articles:
            article_url = article.css('a.title::attr(href)').get()
            
            if article_url:
                # به صفحه مقاله می‌رویم
                yield response.follow(article_url, callback=self.parse_article)
    
    def parse_article(self, response):
        # استخراج داده‌های مقاله
        yield {
            'url': response.url,
            'title': response.css('h1.article-title::text').get(),
            'date': response.css('time.published::attr(datetime)').get(),
            'author': response.css('span.author::text').get(),
            'text': ' '.join(response.css('div.article-body p::text').getall()),
            'tags': response.css('a.tag::text').getall(),
            'scraped_at': datetime.now().isoformat(),
        }

اجرای پارسر

# ذخیره در JSON
scrapy crawl news_parser -o news_data.json

# ذخیره در CSV
scrapy crawl news_parser -o news_data.csv

پارس ساده با requests + BeautifulSoup

اگر به منطق پیچیده نیاز ندارید، می‌توانید از ترکیب requests + BeautifulSoup استفاده کنید:

import requests
from bs4 import BeautifulSoup
import time
import random

# تنظیم پروکسی
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

def parse_news_article(url):
    try:
        response = requests.get(url, proxies=proxies, headers=headers, timeout=10)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # استخراج داده‌ها (انتخاب‌گرها به سایت بستگی دارد)
        title = soup.find('h1', class_='article-title').text.strip()
        date = soup.find('time', class_='published')['datetime']
        text = ' '.join([p.text for p in soup.find_all('p', class_='article-text')])
        
        return {
            'url': url,
            'title': title,
            'date': date,
            'text': text
        }
    
    except Exception as e:
        print(f'Error parsing {url}: {e}')
        return None

# پارس کردن لیست مقالات
urls = [
    'https://news-site.com/article-1',
    'https://news-site.com/article-2',
]

for url in urls:
    article_data = parse_news_article(url)
    if article_data:
        print(article_data)
    
    # تأخیر بین درخواست‌ها
    time.sleep(random.uniform(2, 4))

اشتباهات رایج در پارس کردن اخبار

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

خطا 1: فرکانس درخواست‌ها بسیار بالا

علائم: HTTP 429 (Too Many Requests)، مسدودیت‌های موقت IP، CAPTCHA. دلیل: پروکسی 10-50 درخواست در ثانیه از یک IP ارسال می‌کند. راه‌حل: تأخیرها (time.sleep())، استفاده از DOWNLOAD_DELAY در Scrapy، محدود کردن CONCURRENT_REQUESTS.

خطا 2: استفاده از یک پروکسی برای همه درخواست‌ها

علائم: پروکسی به سرعت مسدود می‌شود، حتی با تأخیرها. دلیل: یک IP صدها درخواست به یک سایت ارسال می‌کند. راه‌حل: از مجموعه پروکسی با چرخش استفاده کنید، برای سایت‌های بزرگ — حداقل 10-20 پروکسی، برای sticky sessions هر 10-15 دقیقه IP را تغییر دهید.

خطا 3: نادیده گرفتن کوکی‌ها

بسیاری از سایت‌های خبری در اولین بازدید کوکی‌ها را تنظیم می‌کنند و وجود آن‌ها را در درخواست‌های بعدی بررسی می‌کنند. عدم وجود کوکی‌ها نشانه ربات است. راه‌حل: از requests.Session() برای ذخیره خودکار کوکی‌ها استفاده کنید، در Scrapy COOKIES_ENABLED = True را فعال کنید.

import requests

session = requests.Session()
session.proxies = {'http': 'http://proxy.com:8080', 'https': 'http://proxy.com:8080'}

# اولین درخواست — دریافت کوکی‌ها
response1 = session.get('https://news-site.com')

# درخواست‌های بعدی به طور خودکار کوکی‌ها را ارسال می‌کنند
response2 = session.get('https://news-site.com/article')

خطا 4: پردازش نادرست ریدایرکت‌ها

سایت‌های خبری اغلب از ریدایرکت‌ها (301، 302) برای نسخه‌های موبایل، زیر دامنه‌های منطقه‌ای، صفحات AMP استفاده می‌کنند. اگر پروکسی به ریدایرکت‌ها توجه نکند، صفحه خالی دریافت می‌کند. راه‌حل: در requests به طور پیش‌فرض فعال است (allow_redirects=True)، URL نهایی را از طریق response.url بررسی کنید.

خطا 5: پارس کردن محتوای دینامیک بدون JavaScript

بسیاری از سایت‌های خبری مدرن محتوا را از طریق JavaScript (React، Vue) بارگذاری می‌کنند. کتابخانه requests HTML خالی بدون مقالات را دریافت می‌کند. راه‌حل: از Selenium/Playwright برای اجرای JavaScript استفاده کنید، Network را در DevTools بررسی کنید — ممکن است داده‌ها از طریق API بارگذاری شوند (می‌توانید JSON را به طور مستقیم پارس کنید).

مقیاس‌پذیری: پارس کردن صدها منبع

زمانی که نیاز به پارس کردن نه یک سایت خبری، بلکه صدها منبع به طور همزمان (aggregator‌های خبری، نظارت بر رسانه‌ها) دارید، به معماری مقیاس‌پذیر نیاز است.

پارس توزیع‌شده با Scrapy Cloud

Scrapy Cloud (از سازندگان Scrapy) به شما اجازه می‌دهد تا پارسرها را در ابر با مقیاس‌گذاری خودکار اجرا کنید. مزایا: نیازی به سرورهای خودتان نیست، چرخش خودکار پروکسی، نظارت و لاگ‌ها. هزینه: از 9 دلار در ماه برای طرح پایه.

صف‌های وظیفه (Celery + Redis)

برای استقرار خودتان از Celery — سیستم وظایف توزیع‌شده استفاده کنید. معماری: Redis صف URL‌ها برای پارس کردن را ذخیره می‌کند، چندین کارگر (سرور) وظایف را از صف می‌گیرند و به طور موازی پارس می‌کنند، هر کارگر از مجموعه پروکسی خود استفاده می‌کند.

# tasks.py

from celery import Celery
import requests

app = Celery('news_parser', broker='redis://localhost:6379/0')

@app.task
def parse_article(url, proxy):
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, proxies=proxies, timeout=10)
    # پارس کردن و ذخیره داده‌ها
    return response.text

# افزودن وظایف به صف
urls = ['https://news1.com/article', 'https://news2.com/article']
proxies = ['http://proxy1.com:8080', 'http://proxy2.com:8080']

for url in urls:
    proxy = random.choice(proxies)
    parse_article.delay(url, proxy)  # اجرای غیر همزمان

نظارت و پردازش خطاها

در پارس کردن مقیاس‌پذیر، نظارت بسیار مهم است: چند URL پردازش شده، چند خطا، کدام پروکسی‌ها مسدود شده‌اند. از Sentry برای نظارت بر خطاهای Python، Grafana + Prometheus برای متریک‌ها (درخواست‌ها در ثانیه، زمان پاسخ)، و لاگ‌گیری در ELK Stack (Elasticsearch، Logstash، Kibana) استفاده کنید.

نکته: یک سیستم خودکار برای بررسی پروکسی‌ها ایجاد کنید. هر 5-10 دقیقه یک درخواست آزمایشی از طریق هر پروکسی به whoer.net یا httpbin.org ارسال کنید. اگر پروکسی پاسخ ندهد یا مسدود شده باشد — آن را از مجموعه حذف کنید و یک پروکسی جدید اضافه کنید.

بهینه‌سازی هزینه‌ها برای پروکسی‌ها

در پارس کردن صدها منبع، هزینه‌های پروکسی می‌تواند به هزاران دلار در ماه برسد. استراتژی‌های بهینه‌سازی: از پروکسی‌های دیتا سنتر برای سایت‌های ساده (RSS، API) استفاده کنید، پروکسی‌های مسکونی فقط برای سایت‌های محافظت‌شده، داده‌ها را کش کنید — یک مقاله را دو بار پارس نکنید، در ساعات غیر اوج پارس کنید (در شب بار روی سایت‌ها کمتر است، ریسک مسدودیت کمتر است).

مثال: برای پارس کردن 500 سایت خبری می‌توان از 80% پروکسی‌های دیتا سنتر (برای RSS و سایت‌های ساده) و 20% پروکسی‌های مسکونی (برای 100 پورتال محافظت‌شده برتر) استفاده کرد. این کار هزینه‌ها را 3-5 برابر کاهش می‌دهد.

نتیجه‌گیری

پارس کردن سایت‌های خبری — یک وظیفه فنی پیچیده است که نیاز به انتخاب صحیح پروکسی، تنظیم چرخش و دور زدن سیستم‌های ضد ربات دارد. نکات کلیدی از مقاله: برای پورتال‌های خبری محافظت‌شده (Cloudflare، محدودیت نرخ سخت‌گیرانه) از پروکسی‌های مسکونی با sticky sessions استفاده کنید، برای پارس کردن انبوه صدها منبع از پروکسی‌های دیتا سنتر با چرخش سریع استفاده کنید، حتماً تأخیرهایی بین درخواست‌ها (2-5 ثانیه) و هدرهای HTTP صحیح اضافه کنید، برای دور زدن Cloudflare از مرورگرهای بدون سر (Selenium، Playwright) یا کتابخانه‌های با TLS-fingerprinting استفاده کنید.

در مقیاس‌گذاری از سیستم‌های توزیع‌شده (Celery، Scrapy Cloud) و نظارت بر خطاها استفاده کنید. به یاد داشته باشید که پارس کردن باید اخلاقی باشد — به robots.txt احترام بگذارید، بار اضافی بر روی سرورها ایجاد نکنید و به حقوق مؤلفان محتوا احترام بگذارید.

اگر قصد دارید پورتال‌های خبری بزرگ با حفاظت Cloudflare را پارس کنید، توصیه می‌شود از پروکسی‌های مسکونی استفاده کنید — آن‌ها سطح بالایی از اعتماد و حداقل ریسک مسدودیت‌ها را فراهم می‌کنند. برای وظایفی که سرعت و حجم داده‌ها مهم است (پارس کردن RSS، API endpoints)، پروکسی‌های دیتا سنتر مناسب هستند.

```