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

تنظیم پروکسی در گوگل کولاپ و ژوپیتر برای پارس کردن بدون مسدودسازی IP

تنظیم پروکسی در Google Colab و Jupyter Notebook برای پارس کردن: چرا IPهای ابری بیشتر مسدود می‌شوند، چگونه requests و Selenium را متصل کنیم، چه محدودیت‌هایی را باید در نظر بگیریم.

📅۱۶ آبان ۱۴۰۵

Google Colab و Jupyter Notebook ابزارهای راحتی برای نوشتن و اجرای سریع اسکریپت‌های پارس کردن بدون نیاز به نصب Python بر روی ماشین محلی هستند. اما نوت‌بوک‌های ابری یک ویژگی دارند که اغلب فراموش می‌شود: تمام درخواست‌ها از آدرس‌های IP مراکز داده Google ارسال می‌شوند که مدت‌هاست توسط سیستم‌های ضد ربات شناخته شده‌اند و تقریباً بلافاصله مسدود می‌شوند. در این مقاله بررسی می‌کنیم که چگونه پروکسی را به درستی در Colab و Jupyter متصل کنیم، چه محدودیت‌هایی محیط ابری دارد و چگونه پارس کردن را طوری تنظیم کنیم که بعد از 50 درخواست اول متوقف نشود.

چرا Google Colab بیشتر از PC معمولی مسدود می‌شود

مشکل اصلی Colab برای پارس کردن، مجموعه عمومی آدرس‌های IP است. هر بار که شما یک نوت‌بوک را اجرا می‌کنید، Google یک ماشین مجازی با IP از دامنه‌های ابری خود (AS15169 و مشابه) اختصاص می‌دهد. این دامنه‌ها مدت‌هاست که در لیست سیاه اکثر سیستم‌های ضد ربات قرار دارند: Cloudflare، DataDome، PerimeterX و همچنین حفاظت داخلی Wildberries، Ozon و بازارها آن‌ها را در کسری از ثانیه شناسایی می‌کنند. درخواست حتی به سایت نمی‌رسد — فیلتر بر اساس ASN (شماره سیستم خودمختار) آن را قبل از بررسی User-Agent یا رفتار قطع می‌کند.

دلیل دوم — استفاده گسترده. هزاران توسعه‌دهنده به طور همزمان پارسرها، ربات‌ها و اسکریپت‌های ML را از طریق Colab اجرا می‌کنند، بنابراین شهرت این IP‌ها در بسیاری از سایت‌های هدف قبلاً «سوزانده» شده است قبل از اینکه شما درخواست خود را ارسال کنید. حتی اگر شما یک درخواست GET مرتب هر 10 ثانیه انجام دهید، سایت ممکن است 403 را برگرداند فقط به این دلیل که از این دامنه یک ساعت پیش کسی با 500 رشته به سرور حمله کرده است.

دلیل سوم — Jupyter که به صورت محلی اجرا می‌شود، معمولاً این مشکل را ندارد (اگر شما یک IP خانگی یا اداری معمولی داشته باشید)، اما به محض اینکه کار را از طریق JupyterHub در سرور میزبانی یا در کانتینر ارائه‌دهنده ابری شروع کنید — وضعیت مشابه Colab می‌شود. بنابراین سوال «آیا پروکسی نیاز است یا نه» برای نوت‌بوک‌های ابری به وضوح پاسخ داده می‌شود: بدون آن‌ها پارس کردن تقریباً بعد از چند درخواست اول کار نمی‌کند.

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

انتخاب نوع پروکسی بستگی به این دارد که شما دقیقاً چه چیزی را پارس می‌کنید و چقدر حفاظت سایت هدف تهاجمی است. برای Colab و Jupyter مهم است که یک نکته دیگر را در نظر بگیرید: جلسه نوت‌بوک از نظر زمانی محدود است، بنابراین جلسات چسبنده طولانی پروکسی همیشه بحرانی نیستند — بیشتر مهم است که اتصال در چارچوب یک اجرای واحد پایدار باشد.

نوع پروکسی کی در Colab/Jupyter استفاده شود ویژگی‌ها
پروکسی مراکز داده پارس کردن سایت‌ها بدون حفاظت سخت، API‌های باز، صفحات استاتیک سرعت بالا، قیمت پایین، اما ممکن است بر اساس ASN در سایت‌های تهاجمی مسدود شوند
پروکسی‌های مسکونی پارس کردن Wildberries، Ozon، Avito، Google، شبکه‌های اجتماعی با حفاظت ضد ربات IP کاربران واقعی، به ندرت در لیست سیاه قرار می‌گیرند، تأخیر بالاتر
پروکسی‌های موبایل پارس کردن نسخه‌های موبایل سایت‌ها، TikTok، Instagram از طریق API بالاترین اعتبار، اما گران‌تر و چرخش کندتر

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

تنظیم پروکسی در requests و urllib

تنظیمات پایه پروکسی در Colab هیچ تفاوتی با محیط Python محلی ندارد. تنها تفاوت این است که در Colab معمولاً باید کتابخانه‌ها را از طریق !pip install نصب کنید، زیرا تصویر استاندارد همیشه شامل همه چیزهای لازم نیست.

!pip install requests

import requests

proxy = {
    "http": "http://login:[email protected]:9000",
    "https": "http://login:[email protected]:9000"
}

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

response = requests.get(
    "https://example.com/catalog",
    proxies=proxy,
    headers=headers,
    timeout=15
)

print(response.status_code)
print(response.text[:500])

نکته مهم: در Colab هیچ فایل پیکربندی دائمی وجود ندارد، بنابراین نام کاربری و رمز عبور پروکسی باید یا به صورت هاردکد شده (که در هنگام انتشار نوت‌بوک ایمن نیست) ذخیره شوند، یا در متغیرهای محیطی Colab از طریق google.colab.userdata نگهداری شوند، یا از طریق Colab Secrets متصل شوند. این راحت‌تر از نگهداری رمز عبور به طور مستقیم در کد است، به ویژه اگر شما نوت‌بوک را با همکاران خود به اشتراک می‌گذارید.

from google.colab import userdata

proxy_login = userdata.get('PROXY_LOGIN')
proxy_pass = userdata.get('PROXY_PASS')

proxy_url = f"http://{proxy_login}:{proxy_pass}@gate.proxycove.com:9000"
proxies = {"http": proxy_url, "https": proxy_url}

پروکسی با Selenium و Chrome بدون سر در Colab

اگر سایت محتوا را از طریق JavaScript رندر کند (وضعیت معمول برای Wildberries، Ozon، Avito)، استفاده از requests ساده کافی نیست — به یک مرورگر بدون سر نیاز دارید. در Colab معمولاً از Selenium با Chromium استفاده می‌شود که باید به صورت دستی نصب شود، زیرا در تصویر پایه وجود ندارد.

!apt-get update
!apt install chromium-chromedriver
!pip install selenium

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

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--proxy-server=http://gate.proxycove.com:9000')

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://example.com/catalog")
print(driver.page_source[:500])
driver.quit()

مشکل این است که پرچم --proxy-server به طور مستقیم از احراز هویت با نام کاربری و رمز عبور پشتیبانی نمی‌کند. برای پروکسی با احراز هویت در Selenium باید یا از احراز هویت IP (سفید کردن بر اساس IP ثابت نوت‌بوک، که در Colab ناپایدار است زیرا IP ماشین با هر بار اجرای جدید تغییر می‌کند)، یا از طریق تولید افزونه Chrome «در لحظه» با مشخصات احراز هویت پروکسی استفاده کنید، یا از تونل پروکسی از طریق کتابخانه‌ای مانند selenium-wire که از پروکسی‌های احراز شده به طور پیش‌فرض پشتیبانی می‌کند، استفاده کنید.

!pip install selenium-wire

from seleniumwire import webdriver

proxy_options = {
    'proxy': {
        'http': 'http://login:[email protected]:9000',
        'https': 'http://login:[email protected]:9000',
    }
}

driver = webdriver.Chrome(seleniumwire_options=proxy_options, options=chrome_options)
driver.get("https://example.com/catalog")

Jupyter Notebook: محلی در مقابل ابری

Jupyter Notebook که بر روی ماشین محلی اجرا می‌شود (از طریق Anaconda یا به طور مستقیم از طریق pip)، از آدرس IP خانگی یا اداری شما استفاده می‌کند — و در این صورت پروکسی فقط برای مخفی‌سازی یا دور زدن محدودیت‌های جغرافیایی نیاز است، نه برای نجات از مسدودیت بر اساس ASN مرکز داده. تنظیمات در این حالت کاملاً مشابه یک اسکریپت Python معمولی است: همان requests، همان Selenium، بدون محدودیت در نصب درایورها و بسته‌های سیستمی.

وضعیت تغییر می‌کند اگر شما از Jupyter از طریق یک سرویس ابری استفاده کنید: JupyterHub بر روی VPS، نوت‌بوک‌های Kaggle، Deepnote، Binder یا خوشه ابری شرکتی. در این موارد IP دوباره متعلق به مرکز داده ارائه‌دهنده است و تمام مشکلات Colab یک به یک معتبر هستند. تفاوت اصلی با Colab این است که این خدمات اغلب IP پایدارتر در طول جلسه دارند (با هر بار راه‌اندازی مجدد هسته تغییر نمی‌کند)، که تنظیم سفید کردن بر اساس IP را آسان‌تر می‌کند، اگر ارائه‌دهنده پروکسی شما این را پشتیبانی کند.

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

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

علاوه بر مشکلات مربوط به شهرت IP، Google Colab دارای تعدادی محدودیت فنی است که مستقیماً بر ثبات پارس کردن تأثیر می‌گذارد:

  • تایم‌اوت عدم فعالیت. نسخه رایگان Colab نوت‌بوک را پس از ~90 دقیقه بی‌کاری خاموش می‌کند و جلسه را پس از 12 ساعت کار مداوم به طور اجباری خاتمه می‌دهد — پارس کردن طولانی هزاران صفحه باید به بخش‌هایی تقسیم شود یا نتایج میانی در Google Drive ذخیره شوند.
  • تغییر IP با هر بار اجرای جدید. اگر شما محیط اجرا را خاموش کرده و دوباره متصل شوید، آدرس IP ماشین مجازی تغییر می‌کند — این هر تنظیمی را با سفید کردن بر اساس IP در سمت سرویس پروکسی مختل می‌کند.
  • محدودیت در اتصالات خروجی. Google تعداد اتصالات شبکه همزمان را از یک ماشین مجازی محدود می‌کند، بنابراین چندنخی تهاجمی با ده‌ها درخواست موازی ممکن است به جای مسدودیت سایت، به محدودیت‌های خود Colab برخورد کند.
  • عدم وجود ذخیره‌سازی پایدار بدون نصب دیسک. کوکی‌ها، جلسات مرورگر و کش اتصالات پروکسی با هر بار راه‌اندازی مجدد از بین می‌روند — برای پارس کردن با احراز هویت باید به وضوح کوکی‌ها را در فایلی در Google Drive ذخیره کنید.
  • تاخیرهای غیرقابل پیش‌بینی شبکه. زیرساخت ابری Google گاهی اوقات نوسانات تاخیر را ایجاد می‌کند که به دلیل آن‌ها باید تایم‌اوت‌های درخواست را با احتیاط تنظیم کرد (15-30 ثانیه به جای 5-10 ثانیه استاندارد).

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

چرخش پروکسی و پردازش خطاها در حلقه

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

import requests
import time
import random

proxy_pool = [
    "http://login:[email protected]:9000",
    "http://login:[email protected]:9001",
    "http://login:[email protected]:9002",
]

def get_with_retry(url, max_retries=5):
    for attempt in range(max_retries):
        proxy_url = random.choice(proxy_pool)
        proxies = {"http": proxy_url, "https": proxy_url}
        try:
            response = requests.get(url, proxies=proxies, timeout=20)
            if response.status_code == 200:
                return response
            else:
                print(f"تلاش {attempt+1}: وضعیت {response.status_code}")
        except requests.exceptions.RequestException as e:
            print(f"تلاش {attempt+1}: خطا {e}")
        time.sleep(random.uniform(2, 5))
    return None

result = get_with_retry("https://example.com/catalog")
if result:
    print(result.status_code)
else:
    print("تمام تلاش‌ها به پایان رسید")

برای پارس کردن کاتالوگ‌های بزرگ (به عنوان مثال، هزاران کارت محصول در Wildberries) این منطق به طور اضافی در یک صف وظایف با وقفه‌های بین درخواست‌ها و ذخیره نتایج میانی در CSV یا پایگاه داده مستقیماً در Google Drive پیچیده می‌شود تا در صورت قطع جلسه Colab پیشرفت را از دست ندهید.

چک‌لیست قبل از اجرای پارسر در Colab

  • پروکسی‌ها متصل و با یک درخواست آزمایشی جداگانه قبل از حلقه اصلی تست شده‌اند
  • نام کاربری و رمز عبور پروکسی در Colab Secrets ذخیره شده‌اند، نه در کد باز
  • برای سایت‌های JS از Selenium با selenium-wire یا افزونه احراز هویت مشخص شده استفاده می‌شود
  • در کد منطق تلاش مجدد و چرخش پروکسی در صورت خطاهای 403/429 وجود دارد
  • نتایج میانی هر N رکورد در Google Drive ذخیره می‌شوند
  • تایم‌اوت‌های درخواست با توجه به تأخیرهای ممکن در شبکه ابری افزایش یافته‌اند
  • موازی بودن درخواست‌ها محدود شده است تا به محدودیت‌های اتصالات خروجی Colab برخورد نکند
  • برای وظایف تولیدی پیش‌بینی شده است که اسکریپت به یک سرور جداگانه با IP ثابت منتقل شود

نتیجه‌گیری

Google Colab و Jupyter ابری برای توسعه سریع و آزمایش منطق پارسر بسیار مناسب هستند، اما به دلیل IP‌های عمومی مراکز داده تقریباً همیشه در مراحل اولیه نیاز به پروکسی دارند. برای سایت‌های ساده بدون حفاظت تهاجمی، پروکسی‌های مراکز داده کافی هستند، و برای پارس کردن بازارها، موتورهای جستجو و شبکه‌های اجتماعی، IP‌های مسکونی و موبایلی که کمتر تحت فیلترهای ASN قرار می‌گیرند، قابل اعتمادتر عمل می‌کنند.

اگر شما قصد دارید نظارت منظم بر قیمت‌ها در Wildberries یا Ozon را مستقیماً از Colab انجام دهید، توصیه می‌کنیم با پروکسی‌های مسکونی شروع کنید — آن‌ها دسترسی پایداری بدون مسدودیت‌های مکرر فراهم می‌کنند، و برای اسکریپت‌های آزمایشی یک‌باره می‌توان از پروکسی‌های مراکز داده با هزینه کمتر استفاده کرد و آن‌ها را از طریق همان روش با requests یا Selenium متصل کرد.