1. Pagination ilə tanışlıq
Kim deyib ki, lazım olan məlumatlar bir səhifədə olacaq? Çox vaxt onları bir yığın səhifədən çıxarmaq lazım olur, ya da ümumiyyətlə bütün sayt üzrə səpələnmiş olur. Belə ki, qarşılaşacağınız ilk çətinliklərdən biri məlumatların səhifələrə (pages) bölünməsi olacaq. Və onların toplanması ilə əlaqəli bu maraqlı iş pagination (paginasiya) adlanır.
Bəli, paginasiya — bu, yalnız Google nəticələrinin növbəti səhifəsinə keçidi gözlədiyimiz an deyil, həm də web-scraper-in belə bir sual verməsi məqamıdır: "Bunu əl ilə etmədən necə avtomatlaşdırmaq olar?"
Paginasiya — bu, məlumatların sayt üzərində təşkil olunma üsuludur ki, uzun məzmunlu səhifələrdən qaçınılsın. Bunun yerinə, saytlar məlumatları səhifələrə bölür və "Növbəti" və ya "Davamı" kimi keçidlər əlavə edirlər ki, bir səhifədən digərinə keçid mümkün olsun. Bu vacib bir konsepsiyadır, çünki web-scraper olaraq heç bir halda rəhbərinizə nəyisə ala bilmədiyinizi demək istəməyəcəksiniz, çünki o beşinci səhifədə gizlədilib.
2. Bir neçə səhifədən məlumatların skreypinqində problemlər
Qarşılaşa biləcəyiniz ilk problem — intuitiv və proqnozlaşdırıla bilən URL-lərin olmamasıdır. Bəzi saytların URL-ləri səhifələr arasında keçid edərkən kəskin dəyişmir, bu isə avtomatlaşdırma üçün həyatı olduqca çətinləşdirir. Məsələn, page=1, page=2 yerinə x=abc, x=def kimi bir şeylə qarşılaşa bilərsiniz və burada hər hansı bir açıq-aşkar qayda yoxdur.
İkinci problem — botlardan müdafiə. Bəzi saytlar bir IP-ünvandan gələn sorğuların sayını fəal şəkildə izləyirlər. Əgər onlar çox sorğu etdiyinizi görsələr, sizi müvəqqəti (və ya həmişəlik) bloklaya bilərlər.
Amma narahat olmayın, az sonra peşəkar skreyperlər kimi bu çətinliklərin öhdəsindən gəlməyi öyrənəcəyik.
3. Pagination-un keçilməsi
Texnikalar və strategiyalar
- URL strukturunun analizi: Adətən səhifələr URL-də səhifə nömrəsini göstərən parametrdən istifadə edir, məsələn
?page=2. Əgər belə bir şey tapmısınızsa, təbriklər, siz pagination keçidi üçün qızıl şablon tapdınız! - "Sonrakı" keçidlərini axtarma: Bəzən URL proqnozlaşdırıla bilmir. Belə hallarda səhifədəki "Sonrakı" və ya "Növbəti" keçidlərini tapmalı və onlara tabe olmalısınız.
- AJAX sorğularından istifadə: Bəzi saytlar məlumatları AJAX vasitəsilə səhifəni yeniləmədən alır. Bu halda, həmin sorğuları tutmaq və təkrarlamaq lazımdır.
Gəlin praktika keçək!
Pagination keçidi və məlumat toplanması üçün skript nümunəsi
Gəlin skript nümunəsini nəzərdən keçirək:
import requests
from bs4 import BeautifulSoup
# Bir səhifədən məlumat alma funksiyası
def get_data_from_page(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Burada soup-dan məlumat çıxarırsınız — nümunə
data = soup.find_all('div', class_='data-class')
for item in data:
print(item.text) # Məlumatı çap edin və ya saxlayın
else:
print(f"Səhifəni almaq mümkün olmadı: {url}")
# Pagination keçidi üçün əsas məntiq
def scrape_all_pages(start_url):
current_url = start_url
while current_url:
get_data_from_page(current_url)
soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
# "Sonrakı" keçidini tapmağa çalışırıq
next_button = soup.find('a', text='Sonrakı')
if next_button:
current_url = next_button['href']
else:
current_url = None
# İlk səhifədən scraping-ə başlayırıq
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)
Bu əsas nümunə pagination ilə işləmə prinsipini göstərir. Onu istifadə etdiyiniz saytın strukturuna uyğunlaşdırmalısınız.
Session idarəsi və user-agent istifadəsi
Sayta çoxlu sorğular göndərdiyiniz zaman, session istifadə etmək və user-agent dəyişmək faydalıdır, bloklanma riskini azaltmaq üçün.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, Gecko) Chrome/58.0.3029.110 Safari/537.3'}
session = requests.Session()
session.headers.update(headers)
response = session.get('http://example.com')
Bu konstruksiya brauzeri boş başlıqlar göndərməkdən daha dəqiq emulasiya etməyə imkan verir.
4. Praktiki tətbiq
İndi, əsasları bildikdən sonra, gəlin bir az çətinləşdirək məsələləri. Səhifə keçidlərinin gözlənilməz parametrlər saxladığı bir halı nəzərdən keçirək və AJAX istifadə edərək məlumatların alınmasına ehtiyacımız var.
AJAX istifadəsi ilə tətbiq
Bəzən məlumatlar əsas səhifədə yüklənmir, əvəzində AJAX vasitəsilə yüklənir. Əgər saytın belə davrandığını müşahidə edirsinizsə, brauzerinizdəki şəbəkə debug alətini istifadə edərək, arxa planda hansı sorğuların göndərildiyini müəyyən edin. Daha sonra bu sorğuları Python ilə təkrarlayın.
# AJAX çağrışına nümunə
ajax_url = 'http://example.com/ajax_endpoint'
params = {
'some_param': 'value', # sorğu üçün lazım olan parametrlər
'page': 1
}
while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Məlumatların işlənməsi
for item in data['items']:
print(item)
params['page'] += 1 # Növbəti səhifəyə keçid
Bu yanaşma, sorğuların və cavabların detallı təhlilindən sonra məlumatların brauzerdə necə yükləndiyini başa düşdükdə faydalıdır.
Bugünkü mühazirə bizə valehedici və bir qədər çətin səhifələmənin dünyasına səyahət etdirdi. Bu bacarıq sizə heç bir səhifəni qaçırmadan, sayt məlumatlarını etibarlı və effektiv toplamağa imkan verəcək. Axı, həyatda olduğu kimi, web-scrapingdə də metodiklik və istək vacibdir, çünki kim bilir, bəlkə iyirminci səhifədə gizli xəzinələr var!
GO TO FULL VERSION