مقدمه
Jupyter Notebook محیطی تعاملی است که برای توسعه، رفع اشکال و نمونهسازی سریع اسکریپتهای وب بسیار مناسب است. ترکیب Selenium با نوتبوک به شما اجازه میدهد فرایندهای اتوماسیون وب، از استخراج داده تا تست اپلیکیشنهای تحت وب، را مرحلهبهمرحله بسازید و مشاهده کنید. در پایان این مقاله شما یاد میگیرید چگونه محیط را تنظیم کنید، اسکریپتهای Selenium را داخل سلها اجرا و دیباگ کنید، از Webdriver Manager برای مدیریت درایورها استفاده کنید و نکات امنیتی و بهترینروشهای عملی را پیادهسازی کنید.
راهاندازی محیط
پیشنیازها: Python و pip نصب باشند. سپس دو بسته اصلی را نصب کنید: Jupyter و Selenium. برای مدیریت خودکار Chromedriver بهتر است webdriver-manager را هم نصب کنید.
pip install jupyter selenium webdriver-manager pillowتوضیح: این دستورها پکیجهای لازم را نصب میکنند. ورودی این دستورها همان اجرای خط فرمان است؛ خروجی نصب بستهها روی سیستم شماست. پس از نصب، با jupyter notebook سرور محلی را اجرا کنید.
اسکریپینگ پایه داخل نوتبوک
در Jupyter کد را در سلها مینویسیم و هر سل بهصورت مستقل اجرا میشود. این رفتار برای توسعه سریع بسیار مفید است: Selenium مرورگر را باز میکند و تا زمانی که شما سل مربوطه را اجرا نکردهاید، مرورگر بسته نخواهد شد.
نمونه ساده سه سل:
Cell 1 — واردات:
from selenium import webdriver
from selenium.webdriver.common.by import By
توضیح: این سل ماژولهای پایه Selenium را وارد میکند. ورودی: فایل پایتون شما؛ خروجی: بارگذاری کلاسهای مورد نیاز در فضای نام نوتبوک.
Cell 2 — باز کردن مرورگر و رفتن به صفحه:
driver = webdriver.Chrome()
driver.get("https://quotes.toscrape.com")
توضیح خطبهخط: webdriver.Chrome() یک نمونه از کنترلکننده مرورگر Chrome میسازد. سپس driver.get(url) صفحهٔ هدف را بارگذاری میکند. اگر Chromedriver با نسخهٔ مرورگر همخوانی نداشته باشد با خطا مواجه میشوید.
Cell 3 — بستن مرورگر:
driver.quit()
توضیح: این خط مرورگر و تمام منابع مربوط به WebDriver را آزاد میکند. همواره در پایان اجرای اسکریپت یا هنگام خطا این سل را اجرا کنید.
استفاده از Webdriver Manager
مشکل رایج: بهروزرسانی مرورگر باعث ناسازگاری با Chromedriver میشود. webdriver-manager این مشکل را حل میکند و درایور سازگار را بهطور خودکار دانلود و نصب میکند.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("https://quotes.toscrape.com")
شرح: ChromeDriverManager().install() مسیر فایل chromedriver را برمیگرداند. سپس یک Service ساخته و به WebDriver پاس داده میشود. توجه: در Selenium جدید نمیتوان مسیر درایور را مستقیماً به webdriver.Chrome() داد؛ باید از کلاس Service استفاده کنید.
نکتهٔ عملی: اگر خطای «Chromedriver executable needs to be in PATH» دریافت کردید، استفاده از Webdriver Manager سادهترین راه حل است.
توسعه تعاملی و استخراج داده
مزیت Jupyter این است که میتوانید سلهای جدید بین ساختار پایه قرار دهید و تعاملات صفحه را مرحلهبهمرحله توسعه دهید. نمونهٔ پیداکردن یک لینک و کلیک کردن:
login_link = driver.find_element(By.CSS_SELECTOR, "a[href='/login']")
login_link.click()
توضیح: find_element یک عنصر DOM را برمیگرداند (در صورت نیافتن استثنا ایجاد میشود). click() روی آن عنصر کلیک میکند. ورودی: سلکتور؛ خروجی: یک WebElement که میتوان روی آن عملیات انجام داد.
برای دریافت مقادیر از ورودیها:
username = driver.find_element(By.CSS_SELECTOR, "input[id='username']")
password = driver.find_element(By.CSS_SELECTOR, "input[id='password']")
username.send_keys("my_username")
password.send_keys("my_password")
نکات امنیتی: هرگز مقادیر واقعی رمز را در نوتبوک قرار ندهید (بخش امنیت را ببینید).
انتظارها (Waits) و مدیریت عناصر دینامیک
وبسایتهای امروزی محتوای خود را بهصورت دینامیک بارگذاری میکنند؛ استفاده از زمانخواب ثابت (time.sleep) ناپایدار و ناکارآمد است. بجای آن از Explicit Wait با WebDriverWait و شروط مناسب استفاده کنید:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.quote")))
شرح: این کد تا ۱۰ ثانیه صبر میکند تا عنصر مشخص شده در DOM حاضر شود. مزایا: پایداری بیشتر و کاهش false-negative ناشی از بارگذاری کند.
نمایش تصویری و دیباگ داخل نوتبوک
میتوانید از Selenium اسکرینشات بگیرید و داخل نوتبوک نمایش دهید—این برای دیباگ بسیار مفید است.
from PIL import Image
from IPython.display import display
# گرفتن اسکرینشات
driver.save_screenshot("page.png")
image = Image.open("page.png")
# نمایش تصویر داخل نوتبوک
display(image)
شرح: این روش تصویر صفحهٔ کنترلشده توسط Selenium را ذخیره و سپس با Pillow و IPython نمایش میدهد. خروجی: تصویر در سل نمایش داده میشود که وضعیت DOM و استایلها را نشان میدهد.
Magic Commands در Jupyter برای Selenium
جادیههای جادویی Jupyter کمک میکنند خطوط یا سلها را پروفایل و دیباگ کنید. مثالها:
%timeit driver.get("https://quotes.toscrape.com")
%debug driver.get("https://quotes.toscrape.com/login")
توضیح: %timeit زمان اجرای یک خط را اندازهگیری میکند و %debug بهصورت تعاملی وارد مد اشکالزدایی میشود. این دستورات برای شناسایی نقاط کند یا بررسی رفتار یک خط مفیدند.
دیباگ و نمایش خطاها
اگر سل با خطا مواجه شد، نوتبوک آن را مشخص کرده و شما میتوانید بدون نیاز به اجرای کل برنامه، سلهای بعدی را اجرا یا اصلاح کنید. نکات:
- هر سل که منبع خطا است را مجدداً اجرا کنید و trace را مرور کنید.
- در صورت مواجهه با ElementNotFound از انتظار صریح استفاده کنید.
- برای تست محلی از حالت headless استفاده نکنید مگر لازم باشد؛ چون headless گاهی تفاوت رندر ایجاد میکند و باعث خطاهای غیرمنتظره میشود.
خطاها و بهترینروشها
- مدیریت اعتبارنامهها: هرگز نامکاربری/رمز عبور را در نوتبوک هاردکد نکنید. از فایلهای پیکربندی محلی (.env یا .json) یا سیستم مدیریت اسرار استفاده کنید و آنها را از کنترل نسخه استثنا کنید.
- Retry و تحمل خطا: برای درخواستهایی که ممکن است ناپایدار باشند، مکانیزم retry ساده پیاده کنید یا از decoratorهایی مانند tenacity استفاده کنید.
- همزمانی و performance: Selenium برای اجرای همزمان مقیاسپذیر مناسب نیست؛ برای استخراج مقادیر زیاد از Requests/Async + پارسرهایی مثل BeautifulSoup یا Scrapy استفاده کنید و Selenium را فقط برای جاهایی که نیاز به جاوااسکریپت رندر شده است بهکار ببرید.
- پاکسازی منابع: همیشه در بلاکهای try/finally یا context manager (اگر پیادهسازی کردید) از driver.quit() اطمینان پیدا کنید تا پروسههای معلق Chrome باقی نمانند.
مثال: الگوی مقاوم استخراج
from selenium.common.exceptions import TimeoutException
try:
wait = WebDriverWait(driver, 10)
quotes = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.quote")))
for q in quotes:
text = q.find_element(By.CSS_SELECTOR, "span.text").text
author = q.find_element(By.CSS_SELECTOR, "small.author").text
print(author, text)
except TimeoutException:
print("عنصرها در بازهٔ زمانی نشان داده نشدند")
finally:
driver.quit()
شرح: این الگو با استفاده از explicit wait و یک بلوک try/except/finally از بروز خطاها جلوگیری میکند و در هر حال driver را پاکسازی میکند.
جمعبندی
Jupyter Notebook محیطی عالی برای توسعه و دیباگ اسکریپتهای Selenium است؛ مخصوصاً برای نمونهسازی، دیدن اسکرینشاتها و اجرای تعاملی سلها. برای کار حرفهای، از webdriver-manager برای مدیریت درایورها، از explicit wait برای پایداری، و از روشهای امن برای نگهداری اعتبارنامه استفاده کنید. حالا تمرین کنید: یک نوتبوک بسازید که یک سایت ساده را مرور کند، اطلاعات را استخراج کند، تصویر صفحه را ذخیره کند و تمام این مراحل را با استفاده از WebDriverWait و مدیریت خطا ایمن کند.
آسان اسکریپ را در گوگل بهعنوان منبع ترجیحی انتخاب کن
مقالههای جدید ما زودتر و پررنگتر در نتایج گوگل و Discover برایت نمایش داده میشود. افزودن از تنظیمات گوگل





