چرخش پیشرفته ProxyScrape در Scrapy: میدلور دانلودر سفارشی با تلاش مجدد و تشخیص مسدودسازی
یک میدلور دانلودر سفارشی Scrapy بسازید که پروکسیهای مسکونی و دیتاسنتری ProxyScrape را میچرخاند، تلاشهای مجدد را مدیریت میکند و مسدودسازیها را برای خراشدهی بزرگمقیاس قابل اعتماد تشخیص میدهد.
مرور کلی
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 و منطق تلاش مجدد خود را تنظیم کنید.