Skip to content
Advanced / 3 min read

چرخش پیشرفته ProxyScrape در Scrapy: میدلور دانلودر سفارشی با تلاش مجدد و تشخیص مسدودسازی

یک میدلور دانلودر سفارشی Scrapy بسازید که پروکسی‌های مسکونی و دیتاسنتری ProxyScrape را می‌چرخاند، تلاش‌های مجدد را مدیریت می‌کند و مسدودسازی‌ها را برای خراش‌دهی بزرگ‌مقیاس قابل اعتماد تشخیص می‌دهد.

لینوکس SOCKS5 HTTP(S) وب اسکرپینگ

مرور کلی

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

ProxyScrape پروکسی‌های مسکونی، دیتاسنتری و موبایل را با پشتیبانی HTTP و SOCKS5، استخری از بیش از ۹۷ میلیون IP و آپتایم بلندمدت قوی ارائه می‌دهد. می‌توانید بسته به حجم خراش‌دهی‌تان، پرداخت به‌ازای مصرف یا صورت‌حساب ماهانه ثابت را انتخاب کنید.

پیش‌نیازها

  • پایتون ۳.۸ یا جدیدتر نصب شده باشد.
  • Scrapy نصب شده باشد (pip install scrapy).
  • یک حساب ProxyScrape با پروکسی‌های مسکونی یا دیتاسنتری فعال.
  • endpoint پروکسی و اعتبارنامه‌های شما از داشبورد ProxyScrape.
  • اختیاری: فهرستی از endpointهای پروکسی جداگانه اگر چرخش ایستا را به endpoint چرخشی ترجیح می‌دهید.

گام ۱: ایجاد یک پروژه Scrapy

ترمینال خود را باز کنید و یک پروژه Scrapy جدید ایجاد کنید:

pip install scrapy
scrapy startproject proxyscrape_scraper
cd proxyscrape_scraper

گام ۲: ذخیره امن اعتبارنامه‌های ProxyScrape

هرگز اعتبارنامه‌ها را در فایل‌های منبع هاردکد نکنید. از متغیرهای محیطی استفاده کنید و آن‌ها را در settings.py بخوانید.

یک فایل .env ایجاد کنید یا متغیرها را در پوسته خود export کنید:

export PROXYSCRAPE_USER='your_username'
export PROXYSCRAPE_PASS='your_password'
export PROXYSCRAPE_ENDPOINT='http://proxy.proxyscrape.com:8080'

سپس در settings.py، اضافه کنید:

import os

PROXYSCRAPE_USER = os.getenv('PROXYSCRAPE_USER')
PROXYSCRAPE_PASS = os.getenv('PROXYSCRAPE_PASS')
PROXYSCRAPE_ENDPOINT = os.getenv('PROXYSCRAPE_ENDPOINT')

گام ۳: ساخت میدلور چرخش

یک فایل جدید proxyscrape_scraper/middlewares.py ایجاد کنید و میدلوری تعریف کنید که:

  • یک پروکسی از فهرست انتخاب می‌کند یا از endpoint چرخشی شما استفاده می‌کند.
  • اعتبارنامه‌ها را در URL پروکسی تزریق می‌کند.
  • برای کدهای وضعیت HTTP مرتبط با مسدودسازی، تلاش مجدد می‌کند.
# proxyscrape_scraper/middlewares.py
import random
import logging
from scrapy import signals
from scrapy.exceptions import NotConfigured

class ProxyScrapeRotationMiddleware:
    def __init__(self, proxy_list, credentials):
        self.proxy_list = proxy_list
        self.credentials = credentials
        self.logger = logging.getLogger(__name__)

    @classmethod
    def from_crawler(cls, crawler):
        proxy_list = crawler.settings.getlist('PROXY_LIST')
        credentials = (
            crawler.settings.get('PROXYSCRAPE_USER'),
            crawler.settings.get('PROXYSCRAPE_PASS'),
        )
        if not proxy_list:
            raise NotConfigured('PROXY_LIST is empty')
        return cls(proxy_list, credentials)

    def process_request(self, request, spider):
        proxy = random.choice(self.proxy_list)
        user, password = self.credentials
        if user and password:
            proxy = proxy.replace('://', f'://{user}:{password}@')
        request.meta['proxy'] = proxy
        self.logger.debug(f'Using proxy: {proxy}')

    def process_response(self, request, response, spider):
        if response.status in [403, 429, 503]:
            self.logger.warning(
                f'Ban detected with status {response.status} on {request.url}'
            )
            request.meta['proxy'] = None
            return request.replace(dont_filter=True)
        return response

گام ۴: پیکربندی تنظیمات برای چرخش و تلاش مجدد

در settings.py، فهرست پروکسی خود را تعریف کنید، میدلور را فعال کنید و رفتار تلاش مجدد را تنظیم کنید.

# settings.py
PROXY_LIST = [
    'http://proxy1.proxyscrape.com:8080',
    'socks5://proxy2.proxyscrape.com:1080',
    # Add more endpoints from your ProxyScrape dashboard
]

DOWNLOADER_MIDDLEWARES = {
    'proxyscrape_scraper.middlewares.ProxyScrapeRotationMiddleware': 543,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
}

RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [403, 429, 500, 502, 503, 504]

گام ۵: اختیاری — نشست‌های چسبنده با شناسه‌های نشست

اگر پلن ProxyScrape شما از نشست‌های چسبنده از طریق پارامترهای نام کاربری پشتیبانی می‌کند، می‌توانید یک شناسه نشست به نام کاربری اضافه کنید. برای نحو دقیق، داشبورد ProxyScrape خود را بررسی کنید (اغلب چیزی شبیه username-session-abc123).

# Inside process_request, replace the username logic:
session_id = ''.join(random.choices('abcdef0123456789', k=8))
user = f'{self.credentials[0]}-session-{session_id}'
proxy = proxy.replace('://', f'://{user}:{self.credentials[1]}@')

از نشست‌های چسبنده زمانی استفاده کنید که نیاز دارید همان IP را در چندین درخواست به یک دامنه حفظ کنید، مثل هنگام فرایندهای ورود یا تسویه حساب چندمرحله‌ای.

گام ۶: تست اسکرپر چرخشی خود

یک spider ساده ایجاد کنید تا تأیید کنید درخواست‌ها از پروکسی‌های مختلف عبور می‌کنند.

# proxyscrape_scraper/spiders/ip_test.py
import scrapy

class IpTestSpider(scrapy.Spider):
    name = 'ip_test'
    start_urls = ['https://httpbin.org/ip']

    def parse(self, response):
        yield {'ip': response.json()['origin']}

spider را اجرا کنید و نتایج را ذخیره کنید:

scrapy crawl ip_test -o ips.json

ips.json را باز کنید و تأیید کنید که مقادیر ip متفاوت هستند. اگر همان IP را مکرراً می‌بینید، PROXY_LIST یا پیکربندی endpoint چرخشی خود را بررسی کنید.

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

نوع پروکسی بهترین برای چرخش نشست‌های چسبنده پشتیبانی پروتکل
مسکونی خراش‌دهی وب عمومی، داده‌های هدفمند جغرافیایی endpoint چرخشی یا فهرست معمولاً از طریق شناسه‌های نشست موجود است HTTP, SOCKS5
دیتاسنتری خراش‌دهی پرسرعت سایت‌های غیرمحافظت‌شده endpoint چرخشی یا فهرست اغلب ایستا HTTP, SOCKS5
موبایل سایت‌های فقط موبایل، رسانه‌های اجتماعی، تست اپلیکیشن endpoint چرخشی معمولاً موجود است HTTP, SOCKS5

عیب‌یابی

  • خطاهای احراز هویت (407 Proxy Authentication Required): نام کاربری و رمز عبور خود را دوباره بررسی کنید. اگر از endpoint چرخشی استفاده می‌کنید، مطمئن شوید اعتبارنامه‌ها به‌درستی به‌صورت user:pass@host:port جاسازی شده‌اند.
  • اتمام مهلت اتصال: سعی کنید از HTTP به SOCKS5 یا برعکس تغییر دهید. برخی سایت‌ها یک پروتکل را تهاجمی‌تر مسدود می‌کنند. همچنین بررسی کنید که فایروال شما ترافیک خروجی روی پورت پروکسی را مجاز می‌داند.
  • مسدودسازی‌ها تشخیص داده نمی‌شوند: اگر هنوز CAPTCHA یا داده خالی دریافت می‌کنید، تشخیص مسدودسازی خود را گسترش دهید تا نشانگرهای CAPTCHA را در بدنه پاسخ بررسی کند (برای مثال، وجود captcha در HTML). همچنین می‌توانید نرخ درخواست خود را کاهش دهید و DOWNLOAD_DELAY را افزایش دهید.
  • خطاهای SOCKS5: Scrapy برای پروکسی‌های SOCKS5 به کتابخانه requests با پشتیبانی SOCKS نیاز دارد. اگر Missing dependencies for SOCKS support را دیدید، آن را با pip install requests[socks] نصب کنید.
  • نشست‌های چسبنده کار نمی‌کنند: فرمت دقیق پارامتر نشست را در داشبورد ProxyScrape خود تأیید کنید. برخی پلن‌ها از username-session-{id} استفاده می‌کنند در حالی که برخی دیگر از فیلد رمز عبور جداگانه استفاده می‌کنند.

خلاصه

اکنون یک میدلور Scrapy آماده تولید دارید که پروکسی‌های ProxyScrape را می‌چرخاند، در صورت مسدودسازی تلاش مجدد می‌کند و به‌صورت اختیاری نشست‌های چسبنده را حفظ می‌کند. این تنظیمات به شما امکان می‌دهد پروژه‌های خراش‌دهی خود را بدون نگرانی درباره محدودیت نرخ یا مسدودسازی IP مقیاس دهید. برای بهترین نتایج، پروکسی‌های مسکونی چرخشی را با تأخیر دانلود محافظه‌کارانه ترکیب کنید و نرخ موفقیت خود را پایش کنید. با تغییر اهداف خراش‌دهی، PROXY_LIST و منطق تلاش مجدد خود را تنظیم کنید.