Python İle Beautifulsoup Kullanarak Basit Bir Web Crawler Nasıl Yapılır?

Python İle Beautifulsoup Kullanarak Basit Bir Web Crawler Nasıl Yapılır?
Python İle Beautifulsoup Kullanarak Basit Bir Web Crawler Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Web kazıma işlemlerine başlamadan önce geliştirme ortamınızı doğru yapılandırmanız gerekir. Python 3.10 veya daha yeni bir sürümün yüklü olduğundan emin olun. İhtiyacımız olan iki temel kütüphane bulunmaktadır: requests (web sayfasına istek atmak için) ve beautifulsoup4 (HTML içeriğini ayrıştırmak için).

Terminal veya komut satırınızı açarak aşağıdaki komutla gerekli paketleri kurun:

pip install requests beautifulsoup4

Kurulum tamamlandıktan sonra, projeniz için bir dizin oluşturun ve bir Python dosyası açın. Bu kütüphaneler, modern web kazıma projelerinin temel taşlarıdır ve 2026 standartlarında hala en güvenilir ve hızlı araçlar olarak kabul edilirler.

Adım Adım Web Sayfasına İstek Gönderme

Bir web crawler'ın ilk görevi, hedef web sayfasına bir HTTP isteği (Request) göndermektir. Bu işlem, tarayıcınızın bir adrese gitmesiyle aynı mantıkta çalışır. requests kütüphanesi, bu süreci tek satırda yönetmemizi sağlar.

import requests

url = "https://example.com"
response = requests.get(url)

if response.status_code == 200:
    print("Sayfa başarıyla yüklendi.")
else:
    print(f"Hata kodu: {response.status_code}")

Yukarıdaki kod bloğunda, requests.get() fonksiyonu ile hedef siteye bir GET isteği gönderiyoruz. response.status_code kontrolü, sitenin erişilebilir olup olmadığını anlamak için kritik bir adımdır; 200 kodu başarılı bir bağlantıyı temsil eder.

HTML İçeriğini Beautifulsoup ile Ayrıştırma

Sayfadan gelen ham HTML verisi, okunması zor bir metin yığınıdır. Beautifulsoup, bu metni bir ağaç yapısına (parse tree) dönüştürerek, etiketler (tags) arasında kolayca gezinmemizi sağlar. Aşağıdaki örnekte, sayfa başlığını nasıl çekeceğimizi görebilirsiniz.

from bs4 import BeautifulSoup

# response.text, sayfadan gelen ham HTML içeriğidir
soup = BeautifulSoup(response.text, 'html.parser')

# Sayfa başlığını (title etiketi) bulma
sayfa_basligi = soup.title.string
print(f"Sayfa Başlığı: {sayfa_basligi}")

'html.parser', Python'un dahili HTML ayrıştırıcısıdır. Eğer çok karmaşık bir yapı ile çalışıyorsanız, daha hızlı sonuç veren lxml kütüphanesini de tercih edebilirsiniz.

Belirli Verileri Seçme ve Filtreleme

Genellikle bir web sayfasının tamamına değil, belirli bölümlerine (örneğin bir ürünün fiyatı veya bir haberin başlığı) ihtiyaç duyarız. Bunun için find() ve find_all() metodlarını kullanırız. Bu metodlar, CSS seçicileri veya HTML etiket isimleri ile arama yapmamıza olanak tanır.

# Sayfadaki tüm linkleri (a etiketleri) bulma
tum_linkler = soup.find_all('a')

for link in tum_linkler:
    href = link.get('href')
    print(f"Bulunan Link: {href}")

find_all() metodu, sayfadaki tüm eşleşen öğeleri bir liste olarak döndürür. Bu liste üzerinde döngü kurarak istediğiniz verileri ayıklayabilirsiniz.

Web Kazıma İçin Karşılaştırma Tablosu

Yöntem Avantajı Dezavantajı
Beautifulsoup Hızlı, basit, öğrenmesi kolay. JavaScript ile yüklenen içeriklerde yetersiz.
Selenium Dinamik içerikleri (JS) tamamen işler. Daha yavaş ve yüksek kaynak tüketimi.
Scrapy Büyük ölçekli projeler için ideal. Öğrenme eğrisi daha dik.

Hata Yönetimi ve Güvenli Crawler Tasarımı

Web kazıma sırasında ağ hataları, zaman aşımları veya sunucu engellemeleri ile karşılaşabilirsiniz. Profesyonel bir crawler, bu hataları zarif bir şekilde yönetmelidir. Ayrıca, sunucuyu aşırı yüklememek için istekler arasına bekleme süresi koymak etik bir zorunluluktur.

import time

def guvenli_istek(url):
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status() # Hata oluşursa hata fırlatır
        return response.text
    except requests.exceptions.RequestException as e:
        print(f"İstek başarısız oldu: {e}")
        return None

# İstekler arasında 2 saniye bekle
time.sleep(2)

Kritik Uyarı: Web kazıma işlemleri yaparken hedef sitenin robots.txt dosyasını mutlaka kontrol edin. İzinsiz veri toplamak, yasal sorunlara ve IP adresinizin engellenmesine yol açabilir. Veri gizliliği ve kullanım şartlarına her zaman saygı gösterin.

Sıkça Sorulan Sorular

Beautifulsoup neden JavaScript ile yüklenen verileri göremiyor?

Beautifulsoup, sadece sunucudan gelen ilk HTML yanıtını işler. JavaScript ile istemci tarafında (tarayıcıda) oluşturulan içerikler, ilk HTML kaynağında bulunmadığı için bu kütüphane bunları göremez. Bu durumda Selenium veya Playwright gibi tarayıcı otomasyon araçları kullanılmalıdır.

Bir site beni engellerse ne yapmalıyım?

Sunucular genellikle çok hızlı gelen istekleri "bot" olarak algılar. İsteklerinize "User-Agent" başlığı ekleyerek tarayıcı gibi görünmeyi deneyebilir veya istekler arasına rastgele bekleme süreleri ekleyebilirsiniz.

Verileri nasıl kaydedebilirim?

Çektiğiniz verileri csv veya json formatında kaydedebilirsiniz. Python'un dahili csv kütüphanesi bu işlem için oldukça pratiktir.

Aynı anda çok fazla sayfayı nasıl tararım?

Çoklu sayfa taraması için concurrent.futures modülü ile çoklu iş parçacığı (threading) kullanabilirsiniz. Ancak, hedef siteyi yormamak için hız sınırlarına dikkat etmelisiniz.

Beautifulsoup ile giriş yapmam gereken siteleri kazıyabilir miyim?

Giriş yapılması gereken sitelerde oturum yönetimi (session) gerekir. requests.Session() kullanarak giriş bilgilerini saklayabilir ve ardından kazıma işlemine devam edebilirsiniz.

Gerçek Dünya Senaryosu: E-Ticaret Ürün Fiyat Takibi

Teorik bilgileri pratiğe dökmek için bir e-ticaret sitesinden ürün ismi ve fiyat bilgilerini çeken bir crawler tasarlayalım. Bu senaryoda, bir sayfadaki tüm ürün kartlarını döngüye alarak yapılandırılmış bir veri seti oluşturacağız.

import requests
from bs4 import BeautifulSoup

def urun_takip_et(url):
    headers = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    urunler = []
    # Farazi bir e-ticaret sitesi yapısı
    kartlar = soup.find_all('div', class_='product-card')
    
    for kart in kartlar:
        isim = kart.find('h2', class_='title').text.strip()
        fiyat = kart.find('span', class_='price').text.strip()
        urunler.append({'isim': isim, 'fiyat': fiyat})
        
    return urunler

# Kullanım
veriler = urun_takip_et('https://ornek-site.com/kategori/elektronik')
for urun in veriler:
    print(f"Ürün: {urun['isim']} | Fiyat: {urun['fiyat']}")

Crawler Performansını Artırmak İçin İleri İpuçları

Büyük ölçekli veri toplama işlemlerinde, kodunuzun çalışma hızı ve kaynak tüketimi kritik öneme sahiptir. Performansı optimize etmek için şu yöntemleri izleyebilirsiniz:

  • Session Kullanımı: requests.Session() nesnesini kullanarak aynı bağlantı üzerinden birden fazla istek gönderin. Bu, TCP el sıkışma süresini azaltır.
  • LXML Ayrıştırıcı: Varsayılan html.parser yerine daha hızlı olan lxml kütüphanesini kullanın.
  • Headless Tarayıcı Yerine İstekler: Mümkünse Selenium gibi ağır araçlar yerine doğrudan HTTP istekleri kullanın; bu, işlemci ve RAM kullanımını %90 oranında düşürür.

Hata Ayıklama (Debugging) Stratejileri

Crawler'ınız beklenen veriyi getirmediğinde veya çöktüğünde şu adımları izleyerek sorunu tespit edebilirsiniz:

  1. Response Kodunu Kontrol Edin: response.status_code değerinin 200 olup olmadığını doğrulayın. Eğer 403 alıyorsanız, User-Agent başlığınız engelleniyor olabilir.
  2. HTML Yapısını İnceleyin: Sayfa yapısı güncellenmiş olabilir. print(soup.prettify()) komutu ile sayfanın o anki halini konsola yazdırarak seçicilerinizin (selectors) hala geçerli olup olmadığını kontrol edin.
  3. İçerik Uzunluğunu Kontrol Edin: len(soup.find_all('div')) gibi bir komutla, kazımaya çalıştığınız öğelerin sayfada gerçekten bulunup bulunmadığını teyit edin.
İpucu: Geliştirme aşamasında her seferinde canlı siteye istek atmamak için, sayfa kaynağını yerel bir .html dosyasına kaydedip Beautifulsoup ile bu dosya üzerinden çalışmak, sitenin sizi engellemesini önler ve geliştirme hızınızı artırır.

Sonuç

Python ile Beautifulsoup kullanarak bir web crawler yapmak, veri odaklı projeleriniz için kapıları aralayan ilk adımdır. Bu rehberde öğrendiğiniz istek gönderme, ayrıştırma ve hata yönetimi teknikleri, daha karmaşık projeler için temel oluşturacaktır. Bir sonraki adım olarak, çektiğiniz verileri bir veritabanına (SQLite gibi) kaydetmeyi veya Selenium ile dinamik sayfaları kazımayı deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Web kazıma faaliyetlerinizin hedef sitenin kullanım koşulları ve yerel yasalarla uyumlu olduğundan emin olmak kullanıcının sorumluluğundadır. Yazılım güvenliği, veri gizliliği ve etik kullanım prensiplerini her zaman ön planda tutunuz.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz