Gereksinimler ve Ön Hazırlık
Web kazıma işlemine başlamadan önce bilgisayarınızda Python 3.10 veya daha güncel bir sürümün yüklü olması gerekir. Beautiful Soup, doğrudan HTML'i sunucudan çekmez; bu yüzden HTTP istekleri göndermek için requests kütüphanesine ihtiyaç duyarız. Terminal veya komut satırınızı açarak aşağıdaki komutlarla gerekli paketleri kurun:
pip install beautifulsoup4 requests
Kurulum tamamlandıktan sonra, projenizi düzenli tutmak için bir çalışma dizini oluşturun. Kodlarınızı yazmak için VS Code veya PyCharm gibi bir editör kullanmanız önerilir. Ayrıca, kazıma yapacağınız sitelerin robots.txt dosyalarını kontrol ederek sitenin kazıma politikalarına uygun hareket etmeniz etik ve yasal açıdan zorunludur.
Adım Adım Web Sayfası İçeriğini Çekme
İlk adım, hedef web sayfasının kaynak kodunu Python ortamına almaktır. requests kütüphanesi, bir tarayıcı gibi davranarak sunucuya bir GET isteği gönderir ve sayfanın HTML içeriğini yanıt olarak alır.
import requests
url = "https://example.com"
response = requests.get(url)
if response.status_code == 200:
print("Sayfa başarıyla çekildi.")
else:
print(f"Hata oluştu: {response.status_code}")
Yukarıdaki kod bloğunda status_code == 200 kontrolü kritiktir. Bu, sunucunun isteğinizi başarıyla karşıladığını doğrular. Eğer 404 veya 500 gibi hatalar alırsanız, URL'yi veya internet bağlantınızı kontrol etmelisiniz.
Beautiful Soup İle HTML Ayrıştırma
Sayfayı indirdikten sonra, bu ham metni Beautiful Soup'un anlayabileceği bir ağaç yapısına dönüştürmemiz gerekir. Bu aşamada html.parser standart ayrıştırıcısını kullanacağız.
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.title.text)
Bu kod, sayfanın etiketi içerisindeki metni ekrana yazdırır. Beautiful Soup, HTML'i bir nesne hiyerarşisine dönüştürerek, etiketler arasında kolayca gezinmenize olanak tanır.
Belirli Verileri Etiket ve Sınıf İle Bulma
Web kazımanın en önemli kısmı, sayfa içindeki belirli verileri (örneğin bir ürün fiyatı veya haber başlığı) bulmaktır. Bunun için find() ve find_all() metotlarını kullanırız.
# İlk h1 etiketini bulur
baslik = soup.find('h1')
# Belirli bir sınıfa sahip tüm linkleri bulur
linkler = soup.find_all('a', class_='nav-link')
for link in linkler:
print(link.get('href'))
find_all() metodu her zaman bir liste döndürür. Eğer sayfada birden fazla aynı sınıfa sahip öğe varsa, bu metotla hepsini bir döngü içerisinde işleyebilirsiniz.
Verileri Yapılandırılmış Formatlara Dönüştürme
Topladığınız verileri genellikle bir CSV dosyasına veya JSON formatına kaydetmek istersiniz. Aşağıdaki örnekte, kazınan verilerin bir Python sözlüğünde (dictionary) nasıl tutulacağını görebilirsiniz.
veriler = []
urunler = soup.find_all('div', class_='urun-kart')
for urun in urunler:
isim = urun.find('h2').text
fiyat = urun.find('span', class_='fiyat').text
veriler.append({'isim': isim, 'fiyat': fiyat})
print(veriler)
Bu işlem, verileri daha sonra pandas kütüphanesi ile Excel'e aktarmanıza veya bir veritabanına kaydetmenize olanak tanır.
Web Kazıma Yöntemlerinin Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Beautiful Soup | Hızlı, basit, statik sayfalar için ideal | JavaScript ile yüklenen içerikleri göremez |
| Selenium | Dinamik içerikleri işler, tarayıcı taklidi yapar | Daha yavaş ve yüksek kaynak tüketimi |
| Scrapy | Büyük ölçekli projeler için profesyonel | Öğrenme eğrisi daha dik |
Güvenlik ve Etik Uyarılar
Dikkat: Web kazıma yaparken hedef sunucuyu aşırı isteklerle yormayın (DoS saldırısı etkisi yaratabilir). Her zaman
time.sleep()kullanarak istekler arasına gecikme ekleyin. Ayrıca, kişisel verileri veya telif hakkı olan içerikleri izinsiz kazımak hukuki sorunlara yol açabilir. Kullanıcı girişi gerektiren alanlarda şifre veya hassas veri kazımaya çalışmayın.
Sıkça Sorulan Sorular
Beautiful Soup neden JavaScript ile çalışan sitelerde çalışmıyor?
Beautiful Soup sadece sunucudan gelen ham HTML'i okur. Eğer bir site içeriği JavaScript ile tarayıcı tarafında yüklüyorsa, Beautiful Soup bu içeriği göremez. Bu tür siteler için Selenium veya Playwright kullanmalısınız.
"NoneType" hatası neden alıyorum?
Bu hata genellikle find() metodunun aradığınız etiketi bulamadığı anlamına gelir. Sayfa yapısı değişmiş olabilir veya CSS seçiciniz yanlış olabilir. Her zaman işlem yapmadan önce etiketin bulunup bulunmadığını kontrol edin.
Web kazımada IP banı nasıl engellenir?
Sunucular çok sık istek gönderen IP adreslerini engelleyebilir. Bunu engellemek için "User-Agent" başlığınızı değiştirin ve istekler arasına rastgele sürelerde bekleme (sleep) koyun.
Beautiful Soup ile form doldurulabilir mi?
Hayır, Beautiful Soup bir tarayıcı değildir, sadece bir ayrıştırıcıdır. Form doldurma veya butonlara tıklama gibi etkileşimli işlemler için Selenium gibi otomasyon araçları gerekir.
Kazınan verileri nasıl veritabanına aktarırım?
Python'un yerleşik sqlite3 kütüphanesini kullanarak kazıdığınız verileri yerel bir SQLite veritabanına kolayca kaydedebilirsiniz.
Web Kazıma Projelerinde Performans Optimizasyonu
Büyük ölçekli veri toplama işlemlerinde, her bir sayfa için ayrı bir istek (request) göndermek hem zaman kaybına hem de sunucu tarafında engellenme riskine yol açar. Performansı artırmak için aşağıdaki stratejileri uygulayabilirsiniz:
- Oturum (Session) Kullanımı:
requests.Session()nesnesini kullanarak aynı TCP bağlantısını birden fazla istek için tekrar kullanabilir, böylece bağlantı kurulum sürelerini kısaltabilirsiniz. - Asenkron İstekler: Standart
requestskütüphanesi senkron çalışır. Çok sayıda sayfayı aynı anda çekmek içinaiohttpgibi asenkron kütüphaneleri tercih edebilirsiniz. - Yerel Önbellekleme: Kazıdığınız sayfaları HTML dosyaları olarak yerel diskinize kaydedin. Eğer veri güncelliği kritik değilse, tekrar istek atmadan önce yerel dosyanın varlığını kontrol edin.
İleri Seviye Hata Ayıklama ve İstisna Yönetimi
Web kazıma süreçlerinde en sık karşılaşılan sorunlar ağ kesintileri ve sayfa yapısının değişmesidir. Kodunuzun yarıda kesilmemesi için sağlam bir hata yakalama mekanizması kurmalısınız.
HTTP Hatalarını Yönetme
Sunucudan gelen 404 veya 500 gibi hataları yakalamak için raise_for_status() yöntemini kullanın. Bu, isteğin başarılı olup olmadığını kontrol etmenin en temiz yoludur.
import requests
from bs4 import BeautifulSoup
url = "https://ornek-site.com/veri"
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
except requests.exceptions.HTTPError as err:
print(f"HTTP Hatası oluştu: {err}")
except requests.exceptions.ConnectionError:
print("Bağlantı hatası: İnternet bağlantınızı kontrol edin.")
except Exception as e:
print(f"Beklenmeyen bir hata: {e}")
Yapısal Değişiklikleri Tespit Etme
Web siteleri zamanla HTML yapısını günceller. Kazıma kodunuzun bozulup bozulmadığını anlamak için seçicilerin (selectors) varlığını kontrol eden bir "sağlık kontrolü" (health check) fonksiyonu yazın.
def veri_cikar(soup):
baslik = soup.find('h1')
if not baslik:
raise ValueError("Sayfa yapısı değişmiş olabilir, h1 etiketi bulunamadı!")
return baslik.text.strip()
Veri Kazımada Profesyonel İpuçları
Veri kazıma sadece HTML çekmek değil, aynı zamanda verinin bütünlüğünü korumaktır. Profesyonel projelerde şu detaylara dikkat edin:
- User-Agent Rotasyonu: Sunuculara kendinizi bir tarayıcı gibi tanıtmak için
headersparametresini mutlaka kullanın. - Robots.txt Kontrolü: Bir siteyi kazımadan önce
siteadi.com/robots.txtadresini ziyaret ederek sitenin hangi bölümlerine izin verildiğini kontrol edin. - Veri Temizleme: Kazıdığınız verilerde genellikle boşluklar, yeni satır karakterleri (
\n) veya gereksiz HTML artıkları bulunur..strip()ve.get_text(strip=True)metotlarını kullanarak veriyi temizleyin.
Sonuç
Python ile Beautiful Soup kullanarak web verisi kazıma, veri odaklı projelerinizde size büyük hız kazandıracak temel bir yetenektir. Bu rehberde öğrendiğiniz yöntemlerle, statik sayfaların yapısını analiz edebilir ve istediğiniz verileri ayıklayabilirsiniz. Bir sonraki adım olarak, kazıdığınız verileri pandas kütüphanesi ile nasıl analiz edeceğinizi veya requests kütüphanesine headers ekleyerek nasıl daha profesyonel istekler göndereceğinizi araştırmanızı öneririm. Kodunuzu her zaman hata yakalama blokları (try-except) ile güçlendirmeyi unutmayın.


Yorumlar (0)
Yorum Yaz