CodeGym /Kurslar /Python SELF AZ /Veb-səhifədə dinamik elementlərlə işləmək

Veb-səhifədə dinamik elementlərlə işləmək

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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.

Python

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:

Python

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.

Python

# 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:

Python

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:

Python

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.

Python

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!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION