Son Dersler
Python Programlama Dili

Python ile Web Kazıma (Web Scraping): Temel Teknikler

22 Aralık 2025 15 dk okuma Deniz Karay

Günümüz dijital çağında, internet devasa bir bilgi okyanusu gibidir. Bu okyanustaki değerli verileri toplamak ve işlemek, birçok sektörde rekabet avantajı sağlamanın ve yenilikçi çözümler üretmenin anahtarı haline gelmiştir. İşte tam bu noktada, Python programlama dili ile gerçekleştirilen Web Kazıma (Web Scraping) teknikleri devreye girer. Web kazıma, web sitelerinden otomatik olarak veri çekme işlemidir ve bu makale, Python kullanarak bu güçlü tekniğin temel prensiplerini, araçlarını ve uygulamalarını her yaştan öğrenci için anlaşılır bir dille açıklayacaktır.

🎯 Bu Derste Öğrenecekleriniz
  • Web Kazıma Nedir: Web kazımanın tanımını, önemini ve etik boyutlarını kavrayacaksınız.
  • Python Temelleri: Python’ın web kazıma için neden ideal bir dil olduğunu ve temel kütüphanelerini öğreneceksiniz.
  • HTTP İstekleri: requests kütüphanesi ile web sayfalarına nasıl HTTP isteği gönderileceğini ve yanıtların nasıl işleneceğini anlayacaksınız.
  • HTML Ayrıştırma: Beautiful Soup 4 kütüphanesini kullanarak HTML ve XML içeriklerini nasıl ayrıştıracağınızı ve istediğiniz veriye nasıl ulaşacağınızı keşfedeceksiniz.
  • Pratik Uygulama: Basit bir web kazıma projesini adım adım uygulayarak öğrendiklerinizi pekiştireceksiniz.
  • İleri Tekniklere Giriş: Dinamik içerik kazıma ve API kullanımı gibi daha ileri düzey konulara genel bir bakış edineceksiniz.
📌 Bu Konuda Bilmeniz Gerekenler
  • Web Kazıma (Web Scraping): Web sitelerinden programatik olarak veri toplama işlemidir.
  • Python’ın Rolü: Python, kolay sözdizimi ve zengin kütüphaneleri sayesinde web kazıma için en popüler dillerden biridir.
  • Temel Kütüphaneler: HTTP istekleri için requests, HTML/XML ayrıştırma için Beautiful Soup 4 en sık kullanılan araçlardır.
  • Etik ve Yasal Boyut: Web kazıma yapmadan önce site politikalarını (robots.txt) ve yasal sınırlamaları dikkate almak çok önemlidir.
  • Uygulama Alanları: Fiyat karşılaştırma, piyasa analizi, haber takibi, içerik toplama gibi birçok alanda kullanılır.

Web Kazıma (Web Scraping) Nedir ve Neden Önemlidir?

Web kazıma, internet üzerindeki web sitelerinden yapılandırılmış verileri otomatik olarak çekme sürecidir. Bu işlem, genellikle belirli bir yazılım (kazıyıcı veya bot) tarafından yapılır ve insan eliyle kopyala-yapıştır yapmaya kıyasla çok daha hızlı ve verimlidir. Amacı, web sayfalarındaki görünür veriyi almak ve daha sonra analiz veya başka amaçlar için kullanılabilecek bir formata dönüştürmektir.

Web kazıma günümüzde pek çok alanda kritik bir rol oynamaktadır. Örneğin, e-ticaret siteleri rakiplerinin fiyatlarını takip etmek için, araştırmacılar halka açık veri setleri oluşturmak için, haber ajansları farklı kaynaklardan güncel haberleri toplamak için bu teknikten faydalanır. Yapay zeka ve veri bilimi projelerinde de büyük veri setlerine ulaşmak için web kazıma vazgeçilmez bir yöntemdir.

⚠️ Dikkat: Web kazıma yaparken etik ve yasal sınırları göz önünde bulundurmak hayati önem taşır. Her web sitesinin kendine ait kullanım koşulları ve robots.txt dosyası bulunur. robots.txt, web site sahiplerinin hangi bölümlerinin taranıp taranamayacağını belirten bir protokoldür. Bu kurallara uymak, yasal sorunlarla karşılaşmamak ve sitenin sunucularına aşırı yük bindirmemek için çok önemlidir. Her zaman izinli ve sorumlu bir şekilde kazıma yapmaya özen gösterin.

Python Neden Web Kazıma İçin İdeal Bir Seçimdir?

Python, web kazıma projeleri için en popüler programlama dillerinden biridir. Bunun birçok nedeni vardır:

  • Kolay Öğrenilebilirlik ve Okunabilirlik: Python’ın basit ve anlaşılır sözdizimi, özellikle yeni başlayanlar için hızlı bir öğrenme süreci sunar.
  • Zengin Kütüphane Ekosistemi: Web kazıma için özel olarak geliştirilmiş requests, Beautiful Soup, Scrapy ve Selenium gibi güçlü kütüphanelere sahiptir.
  • Esneklik: Küçük, tek seferlik betiklerden büyük, karmaşık veri toplama sistemlerine kadar her türlü ihtiyaca cevap verebilir.
  • Geniş Topluluk Desteği: Karşılaştığınız sorunlara hızlıca çözüm bulabileceğiniz devasa bir geliştirici topluluğu ve kaynak zenginliği mevcuttur.

Bu özellikler, Python’ı sadece web kazıma için değil, aynı zamanda yapay zeka, veri analizi, web geliştirme gibi birçok alanda da tercih edilen bir dil haline getirmiştir.

Temel Web Kazıma Araçları ve Kütüphaneleri

Python ile web kazıma yaparken en sık kullanacağımız iki temel kütüphane requests ve Beautiful Soup 4‘tür. Bu kütüphaneler, web sayfalarından veri çekme ve çekilen bu veriyi anlamlı parçalara ayırma görevlerini üstlenir.

Requests Kütüphanesi: HTTP İstekleri Yapmak

requests kütüphanesi, web sunucularına HTTP istekleri göndermek ve bu isteklerin yanıtlarını almak için kullanılır. Bir web tarayıcısının bir web sitesini ziyaret etme işlemini programatik olarak taklit etmenizi sağlar. Yani, bir sayfanın HTML içeriğini bilgisayarınıza indirmenizi sağlar.

Kurulumu oldukça basittir:

📖 Kurulum Komutu

pip install requests

Bir web sayfasına GET isteği göndermek ve içeriğini almak için aşağıdaki gibi bir kod kullanabiliriz:

📖 Basit GET İsteği
import requests

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

# HTTP durum kodunu kontrol et (200 başarılı anlamına gelir)
if response.status_code == 200:
    print("Sayfa içeriği başarıyla çekildi!")
    print(response.text[:500]) # İlk 500 karakteri yazdır
else:
    print(f"Hata oluştu: {response.status_code}")
ℹ️ Bilgi: HTTP durum kodları, sunucunun isteğimize nasıl yanıt verdiğini gösterir. 200 OK başarıyı, 404 Not Found bulunamadığını, 403 Forbidden erişim engellendiğini ve 500 Internal Server Error sunucu hatasını belirtir. Web kazıma yaparken bu kodları kontrol etmek, hataları anlamak için önemlidir.

Beautiful Soup 4: HTML ve XML Ayrıştırma

requests ile bir web sayfasının ham HTML içeriğini aldıktan sonra, bu içeriği anlamlı parçalara ayırmak ve istediğimiz verileri bulmak için Beautiful Soup 4 (genellikle kısaca Beautiful Soup olarak anılır) kütüphanesini kullanırız. Beautiful Soup, HTML ve XML belgelerini ayrıştırmak (parse etmek) için harika bir araçtır. Bu sayede, etiketlere, sınıflara, ID’lere veya diğer niteliklere göre belirli elementleri kolayca bulabiliriz.

Kurulumu şu şekildedir:

📖 Kurulum Komutu

pip install beautifulsoup4

Beautiful Soup’u kullanarak HTML içeriğini nasıl ayrıştıracağımıza ve belirli bir etiketi nasıl bulacağımıza dair bir örnek:

📖 HTML Ayrıştırma ve Etiket Bulma
from bs4 import BeautifulSoup
import requests

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

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Sayfanın başlığını bulma
    title_tag = soup.find('title')
    if title_tag:
        print(f"Sayfa Başlığı: {title_tag.text}")
        
    # Tüm paragraf etiketlerini bulma
    paragraphs = soup.find_all('p')
    print(f"Sayfada {len(paragraphs)} adet paragraf bulundu.")
    for i, p in enumerate(paragraphs[:3]): # İlk 3 paragrafı göster
        print(f"Paragraf {i+1}: {p.text[:100]}...")
        
    # Belirli bir ID'ye sahip elementi bulma
    div_with_id = soup.find('div', id='some_id') # 'some_id' yerine gerçek bir ID girin
    if div_with_id:
        print(f"ID'si 'some_id' olan div içeriği: {div_with_id.text}")
else:
    print(f"Hata oluştu: {response.status_code}")
💡 İpucu: Beautiful Soup ile elementleri bulmak için sadece etiket adlarını ('p', 'a', 'div') değil, aynı zamanda niteliklerini (class_, id, href) de kullanabilirsiniz. Örneğin, soup.find_all('a', class_='nav-link') ile ‘nav-link’ sınıfına sahip tüm bağlantıları bulabilirsiniz. CSS seçicileri kullanmak isterseniz soup.select() yöntemini de araştırabilirsiniz.

Adım Adım Web Kazıma Uygulaması: Basit Bir Örnek

Şimdi öğrendiklerimizi pekiştirmek için basit bir senaryo üzerinde çalışalım: Bir web sitesindeki tüm başlıkları (<h2> etiketleri) kazıyalım. Örnek olarak, Ders Merkezi blog sayfasındaki makale başlıklarını çekmeyi düşünebiliriz (gerçek bir site yerine örnek bir yapı kullanacağız).

Hedef Site Seçimi ve Analizi

Herhangi bir web kazıma projesine başlamadan önce, hedef web sitesini dikkatlice incelemek gerekir. Tarayıcınızın geliştirici araçlarını (genellikle F12 tuşu ile açılır) kullanarak, çekmek istediğiniz verilerin hangi HTML etiketleri içinde yer aldığını, hangi sınıflara veya ID’lere sahip olduğunu anlamalısınız. Bu adım, doğru seçicileri (selectors) belirlemeniz için kritik öneme sahiptir.

ℹ️ Bilgi: Tarayıcınızdaki Geliştirici Araçları (Developer Tools), web sayfalarının HTML, CSS ve JavaScript yapısını incelemenizi sağlar. Elementleri inceleme özelliği ile sayfanın herhangi bir öğesine tıklayarak o öğenin HTML kodunu anında görebilirsiniz. Bu, kazıma yaparken hedeflediğiniz veriye ulaşmak için doğru yolu bulmanıza yardımcı olur.

Veri Çekme İşlemi

Şimdi örnek bir HTML yapısı üzerinden başlıkları çekelim:

📖 Başlık Kazıma Örneği
from bs4 import BeautifulSoup
import requests

# Örnek bir URL belirleyelim (gerçek bir site yerine temsili bir URL)
url = "https://www.dersmerkezi.net.tr/blog-yazilari"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
} # Bazı siteler User-Agent kontrolü yapar

try:
    response = requests.get(url, headers=headers)
    response.raise_for_status() # HTTP hataları için istisna fırlatır
    
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Makale başlıklarının genellikle h2 etiketi içinde olduğunu varsayalım
    # ve belirli bir sınıfa sahip olabilirler (örn: 'post-title')
    article_titles = soup.find_all('h2', class_='post-title') # Sınıfı siteye göre değiştirmelisiniz
    
    print(f"'{url}' adresinden çekilen makale başlıkları:")
    if article_titles:
        for i, title in enumerate(article_titles):
            print(f"{i+1}. {title.text.strip()}")
    else:
        print("Belirtilen başlık sınıfına sahip h2 etiketi bulunamadı.")

except requests.exceptions.RequestException as e:
    print(f"Hata oluştu: {e}")

Çekilen Veriyi İşleme ve Saklama

Yukarıdaki örnekte başlıkları doğrudan ekrana yazdırdık. Ancak çoğu zaman çekilen veriyi daha sonra kullanmak üzere kaydetmek isteriz. Verileri bir listeye veya sözlüğe atayabilir, ardından CSV dosyası, JSON dosyası veya bir veritabanı gibi farklı formatlarda saklayabiliriz.

📖 Veriyi CSV Olarak Kaydetme
import csv

# Önceki örnekten alınan article_titles listesini kullanıyoruz
# article_titles = [element1, element2, ...]

if article_titles:
    # Veriyi bir liste haline getirelim
    data_to_save = [[title.text.strip()] for title in article_titles]
    
    # CSV dosyasına yazma
    with open('makale_basliklari.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(['Makale Başlığı']) # Başlık satırı
        writer.writerows(data_to_save)
    print("Veriler 'makale_basliklari.csv' dosyasına kaydedildi.")
else:
    print("Kaydedilecek veri bulunamadı.")

İleri Düzey Web Kazıma Teknikleri (Kısaca)

Temel web kazıma tekniklerini öğrendikten sonra, daha karmaşık senaryolarla karşılaşabilirsiniz. İşte bu noktada devreye giren bazı ileri düzey teknikler:

Dinamik İçerik Kazıma: Selenium

Günümüz web sitelerinin çoğu, içeriklerini JavaScript kullanarak dinamik olarak yükler. Bu tür sitelerden veri çekmek için sadece requests ve Beautiful Soup yeterli olmayabilir çünkü bu kütüphaneler JavaScript’i çalıştıramaz. Selenium gibi otomasyon araçları, bir web tarayıcısını kontrol ederek JavaScript’i çalıştırabilir ve dinamik olarak yüklenen içeriği yakalayabilir. Bu, sanal bir kullanıcı gibi web sitesinde gezinmenizi, tıklamalar yapmanızı ve formları doldurmanızı sağlar.

API Kullanımı: Alternatif Bir Yaklaşım

Bazı web siteleri, verilerini doğrudan web kazımaya gerek kalmadan programatik olarak erişilebilir kılan API’ler (Uygulama Programlama Arayüzleri) sunar. Eğer bir sitenin API’si varsa, genellikle web kazımadan daha güvenli, daha hızlı ve daha verimli bir veri toplama yöntemi olacaktır. API’ler genellikle JSON veya XML formatında yapılandırılmış veri döndürür.

Hata Yönetimi ve Güvenilirlik

Web kazıma betikleri, ağ hataları, sunucu yanıt süreleri, site yapısındaki değişiklikler gibi birçok nedenle başarısız olabilir. Bu durumları ele almak için try-except blokları ile hata yönetimi yapmak, HTTP istekleri arasında gecikmeler (time.sleep()) eklemek ve User-Agent gibi başlık bilgilerini doğru ayarlamak betiğinizin daha güvenilir çalışmasını sağlar. Ayrıca, sitenin IP adresinizi engellememesi için aşırı istek göndermekten kaçınmalısınız (rate limiting).

Proxy Kullanımı ve IP Engelleme

Bazı web siteleri, aynı IP adresinden gelen yoğun istekleri bot faaliyeti olarak algılayıp bu IP adresini engelleyebilir. Bu gibi durumlarda, farklı IP adresleri üzerinden istek göndermek için proxy sunucuları kullanmak bir çözüm olabilir. Ancak bu da ek karmaşıklık ve maliyet getirebilir.

Web Kazıma Süreçlerinde Sıkça Karşılaşılan Zorluklar ve Çözümleri

Web kazıma, ilk bakışta basit görünse de, pratikte çeşitli zorluklarla karşılaşmak mümkündür. Aşağıdaki tablo, bu zorlukları ve olası çözümlerini özetlemektedir:

Zorluk Açıklama Olası Çözümler
Anti-Scraping Mekanizmaları Web siteleri, botları engellemek için CAPTCHA, IP engelleme, User-Agent kontrolü gibi önlemler alır. User-Agent’ı değiştirme, proxy kullanma, gecikmeler ekleme, Selenium ile CAPTCHA çözme (otomatik olmayan), Headless tarayıcılar.
Dinamik İçerik İçerik JavaScript ile yüklendiği için HTML yanıtında bulunmaz. Selenium veya Playwright gibi tarayıcı otomasyon kütüphaneleri kullanma.
Site Yapısı Değişiklikleri Web sitesinin HTML yapısı değiştiğinde kazıyıcı betik bozulur. Esnek seçiciler kullanma, hata yönetimi, düzenli kontrol ve betiği güncelleme.
Oturum Yönetimi (Login) Veriye erişmek için oturum açmak gerekebilir. requests kütüphanesinin Session objesi ile çerezleri yönetme, Selenium ile form doldurma.
Sayfalama (Pagination) Veriler birden fazla sayfaya yayılmıştır. Sonraki sayfa bağlantısını takip etme veya sayfa numaralarını döngüye sokma.
Veri Temizliği Çekilen veriler genellikle kirli (gereksiz boşluklar, HTML etiketleri vb.) olabilir. String manipülasyonu (.strip(), .replace()), Regex (düzenli ifadeler) kullanma.

✏️ Kendinizi Test Edin

  1. Web kazıma nedir ve neden günümüz dijital dünyasında bu kadar önemlidir? En az iki farklı kullanım alanını açıklayın.
  2. Python ile web kazıma yaparken kullanılan başlıca iki kütüphaneyi (HTTP isteği gönderme ve HTML ayrıştırma için) adlandırın ve her birinin temel işlevini kısaca açıklayın.
  3. Bir web sitesinden veri çekerken etik ve yasal sorumluluklarımızı nasıl yerine getirebiliriz? Özellikle robots.txt dosyasının rolünü açıklayın.
  4. Dinamik olarak yüklenen (JavaScript ile oluşturulan) bir web sayfasından veri çekmek için hangi Python kütüphanesini tercih etmelisiniz ve neden?
  5. Bir web kazıma projesinde karşılaşılabilecek olası zorluklardan iki tanesini belirtin ve bu zorlukları aşmak için hangi yöntemleri kullanabileceğinizi açıklayın.
📝 Konu Özeti
  • Web Kazıma Tanımı: Web sitelerinden programatik olarak veri toplama işlemidir.
  • Python Avantajları: Kolaylığı, zengin kütüphaneleri (requests, Beautiful Soup) ve geniş topluluk desteği ile tercih edilir.
  • Requests Kütüphanesi: Web sayfalarına HTTP istekleri göndererek HTML içeriğini çeker.
  • Beautiful Soup 4: Çekilen HTML içeriğini ayrıştırarak belirli etiketlere, sınıflara ve ID’lere göre veri bulmayı sağlar.
  • Etik ve Yasal Sorumluluklar: robots.txt kurallarına uymak, site kullanım koşullarını okumak ve sunucuya aşırı yük bindirmemek önemlidir.
  • İleri Teknikler: Dinamik içerik için Selenium, mevcutsa API kullanımı ve hata yönetimi web kazıma projelerinin verimliliğini artırır.

Öğrendiklerinizi Pekiştirin ve İleriye Adım Atın

Bu makalede, Python ile web kazımanın temel tekniklerini, neden önemli olduğunu ve bu süreçte kullanılan ana araçları adım adım öğrendiniz. Artık web sitelerinden veri çekmek, bu veriyi ayrıştırmak ve kaydetmek için sağlam bir temel bilgiye sahipsiniz. Unutmayın ki, web kazıma sürekli pratik gerektiren bir alandır. Farklı web sitelerini inceleyerek, çeşitli veri tiplerini çekmeye çalışarak ve öğrendiğiniz kütüphaneleri kullanarak becerilerinizi geliştirebilirsiniz.

Bir sonraki adım olarak, Scrapy gibi daha gelişmiş web kazıma çerçevelerini araştırmayı veya Selenium ile dinamik web sayfalarını kazıma üzerine yoğunlaşmayı düşünebilirsiniz. Ayrıca, çektiğiniz verileri analiz etmek için Pandas gibi veri analizi kütüphanelerini öğrenmek de ufkunuzu genişletecektir. Bilgiye hızlı adımlar atmaya devam edin!

DersMerkezi.net.tr’nin yazarı, eğitim alanında yıllara dayanan deneyime sahip bir uzmandır ve öğrencilerin öğrenme sürecini desteklemeyi hedefler. Matematik, fen bilimleri, tarih, dil ve edebiyat başta olmak üzere birçok ders alanında içerik üretir ve konuları sade, anlaşılır ve adım adım rehberler halinde sunar.

Yorum Yap