شروع کار با Selenium در پایتون


تقریبا دوسال پیش بود که برای بک اند وب سرویس های تیم MSYTC داشتم ربات های خزنده وب طراحی میکردم. سناریوی گرفتن اطلاعات نماد های بورس از www.tsetmc.com اولش بنظرم ساده بود تا اینکه به یسری مشکل اساسی برخوردم. وقتی داشتم از کتابخونه request و beautifulsoup برای ارسال درخواست و تجزیه template های هر صفحه میکردم با صفحات خالی مواجه میشدم ، دلیلش هم این بود که ریسپانسی که این سایت در لحظه اول از سرور میفرسته شامل اطلاعات نماد و قیمت و... اینا نیست و پس از رندر شدن صفحه بصورت ajax اطلاعات لود میشن ! خب من نمیخواستم timeout بزارم تا اطلاعات لود بشه چون زمان برامون خیلی مهم بود و حتی امکان پذیر هم نبود چون جاوا اسکریپت رو مرورگر میتونه اجرا میکنه و من فقط سورس رو دریافت میکردم. به همین دلیل تصمیم بر این شد با سلنیوم (selenium) این کار رو انجام بدیم. سلنیوم یه ابزار قدرتمندی هست برای اجرای صفحات وب و گرفتن اطلاعات از صفحات که با استفاده از وب درایور مرورگر هایی که خودش داره و تو خیلی از زبان ها ساپورت میشه امکان web scraping رو برامون خیلی راحت میکنه.




کتابخونه سلنیوم و وابستگی هاش باید نصب بشه که با دستور:

pip install selenium 

میتونیم این کارو به سادگی انجام بدیم.

با این دستور تو پایتون webdriver رو ایمپورت میکنیم داخل ماژولمون:

from selenium import webdriver

دستور زیر از روی وب درایور مروگری که انتخاب میکنیم برامون یک نسخه وب درایو میسازه:
وب درایور هر مروگر رو نسبت به ورژنی که انتخاب میکنین تو اینترنت میتونین پیدا کنین برای مثال لینک وب درایور های کروم

driver = webdriver.Chrome()

درایور رو دانلود کنین و بزارین کنار ماژولی که ساختین ، اگه درایور تو مسیر دیگه ایی باشه میتونین به عنوان پارامتر به Chrome بدین:


driver = webdriver.Chrome(&quot// path //&quot)


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

driver.get(&quothttp://www.python.org&quot)

تو این مرحله اگه لینک اشتباه باشه ارور میده .
نکته دیگه ای که درمورد سلنیوم هست اینه که بالاتر هم اشاره کردم از روی وب درایوری که دانلود کردین یه نمونه از مرورگر برامون باز میشه ، منظور اینه که همه ی کوکی ها و سشن ها و هیستوری هایی که رو مرورگر خودتون دارین روی وب درایور سلنیوم نیست و حتی اگه رو وب درایور هم لاگین کنین و دوباره وب درایور رو باز کنین دیگه کوکی های دردایور قبلی رو ندارین!
برای مدیریت این کار باید کوکی هارو با استفاده از کتابخونه هایی مثل pickleسیو کنین و تو استارت بعدی ریلود کنین که تو مقاله هایی بعدی درموردش بیشتر صحبت میکنم.

سلکتور های زیادی تو سلنیوم هست که من تو این مقاله قصد دارم به کاربردی ترین هاش اشاره کنم
اولین سلکتور پیدا کردن المنت با آی دی اون المنت هست که یه تابع داخل درایوری که ساختیم برای این کار هست:

driver.find_element_by_id(&quotid&quot)

برای فهم بهتر این رو مثل همون shadow do داخل جاوا اسکرپیت در نظر بگیرین که برامون نود های html میداد (هرچند ربطی بهش نداره ولی برای درک بهتر گفتم)

مشابه همون جاوا اسکریپت اکه یه متنی داخل این تگ باشه میتونیم با پروپرتی text بهش دسترسی داشته باشیم به این شکل:

inner_text = driver.find_element_by_id(&quotid&quot).text

سلکتور بعدی پیدا کردن المنت (ها) با اسم تگشون هست که به این شکل استفاده میشه:

driver.find_element_by_name(&quotp&quot)

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

driver.find_elements_by_name(&quotp&quot)


یه سلکتور دیگه هم انتخاب کردن المنت (ها) با استفاده از نام کلاسشون هست که به همین ترتیب:

driver.find_elements_by_class_name(&quotclass&quot)

در کل تمام توابعی که بجای element نوشته باشه elements یه لیست از المنت های مچ شده رو بهمون میده که میتونیم روش حلقه بزنیم.




خب تو این مثاله میخواستم یه دید کلی از سلنیوم و کلا فضای خزنده های وب بدم چون خیلی عمیقه و ریزه کاری زیاد داره
سلکتور مهم xpath موند که میخوام تو یه مقاله مفصل راجبش حرف بزنم.

مطالعه بیشتر