FA-TOOLS — Header Component
آموزش سلنیوم در پایتون

آموزش سلنیوم در پایتون: راهنمای جامع اتوماسیون وب و اسکرپینگ کاربردی

فهرست مطالب

  • سلنیوم چیست و چه کاربردی در پایتون دارد؟
  • نصب سلنیوم 4 و راه‌اندازی مرورگر
  • روش‌های استخراج و یافتن عناصر در صفحه (Locators)
  • مدیریت انتظار: Implicit Wait در برابر Explicit Wait
  • تعامل کامل با عناصر (کلیک، تایپ، فرم‌ها و اجرا با JS)
  • تکنیک‌های پیشرفته برای دور زدن مکانیزم‌های ضد ربات
  • پروژه عملی: استخراج داده‌ها و ذخیره‌سازی
  • پرسش‌های متداول
  • عیب‌یابی سریع و رفع خطاهای شایع

خلاصه سریع و نکات کلیدی

در این مقاله، صفر تا صد کتابخانه سلنیوم (Selenium 4) در پایتون را فرامی‌گیرید. یاد می‌گیرید چگونه بدون نیاز به دانلود دستی کروم‌درایور مرورگر را هدایت کنید، فرم‌ها را پر کنید، از سد سیستم‌های ضد ربات بگذرید و داده‌های صفحات دینامیک (JavaScript-based) را اسکرپ کرده و ذخیره نمایید.

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

سلنیوم چیست و چه کاربردی در پایتون دارد؟

سلنیوم چیست و چه کاربردی در پایتون دارد؟

سلنیوم (Selenium) یک فریم‌ورک متن‌باز برای اتوماسیون مرورگرهای وب است که دستورات پایتون را به رفتارهای واقعی مرورگر مانند کلیک، اسکرول و تایپ تبدیل می‌کند. برخلاف کتابخانه‌هایی نظیر Requests، سلنیوم موتور جاوا اسکریپت مرورگر را کاملاً اجرا کرده و صفحات تعاملی را پردازش می‌نماید.

استفاده از سلنیوم در پایتون زمانی ضرورت پیدا می‌کند که با وب‌سایت‌های مدرن متکی بر فریم‌ورک‌های SPA (مانند React یا Vue) روبرو هستید. در این صفحات، کدهای HTML اصلی به‌صورت دینامیک توسط کدهای جاوا اسکریپت تولید می‌شوند و کتابخانه‌های ساده استخراج داده قادر به دریافت آن‌ها نیستند. در این حالت می‌توانید از اسنیپت‌های پایتون برای کنترل مرورگر و استخراج داده‌های نهایی استفاده کنید.

نصب سلنیوم 4 و راه‌اندازی مرورگر

نصب سلنیوم 4 و راه‌اندازی مرورگر

نصب سلنیوم ۴ در پایتون بسیار ساده است. در نسخه‌های قدیمی سلنیوم (نسخه ۳ به قبل)، شما مجبور بودید فایل اجرای درایور مرورگر (مانند ChromeDriver) را دستی دانلود کرده و مسیر آن را در سیستم‌عامل مشخص کنید. در سلنیوم ۴، ابزاری به نام Selenium Manager اضافه شده که مدیریت راه‌انداز مرورگر را به‌صورت کاملاً خودکار انجام می‌دهد.

برای نصب کتابخانه سلنیوم، کافی است دستور زیر را در ترمینال یا CMD اجرا کنید:

pip install selenium

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

from selenium import webdriver

# راه‌اندازی مرورگر کروم به صورت خودکار
driver = webdriver.Chrome()

# باز کردن یک وب‌سایت
driver.get("https://example.com")

# دریافت عنوان صفحه
print("عنوان صفحه:", driver.title)

# بستن مرورگر
driver.quit()

روش‌های استخراج و یافتن عناصر در صفحه (Locators)

روش‌های استخراج و یافتن عناصر در صفحه (Locators)

برای تعامل با هر عنصر در صفحه وب (مانند دکمه‌ها، کادرهای متن و لینک‌ها)، ابتدا باید آن را پیدا کنید. در سلنیوم از کلاس By برای تعریف استراتژی جستجو استفاده می‌شود.

شناخت درست ساختار HTML و تگ‌ها به شما کمک می‌کند تا بهترین Locator را برای انتخاب عناصر انتخاب کنید. جدول زیر مقایسه‌ای کاربردی میان استراتژی‌های اصلی جستجوی عناصر ارائه می‌دهد:

روش انتخاب (Locator) کابرد اصلی و میزان پایداری
By.ID سریع‌ترین و مطمئن‌ترین روش؛ برای عناصری که شناسه منحصربه‌فرد دارند.
By.CSS_SELECTOR بسیار سریع و انعطاف‌پذیر؛ مناسب برای استایل‌ها و کلاس‌های پیچیده.
By.XPATH قدرتمندترین روش؛ توانایی پیمایش معکوس در درخت DOM و فیلتر بر اساس متن.
By.NAME / By.CLASS_NAME مناسب برای ورودی‌های فرم و عناصر گروهی با استایل یکسان.

اگر با ساختار انتخابی انتخابگرهای مدرن آشنا باشید، نوشتن کدهای CSS دقیق به شما کمک می‌کند سرعت اجرا را نسبت به XPath‌های سنگین افزایش دهید. در ادامه نمونه کدهای یافتن عنصر را مشاهده می‌کنید:

from selenium.webdriver.common.by import By

# پیدا کردن تک عنصر با ID
username_input = driver.find_element(By.ID, "username")

# پیدا کردن دکمه ارسال با CSS Selector
submit_btn = driver.find_element(By.CSS_SELECTOR, "button.btn-primary")

# پیدا کردن عنصر بر اساس متن دقیق با XPath
element = driver.find_element(By.XPATH, "//button[text()='ارسال']")

# پیدا کردن تمام لینک‌های صفحه
all_links = driver.find_elements(By.TAG_NAME, "a")

مدیریت انتظار: Implicit Wait در برابر Explicit Wait

مدیریت انتظار: Implicit Wait در برابر Explicit Wait

بهترین روش برای مدیریت تاخیر بارگذاری صفحات در سلنیوم، استفاده از Explicit Wait (انتظار صریح) است. استفاده از time.sleep() کندی کدهای شما را به همراه دارد زیرا صرف‌نظر از بارگذاری عنصر، زمان ثابتی را معطل می‌ماند.

در سلنیوم دو نوع مکانیزم انتظار اصلی وجود دارد:

  • Implicit Wait (انتظار ضمنی): یک زمان کل به مرورگر اعلام می‌کنید تا در صورت عدم وجود هر عنصری، تا پایان آن زمان صبور باشد.
  • Explicit Wait (انتظار صریح): مرورگر فقط منتظر یک شرط خاص (مثل قابل کلیک بودن دکمه یا ظاهر شدن متن) می‌ماند و به محض برآورده شدن شرط، ادامه کد بلافاصله اجرا می‌شود.

نمونه پیاده‌سازی حرفه‌ای Explicit Wait:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# تعریف حداکثر ۱۰ ثانیه انتظار
wait = WebDriverWait(driver, 10)

# منتظر ماندن تا زمانی که دکمه قابل کلیک شود
button = wait.until(EC.element_to_be_clickable((By.ID, "submit-btn")))
button.click()

تعامل کامل با عناصر (کلیک، تایپ، فرم‌ها و اجرا با JS)

تعامل کامل با عناصر (کلیک، تایپ، فرم‌ها و اجرا با JS)

پس از یافتن عنصر، نوبت به تعامل با آن می‌رسد. شما می‌توانید متن تایپ کنید، کلیدهای کیبورد (مانند Enter یا Backspace) را فشار دهید یا متون موجود را استخراج کنید.

from selenium.webdriver.common.keys import Keys

# کلیر کردن کادر و ارسال متن
input_box = driver.find_element(By.NAME, "q")
input_box.clear()
input_box.send_keys("آموزش پایتون" + Keys.RETURN)

# خواندن متن یک عنصر
info_text = driver.find_element(By.CLASS_NAME, "info").text
print(info_text)

اجرای کدهای جاوا اسکریپت با سلنیوم

در برخی صفحات، دکمه‌ها توسط عناصر دیگر پوشانده شده‌اند یا اسکرول صفحه برای بارگذاری داده‌های جدید (Infinite Scroll) الزامی است. در این شرایط می‌توانید از توانایی اجرای کدهای جاوا اسکریپت در سلنیوم استفاده کنید.

# اسکرول به انتهای صفحه
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# کلیک مستقیم روی عنصر با جاوااسکریپت (حتی اگر پوشانده شده باشد)
element = driver.find_element(By.ID, "hidden-btn")
driver.execute_script("arguments[0].click();", element)

تکنیک‌های پیشرفته برای دور زدن مکانیزم‌های ضد ربات

بسیاری از وب‌سایت‌های مدرن ابزارهایی مانند Cloudflare یا سیستم‌های اختصاصی تشخیص ربات دارند. مرورگرهایی که توسط سلنیوم باز می‌شوند، متغیری به نام navigator.webdriver = true را در محیط مرورگر افشا می‌کنند که به سایت‌ها اطلاع می‌دهد یک ربات در حال بازدید است.

برای جلوگیری از مسدود شدن و شبیه‌سازی دقیق رفتار کاربر واقعی، رعایت ۳ نکته زیر الزامی است:

  1. غیرفعال کردن پرچم اتوماسیون: حذف متغیر navigator.webdriver از مرورگر.
  2. استفاده از User-Agent واقعی: تنظیم یک هدر مرورگر طبیعی و به‌روز.
  3. حالت Headless جدید: در سلنیوم ۴ از --headless=new استفاده کنید تا رفتار مرورگر کاملاً شبیه حالت گرافیکی باشد.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()

# تنظیم حالت بدون رابط گرافیکی مدرن
options.add_argument("--headless=new")

# غیرفعال کردن پیام کنترل اتوماسیون
options.add_argument("--disable-blink-features=AutomationControlled")

# تنظیم هدر کاربر
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36")

driver = webdriver.Chrome(options=options)

# حذف ردپای سلنیوم در جاوااسکریپت
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})

پروژه عملی: استخراج داده‌ها و ذخیره‌سازی

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

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

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import openpyxl

# ساخت فایل اکسل
wb = openpyxl.Workbook()
ws = wb.active
ws.append(["عنوان محصول", "قیمت"])

# راه‌اندازی مرورگر
driver = webdriver.Chrome()
driver.get("https://quotes.toscrape.com/")

try:
    wait = WebDriverWait(driver, 10)
    quotes = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "quote")))
    
    for quote in quotes:
        text = quote.find_element(By.CLASS_NAME, "text").text
        author = quote.find_element(By.CLASS_NAME, "author").text
        ws.append([text, author])
        
    wb.save("quotes.xlsx")
    print("داده‌ها با موفقیت ذخیره شدند.")
finally:
    driver.quit()

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

پرسش‌های متداول

تفاوت اصلی سلنیوم و BeautifulSoup چیست؟

BeautifulSoup فقط کدهای استاتیک HTML را پارس می‌کند و قادر به اجرای جاوااسکریپت نیست. اما سلنیوم یک مرورگر کامل را روشن کرده و کدهای سنگین JS را کاملاً رندر می‌کند.

چگونه برنامه سلنیوم را بدون باز شدن پنجره مرورگر اجرا کنیم؟

کافی است در گزینه‌های مرورگر (Options) آرگومان --headless=new را اضافه کنید تا اجرای اسکریپت به صورت پس‌زمینه انجام شود.

آیا در سلنیوم ۴ هنوز به دانلود کروم‌درایور نیاز داریم؟

خیر، سلنیوم ۴ از قابلیت Selenium Manager استفاده می‌کند که نسخه مرورگر شما را تشخیص داده و درایور مناسب را خودکار دانلود و مدیریت می‌نماید.

چرا اجرای سلنیوم نسبت به درخواست‌های HTTP کندتر است؟

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

عیب‌یابی سریع و رفع خطاهای شایع

خطای NoSuchElementException

دلیل: عنصر هنوز در DOM بارگذاری نشده یا Locator نوشته شده اشتباه است.
راه‌حل: بجای فراخوانی مستقیم، از WebDriverWait و EC.presence_of_element_located استفاده کنید.

خطای ElementClickInterceptedException

دلیل: عنصر مورد نظر زیر یک مدال، بنر کوکی یا لایه شفاف دیگر قرار گرفته است.
راه‌حل: عنصر رویی را ببندید، یا کلیک را با استفاده از driver.execute_script("arguments[0].click();", element) انجام دهید.

خطای SSL Certificate Error

دلیل: گواهی امنیتی سایت مقصد نامعتبر یا منقضی شده است.
راه‌حل: جهت نادیده گرفتن خطاها در اتوماسیون، آرگومان options.add_argument('--ignore-certificate-errors') را به مرورگر اضافه کنید. در صورت نیاز به آشنایی با اهمیت امنیت گواهی‌ها در وب، مطالعه مقاله تنظیمات SSL و امنیت اتصال مفید خواهد بود.

سوالات متداول

آیا در سلنیوم ۴ همچنان نیاز به دانلود دستی کروم درایور داریم؟

خیر، در سلنیوم ۴ ابزاری به نام Selenium Manager اضافه شده که دانلود و تنظیم راه‌انداز مرورگرها را به‌صورت کاملاً خودکار و بدون مداخله دستی انجام می‌دهد.

تفاوت اصلی Explicit Wait و Implicit Wait در سلنیوم چیست؟

در Explicit Wait برنامه فقط منتظر برآورده شدن یک شرط خاص (مانند قابل کلیک بودن عنصر) می‌ماند، در حالی که Implicit Wait یک زمان کلی برای یافتن تمامی عناصر در صفحه اعمال می‌کند.

چرا سلنیوم برای اسکرپینگ سایت‌های تعاملی مناسب‌تر از کتابخانه Requests است؟

زیرا سلنیوم موتور جاوا اسکریپت مرورگر را کاملاً اجرا کرده و صفحات دینامیک (مانند React و Vue) را پردازش می‌کند، اما Requests تنها HTML اولیه را دریافت می‌نماید.

بهترین روش برای انتخاب و استخراج عناصر در سلنیوم چیست؟

روش By.ID سریع‌ترین و مطمئن‌ترین راه است. در صورت عدم وجود شناسه، استفاده از CSS Selector به دلیل سرعت بالا و XPath به دلیل انعطاف‌پذیری فوق‌العاده پیشنهاد می‌شود.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *