استخراج اطلاعات از وب (وب اسکرپینگ) با پایتون و سلنیوم

با زبان برنامه نویسی پایتون قادر خواهیم بود داده ها و اطلاعات را از وب سایت ها بازیابی، پردازش و با عناصر یک وب سایت تعامل کنیم. وب اسکرپینگ ابزاری برای تبدیل داده های بدون ساختار در وب به داده های ساخت یافته قابل خواندن برای ماشین و آماده برای تجزیه و تحلیل است. در اینجا سعی می کنیم به بخشی از توانایی های زبان برنامه نویسی پایتون و کتابخانه سلنیوم اشاره کنیم.Web Scraping with Pythonابتدا باید پایتون را از آدرس زیر مرتبط با سیستم عامل مورد نظر دانلود و نصب نماییم.http://www.python.org/download/سپس با ابزار pip کتابخانه سلنیوم را نصب میکنیم (دقت داشته باشیم برای نصب کتابخانه باید اتصال به اینترنت داشته باشیم)pip install seleniumکتابخانه سلنیوم قادر است یک مرورگر وب را برای تعامل با وب سایت مورد نظر ایجاد کند. برای کار با سلنیوم، باید به درایور مرورگر دسترسی داشته باشیم. بطور پیش فرض درایورهای Chrome ، Firefox ، Edge و Safari موجود است.برای استفاده از هر کدام می توانیم درایور مورد نظر را را دانلود و سپس در برنامه خود آدرس دهی کنیم. اطلاعات بیشتر در آدرس زیر موجود می باشد.https://selenium.dev/documentation/en/webdriver/driver_requirements/خوب حالا زمان نوشتن یک برنامه ساده با پایتون و سلنیوم فرا رسیده است. (در اینجا از داریور کروم استفاده شده است)from selenium.webdriver import Chrome driver = Chrome()حالا در ادامه می خواهیم وب سایت اینستاگرام را باز کنیم به و با استفاده از برنامه بصورت خودکار لاگین کنیم.هی استفاده نمایید. driver = Chrome(executable_path='/path/to/chromedriver')حالا در ادامه میخواهیم سایت #اینستاگرام را باز کنیم و با استفاده از برنامه بصورت خودکار لاگین کنیم.ابتدا باید صفحه مورد نظر را لود کنیم که به سادگی با دستور get این عملیات را انجام می دهیم.driver.get('https://www.instagram.com/accounts/login/')سپس بخش هایی را که باید با پست الکترونیک یا نام کاربری و کلمه عبور تکمیل شوند در صفحه لود شده پیدا و مقادیر مورد نظر خود را در آن درج نماییم.emailInput = driver.find_elements_by_css_selector('form input')[0] passwordInput = driver.find_elements_by_css_selector('form input')[1]شاید این بخش سخت ترین قسمت کار باشد و به آشنایی با برنامه نویسی در بستر وب نیاز دارد. با این حال روشی که را در اینجا آموزش می دهیم و استفاده می کنیم تا اندازه زیادی شما را از پیچیدگی های بررسی کد های HTML بی نیاز می کند.چند روش برای پیدا کردن عناصر در کتابخانه سلنیوم وجود دارد.find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selectorاگر بخواهیم چند عنصر را پیدا کنیم همین دستورات با یک s استفاده می شوند که مشخص است خروجی توابع نیز یک چندگانه یا لیست می باشد.find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selectorاطلاعات بیشتر را از لینک زیر می توانید بدست آوردیدhttps://selenium-python.readthedocs.io/locating-elements.htmlاگر نام یا شناسه عنصر مورد نظر را داشته باشیم بهترین روش استفاده از توابع find_element_by_id و find_element_by_name می باشد، ولی هنگامی که id و name مناسب وجود نداشته باشد می توان از تابع find_element_by_xpath استفاده نمود. در واقع xpath برای اسناد XML و XHTML استفاده می شود ولی برای شناسایی عناصر بصورت مطلق یا نسبی و حتی با id و name نیز می توان بصورت مشخص از آن استفاده نمود. به مثال زیر توجه کنید.<html> <body> <form id=&quotloginForm&quot> <input name=&quotusername&quot type=&quottext&quot /> <input name=&quotpassword&quot type=&quotpassword&quot /> <input name=&quotcontinue&quot type=&quotsubmit&quot value=&quotLogin&quot /> <input name=&quotcontinue&quot type=&quotbutton&quot value=&quotClear&quot /> </form> </body> <html>آدرس دهی عناصر بصورت زیر می باشد.login_form = driver.find_element_by_xpath(&quot/html/body/form[1]&quot) login_form = driver.find_element_by_xpath(&quot//form[1]&quot) login_form = driver.find_element_by_xpath(&quot//form[@id='loginForm']&quot)شاید یک مقدار گیج کننده باشد به همین خاطر پیشنهاد خیلی ساده استفاده از addon هاست که با یک کلیک بتوان آرگومان تابع را بدست آورد. دو تا از بهترین addon ها Ranorex Selocity وxPath Finder هستند. با نصب این addon ها روی مرورگر می توانید xpath یک عنصر را بدست آوردید.همانطور که در تصویر هم مشخص هست می توان مقدار CSS را برای تابع css_selector نیز بدست آورد.حالا وقتش رسیده که یک برنامه برای ورود خودکار به صفحه لاگین سایت اینستاگرام بطور نمونه بنویسیم و سپس اطلاعات یک کاربر را از صفحه اش استخراج می کنیم.ابتدا با استفاده از Ranorex Selocity عناصر username و password را بدست آورده و نام کاربری و کلمه عبور را با تابع send_keys اضافه می کنیم و سپس کلید Enter را ارسال کرده تا فرم ارسال شود.from selenium.webdriver import Chrome from selenium.webdriver.common.keys import Keys driver = Chrome(executable_path=&quot./chromedriver&quot) driver.get(&quothttps://www.instagram.com/accounts/login/?next=/explore/&quot) xpath_email = &quot/html//div[@id='react-root']/section/main[@role='main']//article[@class='agXmL']//form[@method='post']//input[@name='username']&quot xpath_password = &quot/html//div[@id='react-root']/section/main[@role='main']//article[@class='agXmL']//form[@method='post']//input[@name='password']&quot emailInput = driver.find_element_by_xpath(xpath_email) passwordInput = driver.find_element_by_xpath(xpath_password) emailInput.send_keys(&quotemail&quot) passwordInput.send_keys(&quotpassword&quot) passwordInput.send_keys(Keys.ENTER)بعد از لاگین موفق صفحه اینستاگرام virgool.io را لود کرده و مقادیر posts و followers و following را استخراج می نماییم.driver.get(&quothttps://www.instagram.com/virgool.io/&quot) xpath_data = &quot//div[@id='react-root']/section/main[@role='main']//section[@class='zwlfE']/ul&quot data = driver.find_element_by_xpath(xpath_data) print(data.text)خروجی اجرای برنامهامیدوارم این مقاله برای شما مفید بوده باشد.https://www.instagram.com/ehsanjalili/