Go Programming

Go ile Yüksek Performanslı Web Kazıyıcı Oluşturma: Modern Bir Yaklaşım

Veri mühendisliği ve arka uç geliştirme dünyasında, webden veri çıkarma yeteneği paha biçilmez bir beceridir. Python, BeautifulSoup ve Scrapy gibi kütüphanelerle uzun süredir kazıma alanını domine etse de, Go (Golang) bu spesifik görev için belirgin avantajlar sunar. Go'nun eşzamanlılık modeli, statik yazım ve derlenmiş performansı, yüksek iş yükünü ve düşük gecikme süresini yönetmesi gereken kazıyıcılar oluşturmak için mükemmel bir seçim yapar.

Bu kılavuz, Go'nun standart kütüphanesi ve popüler Colly çerçevesini kullanarak üretim düzeyinde bir web kazıyıcısı oluşturmanıza rehberlik edecektir. Kurulum, temel yapı ve dinamik içeriklerin işlenmesini ele alarak, bir sonraki veri çıkarma projeniz için sağlam bir temel sağlayacağız.

Neden Web Kazıma İçin Go Seçmelisiniz?

Koda dalmadan önce, Go'nun güçlü yönlerine rağmen bu alanda neden sıklıkla yeterince kullanılmadığını anlamak önemlidir. Yorumlanan dillerin aksine, Go ikili dosyaları kendi kendine yetenidir ve minimum aşırı yükleme ile çalışır. Ayrıca, Go'nun goroutine'leri, iş parçacıklarını manuel olarak yönetmenin karmaşıklığı olmadan kitlesel olarak paralel kazıma işlemlerine olanak tanır. Bu durum, Go'yu aşırı bellek veya CPU kaynakları tüketmeden hızlıca binlerce sayfayı kazımanız gereken senaryolar için ideal kılar.

Ortamın Hazırlanması

Başlamak için, sisteminizde Go'nun yüklü olduğundan emin olun. Kurulumu terminalde go version komutunu çalıştırarak doğrulayabilirsiniz. Ardından, projeniz için yeni bir Go modülü başlatın:

mkdir go-scraper
cd go-scraper
go mod init go-scraper

Bu örnekte, Colly çerçevesini kullanacağız. Colly, Golang için şimşek hızında ve zarif bir kazıma çerçevesidir ve HTTP karmaşıklığının çoğunu soyutlayan temiz bir API sunar. Aşağıdaki komutu kullanarak yükleyin:

go get -u github.com/gocolly/colly/v2

Kazıyıcıyı Yazma

Bir web sayfasındaki tüm bağlantıların başlığını ve URL'sini çıkaran basit bir kazıyıcı oluşturalım. main.go adında bir dosya oluşturun ve aşağıdaki kodu ekleyin:

package main

import (
    "fmt"
    "github.com/gocolly/colly/v2"
)

func main() {
    // Varsayılan toplayıcıyı oluştur
    c := colly.NewCollector(
        colly.AllowedDomains("example.com"),
        colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"),
    )

    // href özelliğine sahip her a elementi için geri çağrıyı çağır
    c.OnHTML("a[href]", func(e *colly.HTMLElement) {
        link := e.Attr("href")
        // Bağlantıyı yazdır
        fmt.Printf("Link bulundu: %q -> %s\n", e.Text, link)
    })

    // Her bağlantı metni için geri çağrıyı çağır
    c.OnHTML("title", func(e *colly.HTMLElement) {
        fmt.Printf("Sayfa Başlığı: %s\n", e.Text)
    })

    // example alanı üzerinde kazımayı başlat
    c.Visit("https://example.com")
}

Bu kod parçasında, belirli kısıtlamalarla bir toplayıcı tanımlıyoruz. AllowedDomains seçeneği, kazıyıcının yalnızca belirtilen alan adını ziyaret etmesini sağlayarak, dış sitelerin yanlışlıkla taranmasını önler. UserAgent başlığı çok önemlidir; birçok web sitesi, standart bir tarayıcıyı taklit etmeyen istekleri engeller. Bir kullanıcı aracısı ayarlayarak başarılı isteklerin olasılığını artırıyoruz.

Eşzamanlılık ve Hız Sınırlama Yönetimi

Go tabanlı kazıyıcıların en güçlü özelliklerinden biri eşzamanlılıktır. Ancak, binlerce isteği körü körüne göndermek IP yasaklarına veya aşırı yüklenmiş sunuculara yol açabilir. Colly, Parallelism ayarı ve yerleşik hız sınırlayıcıları kullanarak bunu yönetmek için basit bir yol sunar.

Aşağıda, gecikmeli bir paralel kazıyıcı nasıl yapılandırılacağı gösterilmiştir:

c.SetParallelism(10) // 10 eşzamanlı istek çalıştır
c.Limit(&colly.LimitRule{
    DomainGlob:  "example.com/*",
    Delay:       1 * time.Second,
    RandomDelay: 500 * time.Millisecond,
})

Bu yapılandırma, hedef sunucuya saygılı kalırken verimli bir şekilde kazımanıza olanak tanır. Rastgele gecikme, otomatik bot koruma sistemleri tarafından tespit edilmekten kaçınmaya yardımcı olur.

Sonuç

Go ile bir web kazıyıcısı oluşturmak yalnızca mümkün değil, aynı zamanda performansın kritik olduğu uygulamalar için son derece avantajlıdır. Go'nun standart kütüphanesinden ve Colly gibi çerçevelerden yararlanarak sağlam, ölçeklenebilir ve verimli veri çıkarma araçları oluşturabilirsiniz. Haberleri topluyor, fiyatları izliyor veya araştırma verileri topluyor olun, Go bunu güvenilir bir şekilde yapmak için gerekli araçları sağlar.

Kazıyıcınızı genişletirken, hata işleme, önbellekleme mekanizmaları ve JavaScript ağırlıklı siteler için başsız tarayıcı entegrasyonu uygulamayı düşünün. Burada atılan temel, daha karmaşık kazıma mimarileri için bir zıplama tahtası görevi görür. İyi kodlamalar!

Share: