خانه/مقالات/غیرفعال‌سازی تصاویر برای اسکریپینگ با Selenium
برنامه نویسی
سلنیوم
برگشت به مقاله‌ها

غیرفعال‌سازی تصاویر برای اسکریپینگ با Selenium

غیرفعال‌سازی تصاویر برای اسکریپینگ با Selenium
در این راهنمای عملی برای توسعه‌دهندگان پایتون، سه روش برای غیرفعال‌سازی بارگذاری تصاویر در Selenium توضیح داده شده است: استفاده از آرگومان‌های Blink، تنظیمات experimental (prefs) و فرمان‌های CDP. هر روش با مثال کد، توضیح خط‌به‌خط، نکات پرفورمنس و هشدارهای عملی همراه شده تا بتوانید به‌سرعت اسکریپرهای سبک‌تر و پایدارتر بسازید.
آسان اسکریپ آسان اسکریپ
1405-05-31

مقدمه

در اسکریپینگ با Selenium، بارگذاری تصاویر می‌تواند زمان پاسخ و مصرف پهنای‌باند را به‌طرز قابل‌توجهی افزایش دهد. اگر هدف شما جمع‌آوری متن یا داده‌های ساختاری است و نیاز به دید انسانی یا اسکرین‌شات ندارید، غیرفعال‌کردن تصاویر باعث افزایش سرعت، کاهش هزینه پهنای‌باند و پایداری بیشتر اسکریپرها می‌شود. در این مقاله یاد می‌گیرید سه روش عملی برای جلوگیری از بارگذاری تصاویر در مرورگرهای مبتنی بر Chromium با Selenium (نسخهٔ جدید) استفاده کنید، هر روش را خط‌به‌خط شرح می‌دهیم و نکات مربوط به سازگاری، خطاها و بهترین شیوه‌ها را بررسی می‌کنیم.

روش اول — استفاده از Blink settings (اضافه‌کردن آرگومان)

ایدهٔ کلی: به جای تغییر تنظیمات پروفایل، از آرگومان کروم استفاده می‌کنیم تا موتور Blink به‌صورت کلی تصاویر را غیرفعال کند. این روش ساده و سریع است و در بسیاری از نسخه‌های Chromium کار می‌کند.

کد نمونه (Selenium 4، استفاده از Options):

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

options = Options()
# غیرفعال‌سازی تصاویر در سطح Blink
options.add_argument('--blink-settings=imagesEnabled=false')

driver = webdriver.Chrome(options=options)
try:
    driver.get('https://example.com')
    # پردازش صفحه، استخراج داده‌ها
finally:
    driver.quit()

توضیح ورودی/خروجی و نقش هر بخش:

  • Options(): نگهدارندهٔ گزینه‌های مرورگر.

  • add_argument('--blink-settings=imagesEnabled=false'): آرگومانی که به کروم پاس داده می‌شود تا بارگذاری تصاویر را غیرفعال کند.

  • در پایان webdriver.Chrome(options=options) یک جلسه مرورگر جدید با آن تنظیمات باز می‌کند. خروجی تابع یک شیٔ راننده است که با آن صفحات را باز و عناصر را استخراج می‌کنید.

نکات عملی: این روش خیلی ساده است اما در برخی نسخه‌های کروم یا در حالت headless ممکن است رفتار متفاوتی داشته باشد. اگر از نسخهٔ قدیمی Selenium یا الگوهای متفاوت استفاده می‌کنید، ممکن است پارامتر chrome_options به‌کار رود اما در Selenium 4 ترجیح داده می‌شود از options استفاده کنید.

روش دوم — استفاده از Experimental Options (prefs)

ایدهٔ کلی: با استفاده از تنظیمات پروفایل مرورگر (prefs) می‌توان به‌طور دقیق‌تر تعیین کرد که چه نوع محتوا‌هایی بارگذاری نشوند. مقدار متداول برای تصاویر، مقدار 2 است که نشان‌دهندهٔ بلوکه‌کردن است.

کد نمونه:

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

options = Options()
# مقدار 2 یعنی مسدودسازی تصاویر
prefs = {"profile.managed_default_content_settings.images": 2}
options.add_experimental_option('prefs', prefs)

driver = webdriver.Chrome(options=options)
try:
    driver.get('https://example.com')
    # استخراج داده‌ها
finally:
    driver.quit()

توضیح:

  • add_experimental_option('prefs', ...) تنظیمات پروفایل را اصلاح می‌کند. این راهکار معمولاً در Chromium/Chrome کار می‌کند.

  • مزیت: کنترل دقیق‌تر و قابل ترکیب با سایر prefs (مثلاً مسدودسازی دوربین یا موقعیت مکانی).

روش سوم — استفاده از CDP (Chrome DevTools Protocol)

ایدهٔ کلی: از کانال DevTools برای بلاک‌کردن نوع خاصی از درخواست‌ها یا URLها استفاده کنیم. این روش انعطاف‌پذیری بیشتری دارد و مخصوصاً در Selenium 4 که API برای اجرای دستورات CDP فراهم شده، قدرتمند است.

کد نمونه (مسدودسازی تصاویر بر اساس پسوند):

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

options = Options()
options.add_argument('--headless=new')  # اختیاری: headless جدید

driver = webdriver.Chrome(options=options)
try:
    # فعال‌سازی شبکه و ثبت URLهای مسدود
    driver.execute_cdp_cmd('Network.enable', {})
    driver.execute_cdp_cmd('Network.setBlockedURLs', {"urls": ["*.png", "*.jpg", "*.jpeg", "*.gif"]})

    driver.get('https://example.com')
    # اینجا درخواست‌هایی که با این الگوها تطابق دارند بلوکه می‌شوند
finally:
    driver.quit()

توضیح خط‌به‌خط:

  1. execute_cdp_cmd('Network.enable', {}): اتصال به زیرسیستم شبکه در DevTools را فعال می‌کند تا دستورات بعدی اعمال شوند.

  2. execute_cdp_cmd('Network.setBlockedURLs', {{"urls": [...]}}): فهرستی از الگوهای URL را که باید بلوکه شوند مشخص می‌کند؛ این الگوها معمولاً با wildcard کار می‌کنند.

نکات: این روش می‌تواند دقیق‌تر از prefs باشد و برای بلوک‌کردن فایل‌های خاص یا مسیرهای CDN مفید است. با این حال برخی سایت‌ها منابع را با پسوندهای غیرمعمول ارسال می‌کنند یا از داده‌های inlined base64 استفاده می‌کنند که به این روش واکنشی نشان نخواهند داد.

ترکیب روش‌ها و رفع اشکال

اگر یک روش کار نکرد، می‌توانید چند روش را ترکیب کنید (مثلاً Blink + prefs یا CDP همراه با prefs). نمونهٔ ترکیبی:

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

options = Options()
options.add_argument('--blink-settings=imagesEnabled=false')
options.add_experimental_option('prefs', {"profile.managed_default_content_settings.images": 2})

driver = webdriver.Chrome(options=options)
try:
    driver.execute_cdp_cmd('Network.enable', {})
    driver.execute_cdp_cmd('Network.setBlockedURLs', {"urls": ["*.png", "*.jpg"]})
    driver.get('https://example.com')
finally:
    driver.quit()

نکات رفع اشکال:

  • برخی سایت‌ها تصاویر را به‌صورت inline یا با داده‌های Base64 ارسال می‌کنند؛ این موارد با مسدودسازی URL قابل جلوگیری نیست.

  • در حالت headless/GUI تفاوت رفتار ممکن است وجود داشته باشد — تست روی هر دو حالت ضروری است.

  • نسخه‌های مختلف Chrome/Chromium و درایور (chromedriver) رفتار متفاوتی نشان می‌دهند؛ همیشه نسخه‌ها را همگام نگه دارید.

  • برای Remote WebDriver یا Selenoid/‌Grid ممکن است نیاز به ارسال capability یا تنظیمات مخصوص سرور داشته باشید؛ در آن حالت گزینه‌ها را به capability منتقل کنید یا از CDP سرور استفاده کنید.

عملکرد، امنیت و بهترین شیوه‌ها

چند توصیهٔ عملی برای اسکریپرهای پایتون:

  • همیشه در پایان یا در بلوک finally از driver.quit() استفاده کنید تا پروسس‌های مرورگر نشت نکنند.

  • برای افزایش پایداری از مکانیزم‌های انتظار (explicit waits) به‌جای time.sleep استفاده کنید تا عناصر پس از لود محتوای غیرتصویری در دسترس قرار بگیرند.

  • در مواقعی که نیاز به اسکرین‌شات یا تعامل visual دارید، تصاویر را غیرفعال نکنید یا به‌صورت پویا این تنظیم را تغییر دهید.

  • از retry، backoff و مدیریت خطا برای مقابله با خطاهای موقت شبکه استفاده کنید.

  • مسائل اخلاقی و حقوقی را در نظر بگیرید—مطالعهٔ فایل robots.txt و شرایط استفادهٔ سایت‌ها پیش از اجرای اسکریپینگ در حجم بالا ضروری است.

  • غیرفعال‌کردن تصاویر ممکن است رفتار جاوااسکریپت یا CSS را تغییر دهد؛ حتماً تست‌هایی برای اطمینان از صحت داده‌های استخراجی انجام دهید.

زمان‌بندی، مقیاس و نکات نهایی

وقتی اسکریپر را برای تولید در مقیاس آماده می‌کنید، به این موارد توجه کنید:

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

  • مبادا از ترکیب چند روش استفاده کنید که با گذر زمان باعث پیچیدگی نگهداری شود؛ ابتدا ساده‌ترین روش را تست کرده و سپس در صورت نیاز به بهبود، روش‌های پیچیده‌تر اضافه کنید.

  • برای مشاهدهٔ کامل اجزای صفحه (مثلاً وقتی نیاز به داده‌های رندرشده توسط جاوااسکریپت دارید) از CDP برای کنترل دقیق شبکه و پاسخ‌ها استفاده کنید.

جمع‌بندی

غیرفعال‌کردن تصاویر در Selenium یکی از ساده‌ترین و مؤثرترین راه‌ها برای بهینه‌سازی اسکریپ‌های وب است. سه روش اصلی عبارت‌اند از: استفاده از blink-settings، تنظیمات experimental prefs و کنترل از طریق CDP. هر روش مزایا و محدودیت‌های خودش را دارد؛ برای بهترین نتیجه روش ساده را ابتدا تست کنید و سپس در صورت نیاز CDP یا ترکیب روش‌ها را به‌کار ببرید. در نهایت مطمئن شوید که تست‌پوشش کافی برای سناریوهای مختلف دارید و نکات امنیتی و اخلاقی را رعایت می‌کنید.

مطالب مرتبط

مقاله‌های مرتبط