Web Scraping Nedir?
Web scraping, web sitelerindeki verileri otomatik olarak toplama sürecidir. Fiyat takibi, haber toplayıcılar, akademik veri setleri oluşturma veya iş zekâsı için vazgeçilmez bir beceridir. Python, bu alanda en popüler dil olma özelliğini korumaktadır.
Hangi Aracı Ne Zaman Kullanmalısınız?
- requests + BeautifulSoup: Statik HTML sayfaları için. Hızlı, hafif ve öğrenmesi kolay.
- Selenium: JavaScript ile render edilen dinamik sayfalar için. Gerçek tarayıcıyı kontrol eder.
- Scrapy: Büyük ölçekli, endüstriyel web scraping projeleri için tam teşekküllü framework.
- Playwright: Modern alternatif, async destekli ve çok dilli. Selenium'dan daha hızlı.
BeautifulSoup ile Temel Scraping
import requests
from bs4 import BeautifulSoup
import json
import time
def haberleri_cek(url: str) -> list[dict]:
"""Belirtilen haber sitesinden başlıkları çeker."""
# Gerçek bir tarayıcıymış gibi davranmak için header ekle
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 Chrome/120.0 Safari/537.36'
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 4xx/5xx hatalarında exception fırlat
except requests.RequestException as e:
print(f"İstek hatası: {e}")
return []
soup = BeautifulSoup(response.text, 'html.parser')
haberler = []
# Örnek: h2 etiketi içindeki tüm linkleri bul
for baslik_etiketi in soup.find_all('h2', class_='haber-baslik'):
baslik = baslik_etiketi.get_text(strip=True)
link = baslik_etiketi.find('a')
if baslik and link:
haberler.append({
'baslik': baslik,
'url': link.get('href', ''),
})
return haberler
# Çekilen verileri JSON dosyasına kaydet
haberler = haberleri_cek('https://ornek-haber-sitesi.com')
with open('haberler.json', 'w', encoding='utf-8') as f:
json.dump(haberler, f, ensure_ascii=False, indent=2)
print(f"{len(haberler)} haber başarıyla kaydedildi.")
Selenium ile Dinamik Sayfa Otomasyonu
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
def dinamik_icerik_cek(url: str):
"""JavaScript ile yüklenen içeriği çeker."""
# Headless mod: tarayıcı penceresi açılmadan çalışır
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=chrome_options)
try:
driver.get(url)
# Belirli bir elementin yüklenmesini bekle (max 10 saniye)
wait = WebDriverWait(driver, 10)
icerik_div = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, 'dinamik-icerik'))
)
# Sayfanın altına kadar kaydır (lazy loading için)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # İçeriğin yüklenmesini bekle
# İçeriği al
ogeler = driver.find_elements(By.CSS_SELECTOR, '.urun-karti')
sonuclar = []
for oge in ogeler:
isim = oge.find_element(By.CLASS_NAME, 'urun-adi').text
fiyat = oge.find_element(By.CLASS_NAME, 'urun-fiyat').text
sonuclar.append({'isim': isim, 'fiyat': fiyat})
return sonuclar
finally:
driver.quit() # Her zaman tarayıcıyı kapat!
Etik Scraping Kuralları
- Her istekte en az 1-2 saniye bekleyin (sunucuyu yüklemeyin).
- Sitenin
robots.txtdosyasına saygı gösterin. - Gerçekçi User-Agent header'ı kullanın ama asla kimliğinizi gizlemeye çalışmayın.
- Yalnızca kamuya açık veri için kullanın, kişisel verileri hedeflemeyin.
- API varsa scraping yerine API kullanmayı tercih edin.
⚡ Performans İpucu
Büyük ölçekli scraping için asyncio + aiohttp kombinasyonu kullanın. Eşzamanlı (concurrent) isteklerle scraping hızınızı 10-50 kat artırabilirsiniz.
