İnternet, devasa bir bilgi okyanusudur ve bu bilgileri elle toplamak imkansızdır. Peki, aradığınız veriyi otomatik olarak yapılandırılmış bir şekilde elde etmek ister misiniz? Web kazıma, dijital dünyadan anlamlı veriler çıkarmanızı sağlayan güçlü bir tekniktir. Bu kapsamlı rehber, web kazımanın temellerinden ileri seviye uygulamalara kadar her şeyi adım adım açıklıyor.
Web kazıma, ya da diğer adıyla web scraping, internet sitelerinden otomatik olarak veri toplama işlemine verilen addır. Basitçe ifade etmek gerekirse, bir web sitesini programatik olarak ziyaret edip, sayfa içeriğini analiz ederek istediğiniz bilgileri çekme sürecidir. Bu yöntem, manuel veri girişinin zaman alıcı, hataya açık ve verimsiz olduğu durumlarda adeta bir kurtarıcı rolü üstlenir. Günümüzün veri odaklı dünyasında, işletmelerden araştırmacılara kadar pek çok kişi ve kurum, rekabet avantajı elde etmek, pazar eğilimlerini anlamak, ürün fiyatlarını karşılaştırmak veya bilimsel araştırmalar yapmak için web kazımadan faydalanmaktadır. Örneğin, e-ticaret şirketleri rakiplerinin fiyatlandırma stratejilerini analiz etmek için web kazımayı kullanırken, gazeteciler büyük veri kümelerinden hikayeler çıkarmak için bu tekniğe başvurabilirler.
Web kazımanın önemi sadece veri toplamakla sınırlı değildir; aynı zamanda bu veriyi dönüştürerek işlenebilir hale getirmesiyle de öne çıkar. İnternet sayfaları genellikle insan gözü için tasarlanmıştır, programatik okuma için değil. Bu nedenle web kazıma, dağınık ve düzensiz bilgiyi yapılandırılmış, analiz edilebilir formata dönüştürür. Bu sayede, toplanan veriler daha sonra çeşitli analiz araçlarıyla (örneğin, Excel, SQL veritabanları, Python’daki pandas kütüphanesi) işlenebilir ve değerli içgörüler elde edilebilir. Ayrıca, yapay zeka ve makine öğrenimi modelleri için büyük ve çeşitli veri setleri oluşturmak da web kazımanın en popüler kullanım alanlarından biridir. Örneğin, bir duygu analizi modeli geliştirmek istiyorsanız, milyonlarca yorumu web üzerinden kazıyarak eğitim verisi olarak kullanabilirsiniz. Bu süreç, sadece teknik bir yetkinlik değil, aynı zamanda etik ve yasal çerçevelere dikkat etmeyi de gerektirir, ki bu konulara ilerleyen bölümlerde değineceğiz. Kısacası, web kazıma, dijital çağın en güçlü veri toplama araçlarından biri olup, doğru kullanıldığında sınırsız fırsatlar sunar.
Web Kazımanın Temel Taşları: HTTP, HTML ve CSS Nasıl Çalışır?
Web kazıma dünyasına adım atmadan önce, internetin nasıl çalıştığını ve web sayfalarının nasıl yapılandırıldığını anlamak hayati önem taşır. Bu, kazıma sürecinde karşınıza çıkacak her türlü sorunu çözmek için sağlam bir temel oluşturacaktır. Öncelikle, HTTP (Hypertext Transfer Protocol) ile başlayalım. İnternetteki bilgi alışverişinin ana protokolüdür. Bir web tarayıcısı adres çubuğuna bir URL yazdığınızda veya bir bağlantıya tıkladığınızda, tarayıcınız aslında hedef sunucuya bir HTTP isteği (request) gönderir. Sunucu, bu isteği işler ve size genellikle bir HTML belgesi, CSS dosyaları, JavaScript kodları ve görseller içeren bir HTTP yanıtı (response) geri gönderir. Web kazıma sırasında, biz bu tarayıcı görevini üstlenerek doğrudan HTTP istekleri gönderir ve sunucudan gelen yanıtları yorumlarız.
Daha sonra, HTML (Hypertext Markup Language) devreye girer. Bir web sayfasının iskeletidir. Sayfanın başlıklarını, paragraflarını, resimlerini, bağlantılarını ve diğer tüm içerik öğelerini tanımlamak için kullanılan etiketlerden oluşur. Web kazıma yaparken, istediğimiz verilerin genellikle bu HTML etiketlerinin içine gömülü olduğunu görürüz. Örneğin, bir ürünün fiyatı ... gibi bir etiket içinde yer alabilir. Bu etiketleri doğru bir şekilde bulmak ve içindeki metni çekmek, kazıma işleminin temelini oluşturur. Son olarak, CSS (Cascading Style Sheets) ile karşılaşıyoruz. CSS, HTML belgesinin görsel sunumunu (renkler, fontlar, düzenler vb.) tanımlayan stil kuralları kümesidir. Doğrudan veri içermese de, CSS seçicileri (selectors) sayesinde HTML elemanlarını hedeflemek ve istediğimiz veriyi bulmak için sıklıkla kullanılırız. Örneğin, bir web sayfasındaki tüm ürün başlıklarının aynı CSS sınıfına sahip olması, bu başlıkları toplu halde çekmek için harika bir fırsat sunar. Yani, web kazıma aslında bir dedektiflik oyununa benzer: HTTP ile siteye sızar, HTML’deki ipuçlarını takip eder ve CSS seçicilerini kullanarak aradığımız hazineyi (veriyi) buluruz. Bu üç temel bileşenin nasıl bir araya geldiğini anlamak, her web kazıma projesinde size büyük avantaj sağlayacaktır. Bu bilgileri doğru bir şekilde yorumlamak, hem basit hem de karmaşık web sitelerinden veri çekme yeteneğinizi artıracaktır.
Python ve Popüler Kütüphanelerle İlk Kazıma İşlemimizi Nasıl Yapabiliriz?
Web kazıma için Python, sunduğu zengin kütüphane ekosistemi sayesinde en popüler dillerden biridir. Şimdi, basit bir web sitesinden veri çekmek için ilk adımlarımızı atalım. Bu süreçte iki temel kütüphane kullanacağız: requests ve Beautiful Soup. requests kütüphanesi, HTTP istekleri yapmamızı sağlarken, Beautiful Soup ise HTML ve XML belgelerini ayrıştırmamıza (parse etmemize) ve içindeki verileri kolayca bulmamıza yardımcı olur. İlk olarak, bu kütüphaneleri sisteminize kurmanız gerekiyor. Bunun için terminal veya komut istemcinizde aşağıdaki komutları çalıştırabilirsiniz:
pip install requests beautifulsoup4
Kurulum tamamlandıktan sonra, örnek bir web sitesinden (örneğin, bir blog sayfasından başlıkları ve paragraf metinlerini çekelim) veri kazıma işlemine başlayabiliriz. İşte adım adım Python kodumuz:
import requests
from bs4 import BeautifulSoup
# 1. Adım: Hedef URL'yi Belirle
url = "http://books.toscrape.com/" # Örnek bir kazıma sitesi
try:
# 2. Adım: HTTP GET İsteği Gönder
# User-Agent eklemek, bazı sitelerin botları engellemesini önleyebilir.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
response.raise_for_status() # HTTP hataları için istisna fırlatır
# 3. Adım: Sayfa İçeriğini Ayrıştır (Parse Et)
soup = BeautifulSoup(response.text, 'html.parser')
# 4. Adım: İstenen Veriyi Bul ve Çek
print(f"Kazılan URL: {url}\n")
print("-------------------- Kitap Başlıkları --------------------")
# Kitap başlıklarını içeren H3 etiketlerini buluyoruz.
# Her bir kitap bir 'article' etiketi içinde ve başlıkları 'h3' içinde.
books = soup.find_all('article', class_='product_pod')
if books:
for book in books:
title_tag = book.find('h3')
if title_tag:
# Başlık etiketi içindeki 'a' etiketinden metni alıyoruz
title = title_tag.find('a')['title']
print(f"- {title}")
# Fiyat bilgisini çekelim
price_tag = book.find('p', class_='price_color')
if price_tag:
price = price_tag.text.strip()
print(f" Fiyat: {price}")
# Stok durumunu çekelim
stock_tag = book.find('p', class_='instock availability')
if stock_tag:
stock_status = stock_tag.text.strip()
print(f" Stok: {stock_status}")
print("-" * 30)
else:
print("Sayfada kitap başlığı bulunamadı.")
except requests.exceptions.RequestException as e:
print(f"Bir hata oluştu: {e}")
except Exception as e:
print(f"Beklenmedik bir hata oluştu: {e}")
Yukarıdaki kod bloğu, http://books.toscrape.com/ adresindeki kitapların başlıklarını, fiyatlarını ve stok durumlarını çekmek için tasarlanmıştır. Öncelikle requests.get() ile web sayfasına bir istek gönderiyoruz. Ardından, gelen HTML içeriğini BeautifulSoup kullanarak ayrıştırıyoruz. soup.find_all() metodu ile belirli etiketleri ve sınıfları (CSS seçicileri gibi düşünebilirsiniz) kullanarak istediğimiz veriye ulaşıyoruz. Bu örnek, bir web sayfasının yapısını inceleyerek (tarayıcınızın geliştirici araçları ile) doğru HTML etiketlerini ve CSS sınıflarını nasıl bulabileceğinizi gösterir. Unutmayın, her web sitesinin yapısı farklıdır, bu yüzden her zaman hedef sitenin HTML'ini dikkatlice incelemeniz gerekecektir. Bu ilk adımlar, web kazımanın temel mantığını ve Python ile nasıl gerçekleştirilebileceğini anlamanız için sağlam bir başlangıç noktası sunar.
Daha Derine İnmek: Dinamik İçerik ve JavaScript Odaklı Siteler Nasıl Kazınır?
Modern web sitelerinin çoğu, içeriği yüklemek için JavaScript kullanır. Bu tür sitelerde, ilk HTTP isteğiyle gelen HTML belgesi genellikle boş veya eksik içeriğe sahiptir. İçerik, sayfa yüklendikten sonra JavaScript'in çalışmasıyla dinamik olarak oluşturulur. Bu durum, önceki bölümde kullandığımız requests ve Beautiful Soup gibi statik kazıma araçlarının yetersiz kalmasına neden olur. Çünkü bu araçlar JavaScript'i çalıştıramazlar. İşte bu noktada, gerçek bir web tarayıcısını simüle edebilen araçlar devreye girer. Selenium, bu tür dinamik içerikli sitelerden veri kazımak için en güçlü Python kütüphanelerinden biridir.
Selenium, web tarayıcılarını otomatize etmek için tasarlanmıştır. Yani, bir insan kullanıcının tarayıcıda yaptığı her şeyi (tıklama, form doldurma, sayfa kaydırma, bekleme vb.) programatik olarak yapmanızı sağlar. Bu sayede, JavaScript tarafından oluşturulan içerikler de dahil olmak üzere sayfanın nihai halini alabilir ve ardından bu içeriği Beautiful Soup gibi araçlarla ayrıştırabilirsiniz. Selenium kullanmak için öncelikle bir web tarayıcısı (örneğin Chrome veya Firefox) ve bu tarayıcıya uygun bir WebDriver (örneğin ChromeDriver) yüklemeniz gerekir. WebDriver, Selenium kodunuz ile tarayıcı arasındaki köprü görevi görür. Kurulum adımları şöyledir:
- Selenium kütüphanesini kurun:
pip install selenium - Tarayıcınızın sürümüne uygun WebDriver'ı indirin (örneğin, Chrome kullanıyorsanız ChromeDriver sitesinden). İndirdiğiniz dosyayı sistem PATH'inize ekleyin veya Python betiğinizin yanına koyun.
Şimdi, JavaScript ile yüklenen bir sayfadan veri çekme örneğini inceleyelim. Diyelim ki, bir ürün listesinin "Daha Fazla Yükle" düğmesine tıklayarak ek ürünleri getiren bir e-ticaret sitesi var:
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 bs4 import BeautifulSoup
import time
url = "https://www.example.com/dynamic-products" # Dinamik içerikli bir sayfa URL'si
# WebDriver'ı başlat (Örn: Chrome)
driver = webdriver.Chrome() # ChromeDriver'ın PATH'te olduğunu varsayar
driver.get(url)
try:
# Sayfanın tamamen yüklenmesini bekleyelim (örneğin, belirli bir elementin görünmesini)
# WebDriverWait, belirli bir koşul karşılanana kadar bekler.
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "product-list"))
)
print("Sayfa başarıyla yüklendi.")
# "Daha Fazla Yükle" düğmesine tıklayalım (varsa)
try:
load_more_button = driver.find_element(By.ID, "load-more-button")
for _ in range(3): # Üç kez tıklayalım
load_more_button.click()
time.sleep(2) # Yeni içeriğin yüklenmesi için bekle
print("Daha Fazla Yükle düğmesine tıklandı.")
except Exception:
print("Daha Fazla Yükle düğmesi bulunamadı veya daha fazla içerik yok.")
# Tüm içeriği aldıktan sonra HTML'i Beautiful Soup ile ayrıştır
soup = BeautifulSoup(driver.page_source, 'html.parser')
# Ürün başlıklarını çekelim (örneğin)
product_titles = soup.find_all('h2', class_='product-title')
if product_titles:
print("\n-------------------- Ürün Başlıkları --------------------")
for title in product_titles:
print(f"- {title.text.strip()}")
else:
print("Sayfada ürün başlığı bulunamadı.")
except Exception as e:
print(f"Bir hata oluştu: {e}")
finally:
# Tarayıcıyı kapat
driver.quit()
Yukarıdaki kod, Selenium kullanarak bir Chrome tarayıcısını başlatır, belirli bir URL'ye gider, sayfanın yüklenmesini bekler, "Daha Fazla Yükle" gibi bir düğmeye tıklayarak dinamik içeriği tetikler ve nihayetinde sayfanın tam HTML içeriğini Beautiful Soup'a aktararak veri ayrıştırma işlemini tamamlar. Gördüğünüz gibi, dinamik içerikli sitelerden veri kazıma, ek karmaşıklık getirse de, Selenium gibi güçlü araçlar sayesinde bu engellerin üstesinden gelinebilir. Ancak unutulmamalıdır ki, Selenium tarayıcıyı başlattığı için requests'e göre daha fazla kaynak tüketir ve daha yavaştır. Bu nedenle, sadece dinamik içeriğe ihtiyaç duyduğunuzda kullanmanız önerilir. Ayrıca, bazen API çağrılarını taklit etmek, dinamik sitelerden veri çekmenin daha hızlı ve verimli bir yolu olabilir; bu, "Ağ" sekmesini kullanarak tarayıcınızın geliştirici araçlarında gözlemlenebilir.
Kazımayı Daha Akıllı Hale Getirmek: Vaka Analizi ve İpuçları
Web kazıma projeleri genellikle basit başlık çekmekten çok daha karmaşık senaryolar içerir. Gerçek dünyadaki bir vaka analizini ele alarak, karşılaşılabilecek sorunları ve çözüm yollarını inceleyelim: Diyelim ki, farklı e-ticaret sitelerinden belirli bir ürün kategorisindeki (örneğin, akıllı telefonlar) ürünlerin fiyatlarını, puanlamalarını ve yorum sayılarını toplayarak bir karşılaştırma platformu oluşturmak istiyorsunuz. Bu, sadece bir değil, birden fazla web sitesinden tutarlı veri çekmeyi gerektirir. Bu tür bir projede, her sitenin kendine özgü HTML yapısı, CAPTCHA'lar, IP engellemeleri ve dinamik içerik yükleme mekanizmaları gibi çeşitli zorluklarla karşılaşabilirsiniz.
Vaka Analizi: E-ticaret Fiyat Karşılaştırması
Bu senaryoda karşılaşılabilecek sorunlar ve çözüm önerileri:
- Farklı HTML Yapıları: Her e-ticaret sitesinin ürün kartları, fiyat etiketleri veya puanlama sistemleri için farklı HTML etiketleri ve CSS sınıfları kullanması olasıdır.
- Çözüm: Her site için özel ayrıştırma kuralları (Beautiful Soup seçicileri) veya Scrapy gibi bir framework kullanarak her site için ayrı Spider'lar (kazıyıcılar) geliştirmek. Başlangıçta manuel inceleme ile anahtar seçicileri belirlemek kritik öneme sahiptir.
- IP Engellemeleri ve Hız Sınırlamaları: Bir siteyi çok hızlı veya çok fazla sayıda istek göndererek kazımaya çalışmak, IP adresinizin geçici veya kalıcı olarak engellenmesine neden olabilir.
- Çözüm:
- Gecikmeler (Delays): İstekler arasına rastgele gecikmeler (örneğin, 2-5 saniye) eklemek.
time.sleep()fonksiyonu bu amaçla kullanılabilir. - Proxy Sunucular: Farklı IP adresleri üzerinden istek göndermek için proxy havuzları kullanmak. Ücretsiz proxy listeleri veya ücretli proxy hizmetleri tercih edilebilir.
- User-Agent Rotasyonu: Her istekte farklı bir User-Agent başlığı göndermek, bot olarak algılanma riskini azaltabilir.
- Gecikmeler (Delays): İstekler arasına rastgele gecikmeler (örneğin, 2-5 saniye) eklemek.
- Çözüm:
- CAPTCHA'lar ve Bot Algılama Sistemleri: Bazı siteler, insan olduğunuzu doğrulamak için CAPTCHA'lar veya gelişmiş bot algılama teknikleri kullanır.
- Çözüm: Basit CAPTCHA'lar için görsel işleme (OpenCV) veya OCR (Tesseract) denenebilir. Daha karmaşık CAPTCHA'lar (reCAPTCHA v2/v3) için CAPTCHA çözme hizmetleri (örneğin, 2Captcha, Anti-Captcha) kullanmak veya Selenium ile manuel çözüm gerektiren durumlarda insan müdahalesi sağlamak gerekebilir.
- Dinamik İçerik Yüklemesi: Ürünlerin listelendiği sayfa, "Daha Fazla Yükle" düğmeleri veya sonsuz kaydırma (infinite scrolling) ile dinamik olarak yüklenebilir.
- Çözüm: Selenium gibi Headless tarayıcıları otomatize eden araçlar kullanmak veya tarayıcının geliştirici araçlarındaki "Ağ" (Network) sekmesini izleyerek AJAX isteklerini tespit edip doğrudan bu API endpoint'lerinden veri çekmeye çalışmak. Bu, genellikle en verimli yöntemdir.
Bu vaka analizinde de görüldüğü gibi, etkili bir web kazıma stratejisi, sadece kod yazmaktan ibaret değildir. Hedef sitenin davranışlarını anlamak, teknik zorluklara yaratıcı çözümler bulmak ve sürekli adapte olmak gereklidir. Başarılı bir kazıma projesi için esneklik ve problem çözme becerisi anahtar faktörlerdir.
Etik ve Yasal Sınırlar: Web Kazımada Nelere Dikkat Etmeliyiz?
Web kazıma, büyük veri kümelerine ulaşmak için güçlü bir araç olsa da, bu gücü kullanırken etik ve yasal sınırlar içinde kalmak kritik öneme sahiptir. "Herkesin erişebildiği bilgi halka açıktır" gibi bir yanılgı, ciddi hukuki sonuçlara yol açabilir. Bu nedenle, bir kazıma projesine başlamadan önce aşağıdaki önemli noktaları göz önünde bulundurmalısınız:
- robots.txt Dosyasını Kontrol Edin: Her web sitesinin kök dizininde bulunan
robots.txtdosyası, site sahiplerinin arama motoru botlarına ve diğer web kazıyıcılarına hangi sayfalara erişip erişemeyeceklerini bildirmek için kullandıkları bir protokoldür. Bu dosyayı inceleyerek, kazıma yapmayı planladığınız alanların "Disallow" kuralı ile yasaklanıp yasaklanmadığını kontrol etmelisiniz. Bu, bir site sahibinin kazıma isteğine ilişkin açık bir belirtisidir ve etik olarak buna uymak önemlidir. Örneğin,User-agent: * Disallow: /private/kuralı, tüm botların/private/dizinine erişmesini yasaklar. - Kullanım Şartları (Terms of Service) ve Telif Hakkı: Birçok web sitesi, kullanım şartları belgesinde veri kazımayı açıkça yasaklar. Bu şartları ihlal etmek, yasal işlem riski taşır. Ayrıca, çekilen verilerin telif hakkı koruması altında olup olmadığını da değerlendirmelisiniz. Başkalarının fikri mülkiyetini izinsiz kullanmak veya ticari amaçlarla yeniden yayınlamak yasa dışıdır. Verileri sadece kişisel analiz veya araştırma amacıyla kullanmak ve asla orijinal kaynağı belirtmeden paylaşmamak en güvenli yaklaşımdır.
- Sunucu Yükü ve Kibarlık: Web kazıma işlemleri, hedef sunucular üzerinde ek yük oluşturur. Çok fazla veya çok hızlı istek göndermek, sitenin yavaşlamasına veya hatta çökmesine neden olabilir. Bu, site sahipleri için ciddi bir sorun olup, yasal yollara başvurmalarına yol açabilir. Kazıma yaparken mutlaka istekler arasına gecikmeler (
time.sleep()) eklemeli, sunucuya gereksiz yük bindirmemelisiniz. Kibar bir kazıyıcı (polite scraper) olmak, hem etik açıdan doğru hem de IP adresinizin engellenme riskini azaltır. - Kişisel Verilerin Korunması (GDPR, KVKK vb.): Özellikle Avrupa Birliği'nde GDPR (Genel Veri Koruma Tüzüğü) ve Türkiye'de KVKK (Kişisel Verilerin Korunması Kanunu) gibi yasalar, kişisel verilerin toplanması, işlenmesi ve saklanması konusunda katı kurallar getirmiştir. İsimler, e-posta adresleri, telefon numaraları gibi kişisel olarak tanımlanabilir bilgileri kazırken son derece dikkatli olmalısınız. Bu tür verileri izinsiz toplamak ve kullanmak ağır para cezalarına ve hukuki yaptırımlara neden olabilir. Mümkünse, anonim veya toplu verilerle çalışmayı tercih edin.
Özetle, web kazıma yaparken her zaman "kötü niyetli bir aktör" olmaktan kaçınmalısınız. Şeffaf, saygılı ve yasalara uygun bir şekilde hareket etmek, hem sizin hem de veri topladığınız platformun çıkarlarını korur. Her projeye başlamadan önce kendinize şu soruları sorun: "Bu veriyi kazımak etik mi?", "Yasal olarak izinli miyim?", "Hedef siteye zarar veriyor muyum?" Bu sorulara dürüstçe yanıt vermek, sizi birçok sorundan kurtaracaktır.
Kazıma Verilerini Düzenlemek ve Saklamak: Tablolar ve Veritabanları
Topladığınız ham veriler genellikle dağınık ve işlenmemiş haldedir. Bu verilerin anlamlı içgörüler sunabilmesi için düzenlenmesi ve kalıcı olarak saklanması gerekir. Kazıma verilerini düzenlemek ve depolamak için çeşitli yöntemler ve araçlar mevcuttur. En yaygın ve etkili yaklaşımlardan biri, verileri yapılandırılmış bir formatta tutmak, ki bu da genellikle tablolar ve veritabanları aracılığıyla yapılır.
Verileri Yapılandırma ve CSV/Excel'e Aktarma
İlk ve en basit yöntem, kazıdığınız verileri CSV (Comma Separated Values) veya Excel dosyalarına aktarmaktır. Bu formatlar, küçük ve orta ölçekli veri setleri için oldukça kullanışlıdır ve çoğu veri analizi aracıyla uyumludur. Python'da pandas kütüphanesi bu işlem için idealdir. Kazıdığınız her bir veri öğesini bir sözlük (dictionary) olarak düşünün, bu sözlükleri bir listeye ekleyerek daha sonra bir DataFrame'e dönüştürebilirsiniz.
import pandas as pd
# Örnek kazınmış veriler (bir liste içinde sözlükler)
kazilmis_urunler = [
{"urun_adi": "Akıllı Telefon X", "fiyat": 7500, "puan": 4.5, "yorum_sayisi": 120},
{"urun_adi": "Akıllı Telefon Y", "fiyat": 6200, "puan": 3.9, "yorum_sayisi": 85},
{"urun_adi": "Akıllı Telefon Z", "fiyat": 8900, "puan": 4.8, "yorum_sayisi": 155}
]
# Pandas DataFrame oluştur
df = pd.DataFrame(kazilmis_urunler)
# Verileri CSV dosyasına kaydet
df.to_csv("urunler.csv", index=False, encoding="utf-8")
print("Veriler 'urunler.csv' dosyasına kaydedildi.")
# Verileri Excel dosyasına kaydet (xlsxwriter kurulu olmalı: pip install openpyxl)
try:
df.to_excel("urunler.xlsx", index=False)
print("Veriler 'urunler.xlsx' dosyasına kaydedildi.")
except ImportError:
print("openpyxl kütüphanesi yüklü değil. Excel'e kaydedilemedi.")
print("\nKaydedilen verilerin önizlemesi:")
print(df.head())
Bu yöntem, verileri kolayca paylaşılabilir ve okunabilir bir formatta tutmanızı sağlar. Özellikle ilk adımlarda veya hızlı prototipleme süreçlerinde tercih edilir.
İlişkisel Veritabanlarına Aktarım (SQLite Örneği)
Daha büyük ve karmaşık veri setleri veya sürekli olarak güncellenecek veriler için ilişkisel veritabanları daha uygun bir çözümdür. SQLite, Python ile kullanımı kolay, dosya tabanlı bir ilişkisel veritabanıdır ve genellikle küçük/orta ölçekli projeler için mükemmel bir başlangıç noktasıdır. Diğer ilişkisel veritabanları (PostgreSQL, MySQL) için de benzer prensipler geçerlidir, sadece bağlantı dizeleri ve kütüphaneler değişir.
import sqlite3
import pandas as pd
# Örnek kazınmış veriler
kazilmis_urunler = [
{"urun_adi": "Akıllı Telefon X", "fiyat": 7500, "puan": 4.5, "yorum_sayisi": 120},
{"urun_adi": "Akıllı Telefon Y", "fiyat": 6200, "puan": 3.9, "yorum_sayisi": 85},
{"urun_adi": "Akıllı Telefon Z", "fiyat": 8900, "puan": 4.8, "yorum_sayisi": 155}
]
# Veritabanı bağlantısı oluştur (varsa bağlanır, yoksa yeni bir dosya oluşturur)
conn = sqlite3.connect("web_scraping_verileri.db")
cursor = conn.cursor()
# Tablo oluşturma (varsa silip yeniden oluşturur)
cursor.execute('''
CREATE TABLE IF NOT EXISTS urunler (
id INTEGER PRIMARY KEY AUTOINCREMENT,
urun_adi TEXT NOT NULL,
fiyat REAL,
puan REAL,
yorum_sayisi INTEGER
)
''')
conn.commit()
# Verileri veritabanına ekle
for urun in kazilmis_urunler:
cursor.execute('''
INSERT INTO urunler (urun_adi, fiyat, puan, yorum_sayisi)
VALUES (?, ?, ?, ?)
''', (urun["urun_adi"], urun["fiyat"], urun["puan"], urun["yorum_sayisi"]))
conn.commit()
print("Veriler 'urunler' tablosuna başarıyla eklendi.")
# Veritabanından verileri sorgula ve DataFrame'e yükle
df_db = pd.read_sql_query("SELECT * FROM urunler", conn)
print("\nVeritabanından çekilen verilerin önizlemesi:")
print(df_db.head())
# Bağlantıyı kapat
conn.close()
Veritabanları, verileri daha organize bir şekilde saklamanın yanı sıra, sorgulama (SQL ile), güncelleme ve silme gibi işlemleri de kolaylaştırır. Ayrıca, büyük veri setlerini yönetmek için daha performanslıdırlar. Hangi depolama yöntemini seçeceğiniz, projenizin ölçeğine, veri hacmine ve veriyi nasıl kullanmayı planladığınıza bağlıdır. Basit projeler için CSV/Excel yeterli olurken, daha karmaşık ve sürekli güncellenen veriler için veritabanları vazgeçilmezdir.
Geleceğe Hazırlık: Mobil Uyumlu Kazıma Çözümleri ve Adaptif Yaklaşımlar
Günümüzde internet trafiğinin büyük bir kısmı mobil cihazlardan gelmektedir ve birçok web sitesi, mobil cihazlar için özel olarak optimize edilmiş veya tamamen farklı bir görünüme sahip olabilir. Bu durum, web kazıma stratejilerinizi mobil uyumlu hale getirmenizi gerektirebilir. Mobil uyumlu kazıma, yalnızca responsive tasarıma sahip siteleri değil, aynı zamanda mobil uygulamalar aracılığıyla sunulan verileri de kapsayabilir. Bu bölümde, mobil uyumlu kazıma çözümlerine ve adaptif yaklaşımlara odaklanacağız.
Mobil Optimizasyon ve Duyarlı Tasarımlara Uyum
Modern web sitelerinin çoğu duyarlı (responsive) tasarım kullanır. Bu, aynı HTML ve CSS kodunun ekran boyutuna göre farklı şekillerde görüntülendiği anlamına gelir. Kazıma yaparken, farklı ekran boyutlarındaki düzen değişiklikleri, belirli HTML elementlerinin görünürlüğünü veya konumunu etkileyebilir. Örneğin, mobil görünümde bir navigasyon menüsü gizlenebilir veya farklı bir CSS sınıfına sahip bir "hamburger" menü simgesi aracılığıyla erişilebilir hale gelebilir.
- User-Agent Taklidi: İsteklerinizde bir mobil cihazın User-Agent başlığını göndermek, web sitesinin size mobil görünümü sunmasını sağlayabilir. Bu, bazen mobil siteye özgü farklı bir HTML yapısı veya API endpoint'leri keşfetmenize yardımcı olabilir.
- Viewport Boyutu Simülasyonu: Selenium gibi araçlarla, tarayıcının pencere boyutunu bir mobil cihazın ekran boyutuna ayarlayabilirsiniz. Bu, web sitesinin mobil düzenini tetikler ve kazıyıcınızın bu düzene göre elementleri bulmasını sağlar.
from selenium import webdriver driver = webdriver.Chrome() # Mobil boyut ayarlama (örneğin iPhone X) driver.set_window_size(375, 812) # Genişlik, Yükseklik driver.get("https://www.example.com") # ... kazıma işlemlerine devam et ... driver.quit() - CSS Media Query Örnekleri (Bilgi Amaçlı): Web siteleri, mobil görünümleri genellikle CSS media query'leri ile oluşturur. Kazıma yaparken bu query'leri doğrudan kullanmasak da, bir sitenin mobil ve masaüstü arasında nasıl değiştiğini anlamak için bu tür bir yapıya aşina olmak faydalıdır:
/* Genel stil kuralları */ .menu-item { display: inline-block; } /* Mobil cihazlar için özel kurallar */ @media (max-width: 768px) { .menu-item { display: block; width: 100%; } .sidebar { display: none; /* Yan menü mobil görünümde gizlenebilir */ } .hamburger-menu { display: block; /* Hamburger menü ikonu görünür */ } }
Bu tür bir CSS yapısı, kazıma yaparken masaüstü ve mobil versiyonlar arasında farklı seçiciler kullanmanız gerekebileceğini gösterir.
Mobil Uygulama API'lerinden Veri Çekme
Bazı durumlarda, bir web sitesi yerine bir mobil uygulama, ilgilendiğiniz verilerin birincil kaynağı olabilir. Bu tür senaryolarda, doğrudan mobil uygulamadan veri kazımak yerine, uygulamanın kullandığı arka uç API'lerini hedeflemek genellikle daha verimlidir. Mobil uygulamalar genellikle JSON tabanlı RESTful API'ler aracılığıyla sunucuyla iletişim kurar.
- API İzleme: Mobil uygulamanın HTTP/HTTPS trafiğini izlemek için Fiddler, Charles Proxy veya Wireshark gibi araçlar kullanılabilir. Bu araçlarla, uygulamanın hangi URL'lere istek gönderdiğini, hangi verileri (JSON formatında) aldığını ve hangi kimlik doğrulama mekanizmalarını kullandığını belirleyebilirsiniz.
- Doğrudan API İstekleri: API endpoint'lerini bulduktan sonra,
requestskütüphanesi ile doğrudan bu API'lere istek gönderebilirsiniz. Bu, genellikle bir web sitesi tarayıcı emülasyonundan çok daha hızlı ve kaynak açısından daha verimlidir.import requests import json api_url = "https://api.example.com/mobile/products" headers = { "User-Agent": "MyMobileApp/1.0 (Android; 10)", "Authorization": "Bearer YOUR_API_TOKEN" # Gerekliyse API anahtarı } response = requests.get(api_url, headers=headers) if response.status_code == 200: data = response.json() # JSON formatındaki yanıtı Python sözlüğüne dönüştür for product in data.get("products", []): print(f"Ürün Adı: {product.get('name')}, Fiyat: {product.get('price')}") else: print(f"API isteği başarısız oldu: {response.status_code}")
Mobil uyumlu kazıma, web kazıma becerilerinizi daha da ileriye taşıyan ve modern web'in karmaşık yapısına adapte olmanızı sağlayan önemli bir alandır. Doğru araçları ve yaklaşımları kullanarak, mobil odaklı veri kaynaklarından bile değerli bilgiler elde edebilirsiniz.
Sonuç: Web Kazıma Yolculuğunuzda Bir Sonraki Adımlar
Bu makalede, web kazımanın temel prensiplerinden başlayarak, Python ile pratik uygulamalara, dinamik içerikle başa çıkmaya, etik ve yasal sorumluluklara ve son olarak mobil uyumlu çözümlere kadar geniş bir yelpazeyi ele aldık. Gördüğünüz gibi, web kazıma, internetteki yapılandırılmamış veriyi değerli içgörülere dönüştürebilen güçlü bir araçtır. Ancak bu gücün, doğru araçlar, teknik bilgi ve en önemlisi etik ve yasalara uygun bir yaklaşımla kullanılması gerektiğini de unutmamak gerekir.
Web kazıma yolculuğunuz, bu rehberle sadece başlangıç noktasına ulaştı. Şimdi elinizde, keşfetmek, denemek ve öğrenmek için sağlam bir temel var. Pratik yaparak, farklı web siteleri üzerinde çalışarak ve karşılaştığınız sorunlara çözüm bularak kendinizi geliştirmeye devam edin. Yeni kütüphaneleri (örneğin Scrapy gibi daha gelişmiş framework'leri) araştırmaktan, API dokümantasyonlarını incelemekten ve geliştirici topluluklarından destek almaktan çekinmeyin. Unutmayın, her kazıma projesi benzersizdir ve sürekli öğrenmeyi gerektirir. Bu beceri, veri analizi, makine öğrenimi ve iş zekası gibi birçok alanda size kapılar açacaktır.
Sıkça Sorulan Sorular (SSS)
- Web kazıma yasa dışı mıdır?
- Kesinlikle yasa dışıdır demek doğru değildir, ancak gri bir alandır. Sitenin kullanım şartları, robots.txt dosyası ve kazınan verinin niteliği (kişisel veri, telif hakkı vb.) yasal durumu belirler. Çoğu durumda, kişisel olmayan, kamuya açık verilerin makul bir hızda ve sunucuya yük bindirmeden kazınması genellikle kabul edilebilirken, hassas verileri izinsiz toplamak veya siteye zarar vermek yasa dışıdır.
- CAPTCHA'ları nasıl aşabilirim?
- Basit CAPTCHA'lar için görsel işleme (OCR) kütüphaneleri kullanılabilir. Ancak reCAPTCHA gibi karmaşık CAPTCHA'lar genellikle insan müdahalesi veya üçüncü taraf CAPTCHA çözme servisleri (2Captcha, Anti-Captcha) gerektirir. Selenium ile insan müdahalesi de bir seçenek olabilir.
- IP adresim engellenirse ne yapmalıyım?
- IP engellemeleri, çok hızlı veya çok sayıda istek göndermenizden kaynaklanabilir. Çözümler arasında istekler arasına gecikmeler eklemek (
time.sleep()), farklı User-Agent başlıkları kullanmak ve en etkili olarak proxy sunucuları veya VPN kullanarak IP adresinizi değiştirmek yer alır. - Hangi Python kütüphanesi web kazıma için en iyisidir?
- En iyi kütüphane projenizin ihtiyaçlarına göre değişir. Statik içerikli ve basit siteler için
requestsveBeautiful Soupmükemmeldir. Dinamik içerik ve JavaScript ile yüklenen siteler içinSeleniumveyaPlaywrightgibi kütüphaneler tercih edilir. Büyük ölçekli, karmaşık ve çok sayfalı kazıma projeleri için iseScrapygibi tam teşekküllü bir framework daha uygundur. - Kazıma performansını nasıl artırabilirim?
- Performansı artırmak için eşzamansız (asynchronous) istekler (örneğin
asynciovehttpxile), çoklu iş parçacığı (multithreading) veya çoklu işlem (multiprocessing) kullanabilirsiniz. Ayrıca, yalnızca ihtiyacınız olan veriyi çekmek, DOM ağacında gereksiz aramaları azaltmak ve API'ler üzerinden veri çekme imkanı varsa bunu değerlendirmek de performansı önemli ölçüde artırır.
