1. Dinamik elementləri anlamaq
Gəlin dinamik kontentin təbiətinə qısa bir ekskursla başlayaq. Təsəvvür edin ki, bir saytdasınız və səhifəni aşağı çəkdikdə daha çox məlumat görünür, sanki sehrli uçan xalçanın üzərinə minmisiniz, xalça davamlı olaraq genişlənir və siz onunla uça bilirsiniz. Buna tənbəl yükləmə və ya "lazy loading" deyilir — ehtiyatları qənaətlə istifadə etməyə imkan verən və kontenti yalnız ehtiyac olduqda yükləyən bir fəndir. Belə hallarda statik HTML-ə güvənmək, səhər kofesini sizin üçün pişiyinizin gətirəcəyinə ümid etmək kimidir.
Dinamik elementlər nədir?
Dinamik elementlər — bunlar veb səhifənin bütün səhifəni yeniləməyə ehtiyac qalmadan dəyişən hissələridir. Onlar AJAX sorğuları vasitəsilə yüklənə və ya JavaScript vasitəsilə səhifəyə daxil edilə bilər. Belə elementlərlə işləmək üçün bir neçə strategiyanı mənimsəmək vacibdir ki, tətbiqiniz həmin kontent qədər dinamik olsun.
2. Qarşılıqlı əlaqə strategiyaları
Gəlin praktik sehrə başlayaq. Dinamik elementləri işləmək üçün bizə belə alətlər lazımdır ki, başa düşsünlər: "Həyat — hərəkətdir və mən buna hazıram". Bizim sehrli arsenalımızda Selenium olacaq, çünki o, brauzer ilə demək olar ki, insan kimi qarşılıqlı əlaqəyə imkan verir.
AJAX sorğularla iş
AJAX — bu, veb-səhifənin bir hissəsini tam yükləmədən yeniləməyə imkan verən texnologiyadır. İstifadəçilər üçün bu rahatdır, amma skript tərtibatçıları üçün bir az çətinlik yaradır. Amma, bizim gizli silahımız var — Selenium-dən WebDriverWait və expected_conditions.
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
# Driver-i qurmaq
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")
# Elementin görünməsini gözləmək
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic_element_id"))
)
print(element.text)
finally:
driver.quit()
Gözləmə metodlarının istifadəsi
Dinamik elementlərlə işləyərkən brauzerə "istədiyin vəziyyətə çatmaq" üçün vaxt vermək vacibdir. WebDriverWait
kimi gözləmə metodları və expected_conditions
ilə birlikdə bizə lazım olan bütün elementlərin yüklənməsini sakitliklə gözləməyə imkan verir. Bu, özünü idman zalına sürükləmək kimidir — vaxt tələb edir, amma nəticə dəyərlidir.
Nümunələr:
-
presence_of_element_located
— element DOM-da görünənə qədər gözləyir. -
visibility_of_element_located
— element görünən olmasına qədər gözləyir. -
element_to_be_clickable
— element kliklənə bilən vəziyyətə gələnə qədər gözləyir.
Məsələn, düymənin kliklənə bilən vəziyyətə gəlməsini necə gözləmək olar:
button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()
Səhifənin skroll edilməsi
Əgər kontentiniz skroll edilərkən yüklənirsə, sizə "skrolling" sənəti lazım olacaq. Selenium JavaScript istifadə edərək skroll etməyə imkan verir, bu isə yeni məlumatları yükləməyə kömək edəcək.
# Səhifənin sonuna qədər skroll etmək
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Bütün kontenti yükləmək üçün skroll etməyi dövrədə tətbiq etməyə çalışın:
SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Səhifənin kontenti yükləməsi üçün gözləyin
WebDriverWait(driver, SCROLL_PAUSE_TIME)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
3. Dinamik elementlərlə təcrübədən nümunələr
İndi, gözləməyi və müşahidə etməyi öyrəndiyimiz üçün, bu bacarıqları praktikada tətbiq etməyin vaxtıdır və bütün bu dinamik məlumatları "ələ keçirməyi" sınayaq.
Təsəvvür edək ki, bizdə mallar səhifəsi var və bu səhifə aşağıya doğru fırladıldıqda yüklənir. Bizə hər məhsulun adını və qiymətini çıxarmaq lazımdır:
products = []
while True:
# Aşağıya fırlatma
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Yeni elementlərin yüklənməsini gözləmək
WebDriverWait(driver, SCROLL_PAUSE_TIME)
# Məhsul məlumatlarını çıxarmaq
items = driver.find_elements(By.CLASS_NAME, "product-item")
for item in items:
name = item.find_element(By.CLASS_NAME, 'product-name').text
price = item.find_element(By.CLASS_NAME, 'product-price').text
products.append({'name': name, 'price': price})
# Yoxlamaq, yeni bir şey yüklənibmi
# (Sadə üsul: əgər items siyahısı böyüməsə, çıxırıq)
if len(products) == last_known_count:
break
last_known_count = len(products)
Dinamik elementlər bizim istəyimiz qədər tez yüklənmədikdə, səbirlə və ustalıqla çalışmaq lazım olur. WebDriverWait-ın öz şərtlər arsenalı, səhifənin aşağıya fırladılması və JavaScript-injections - bu dinamik məzmunun dünyasını fəth etmək üçün əsas alətlərimizdir. Böyük Jedi demişdi: "Səbir, gənc Padavanım". Bizim vəziyyətimizdə səbir həm də dinamik məlumatların uğurla işlənməsi deməkdir.
Sessiyanı uğurlu iş günündən sonra olduğu kimi - diqqətlə bağlayırıq.
driver.quit()
Unutmayın: Ən sonda, kodunuzu düzgün, qüsursuz işlədiyini yoxlamağınız vacibdir. Yalnız bu halda siz tam əminliklə deyə bilərsiniz: "Missiya tamamlandı". Dinamik məlumatlar dünyasındakı səyahətinizdə uğurlar arzulayıram!
GO TO FULL VERSION