1. Naviqasiyaya Hazırlıq
Böyük səyahətimizə başlamazdan əvvəl, düzgün alət-kitab ilə silahlanmalıyıq: Selenium və bir az hiyləgərlik. Biz güman edirik ki, artıq Selenium və brauzer üçün driver-i necə quracağınızı bilirsiniz, ona görə də başlayaq!
Driver-in Qurulması
from selenium import webdriver
# Brauzer driver-i işə salırıq, məsələn, Chrome
driver = webdriver.Chrome()
# Macəramızın ilk səhifəsini açırıq
driver.get("http://example.com/start-page")
Hələ ki, hər şey standartdır — biz brauzeri açdıq və başlanğıc səhifəni yüklədik. Amma əyləncə indi başlayır: biz sadəcə bir səhifədə ilişib qalmaq istəmirik. Hər qonşu səhifədə olmaq istəyirik!
2. Səhifələr üzrə naviqasiya: səhifələrə səyahət
Səhifələr üzrə naviqasiyanın ən sadə və rahat üsulu səhifələşdirmədir (pagination). Sən dəfələrlə bu balaca, şirin rəqəmləri səhifənin ən aşağısında görmüsən, deyilmi? Onlar yollardakı nişanlar kimidir: «Sənin növbəti dayanacağın — 2-ci səhifə».
Məlumatların səhifələrdən çıxarılması
Səyahətə başlamazdan əvvəl, cari səhifədən məlumat toplamaq istəyirik. Tutalım ki, bu, məhsulların siyahısı və ya məqalə başlıqlarıdır.
def extract_data():
# Səhifədə bizi maraqlandıran bütün elementləri tapırıq, məsələn, başlıqları
titles = driver.find_elements_by_class_name("item-title")
for title in titles:
print(title.text) # Bəli, biz sadəcə mətni çap edirik, amma sən onu harada isə saxlaya bilərsən
extract_data()
Əgər əvvəlki mühazirələrə qatılmamısansa, bu kod parçası item-title
sinifində olan bütün başlıqları tapır və onları çap edir.
Sonrakı səhifəyə keçid
İndi məlumatlarla silahlanmış halda irəliləmək vaxtıdır. Səhifələşdirmə adətən növbəti və ya əvvəlki səhifəyə keçid düymələri şəklində təqdim olunur. Biz bu düymələri tapmalı və onlara basmalıyıq.
def go_to_next_page():
try:
# Növbəti səhifə düyməsini tapırıq və ona klik edirik
next_button = driver.find_element_by_link_text("Next")
next_button.click()
except NoSuchElementException:
# Əgər düymə yoxdursa, deməli, sona çatmışıq
print("Səhifələrin siyahısı bitdi.")
Bu funksiya «Next»
mətnli linki axtarır. Əgər onu tapsa, ona klik edərək növbəti səhifəyə keçir. Əgər yoxdursa, bizim bot başa düşür ki, internetin sonuna çatdı... ya da, heç olmasa, bu səhifələr ardıcıllığına.
3. Səhifələri dövr edərək keçmək
Bizə tam xoşbəxtlik üçün nə çatmır? Düzdür, dövr! Gəlin hər şeyi bir rahat dövrə birləşdirək ki, botumuz mövcud olan bütün səhifələri peşəkar kimi dolaşa bilsin.
while True:
extract_data() # Cari səhifədən məlumatları toplayırıq
go_to_next_page() # Növbəti səhifəyə keçir
time.sleep(2) # Serveri qorxutmamaq üçün bir az fasilə veririk
Bax bu qədər, indi botumuz cəsarətlə bütün səhifələri keçir, harada ki, «Next»
düyməsinə basmaq olar. Bu kod səhifələr bitənə qədər işləyəcək. Yadda saxlayın ki, sorğular arasında kiçik fasilə — serverlə dostluğunuzdur. Heç kim spam edənləri sevmir, xüsusən də sayt adminləri.
4. Dinamik qarşılıqlı əlaqə
Dostlar, həyat bu səhifələmə nümunələri qədər sadə deyil. Bəzən səhifə scroll etdikcə məlumatları dinamik şəkildə yükləyən "tutulmaz nindza" kimi davranır. Narahat olmayın, bununla da öhdəsindən gələcəyik.
Gözlənti mexanizmi
Gözləntilər kodunuza lazım olan element mövcud olana qədər bir az təmkinli olmağa imkan verir. Bu xüsusilə kontentin dərhal yüklənmədiyi hallarda faydalıdır.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def wait_for_element(locator):
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, locator))
)
return element
except TimeoutException:
print("Element tapılmadı.")
Bu funksiya ilə botunuz dinamik yüklənən kontentlə uyğunlaşacaq və elementlər mövcud olana qədər səbir edəcək.
Səhifənin aşağıya scroll edilməsi
Məlumatların dinamik olaraq yükləndiyi, məsələn sonsuz scroll xüsusiyyəti olan səhifələrdə daha çox elementi yükləmək üçün səhifəni aşağıya scroll etmək lazım ola bilər.
def scroll_down():
# Aşağıya scroll etmək üçün JavaScript-dən istifadə edirik
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
JavaScript skripti səhifənin aşağıya doğru rahat şəkildə scroll edilməsinə kömək edir və bununla səhifənin kontent yükləməsinə imkan yaradır. Bu üsulu loop vasitəsilə sonsuz scroll-u idarə etmək üçün istifadə edə bilərsiniz.
5. Xüsusiyyətlər və lifehack-lər
Məsələlərin hüdudlarından kənara çıxmaq - macəralarla dolu, sürprizlərlə zəngin bir kitabdır. Təsəvvür edin ki, sizin botunuz da sizin kimi müxtəlif ssenarilərə hazır olmalıdır.
Əgər «Next»
düyməsi yoxdursa, amma səhifələrin nömrələri ilə olan pagination varsa, URL-ə birbaşa nömrəni yerləşdirərək dinamik yanaşmadan istifadə edin. Əgər saytınız qəflətən ninja olmaq qərarına gəlib bəzi səhifələri gizlədərsə, skriptlərinizi elə qurun ki, onlar uyğunlaşa bilsin və gözlənilməz vəziyyətlərə hazır olsunlar.
GO TO FULL VERSION