JavaScript ile Oluşturulan İçerik

Mar 8, 2025

Modern web uygulamaları nadiren eksiksiz HTML sunar - bunun yerine, içerik dinamik olarak yüklenir ve JavaScript aracılığıyla oluşturulur. Bu, bu iki bölümde ele alacağımız web kazıma için benzersiz zorluklar sunar.

Bölüm 4: Dinamik Haber Akışı

İlk zorluğumuz, makalelerin JavaScript aracılığıyla dinamik olarak yüklendiği bir haber akışını kazımayı içerir. Bu birkaç temel kavram tanıtır:

  • Playwright ile tarayıcı otomasyonu
  • Dinamik içeriğin yüklenmesini bekleme
  • JavaScript ile oluşturulan DOM öğelerini işleme

Sayfa yapısı şöyle görünür:

<div class="news-feed">
  <article class="news-item">
    <h2>Son Dakika Haberi Başlığı</h2>
    <p>Makale içeriği...</p>
    <div class="meta">
      <span>Yazar: Yazar Adı</span>
      <time datetime="2024-03-08T12:00:00Z">8 Mart 2024</time>
    </div>
  </article>
  <!-- Daha fazla makale dinamik olarak yüklenir -->
</div>

Statik HTML kazımadan temel farklar:

// cheerio.load() yerine Playwright kullanıyoruz
const browser = await chromium.launch();
const page = await browser.newPage();

// İçeriğin oluşturulmasını bekleyin
await page.waitForSelector('.news-item');

// page.$$eval() kullanarak canlı DOM'dan veri çıkarın
// Bu, callback fonksiyonunu tarayıcı bağlamında çalıştırır
// seçiciyle eşleşen tüm öğeleri bir kerede değerlendirmek için
const items = await page.$$eval('.news-item', elements => {
  // Eşleşen öğeler üzerinde Array.map() gibi çalışır
  // Serileştirilebilir JavaScript nesneleri döndürür
  // Birden fazla öğeden veri çıkarmak için mükemmel
});

Bölüm 5: Sonsuz Kaydırma Galerisi

Dinamik içerik bilgisi üzerine inşa ederek, daha da karmaşık bir senaryoyla uğraşıyoruz - sonsuz kaydırmaya sahip fotoğraf galerisi. Bu şunları tanıtır:

  • Tembel yüklenmiş içeriği işleme
  • Kaydırma olaylarını algılama ve tetikleme
  • Asenkron yükleme durumlarını yönetme
  • Karmaşık UI desenlerinden veri çıkarma

Buradaki zorluk, kullanıcı kaydırdıkça içeriğin kademeli olarak yüklenmesidir:

<div class="photo-gallery">
  <div class="photo-card">
    <img src="..." alt="Fotoğraf Başlığı" />
    <h2>Fotoğraf Başlığı</h2>
    <p>Fotoğrafçı: Fotoğrafçı Adı</p>
    <div class="flex">
      <span>❤️ 42</span>
    </div>
  </div>
  <!-- Kaydırmada daha fazla fotoğraf yüklenir -->
</div>

Sonsuz kaydırmayı işlemek için temel kavramlar:

// Yeni içerik yüklenene kadar aşağı kaydırın
let previousHeight;
while (true) {
  previousHeight = await page.evaluate('document.body.scrollHeight');
  await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
  await page.waitForTimeout(1500); // İçerik bekleyin

  const newHeight = await page.evaluate('document.body.scrollHeight');
  if (newHeight === previousHeight) {
    break; // Yüklenecek daha fazla içerik yok
  }
}

Mutlu kazıma!