Web Kazıma (Web Scraping) Nedir?
Web kazıma, internet üzerindeki web sitelerinden otomatik olarak veri çekme işlemidir. Bu işlem, genellikle belirli bir düzen içinde sunulan bilgileri toplamak, analiz etmek veya başka bir sistemde kullanmak amacıyla yapılır. Örneğin, e-ticaret sitelerinden ürün fiyatlarını karşılaştırmak, haber sitelerinden makaleler çekmek, finansal verileri izlemek veya sosyal medya platformlarından kamuya açık bilgileri toplamak gibi çeşitli kullanım alanları vardır. Manuel olarak yapılması mümkün olmayan, büyük ölçekli veri toplama ihtiyaçları için vazgeçilmez bir otomasyon aracıdır. Web kazıma betikleri, bu süreci otomatikleştirerek zaman ve emek tasarrufu sağlar. Veri, HTML formatında gelir ve betikler bu HTML'i ayrıştırarak (parsing) istenen bilgileri çıkarır.
Etik ve Yasal Hususlar
Web kazıma yaparken en önemli konulardan biri etik ve yasal sınırlamalara uymaktır. Her web sitesinin kendi kullanım koşulları ve veri politikaları bulunur. Bu koşullara riayet etmek büyük önem taşır. Çoğu site, botların ve otomatik erişimlerin nasıl davranması gerektiğini belirten bir
dosyası içerir. Bu dosyayı kontrol etmek, hangi sayfaların kazınmasına izin verildiğini veya hangi hızda erişim yapılması gerektiğini anlamak için kritik öneme sahiptir.
Yukarıdaki örnek bir
dosyasında,
tüm botlar için geçerli kuralları belirtirken,
etiketleri kazınmaması gereken dizinleri gösterir.
ise sunucuya ne kadar sürede bir istek gönderilebileceğini belirtir. Bu kurallara uymamak, IP adresinizin engellenmesine, yasal sorunlara ve etik olmayan davranışlara yol açabilir. Ayrıca, bazı ülkelerde kişisel verilerin korunmasına yönelik katı yasalar (örneğin GDPR) bulunmaktadır; bu verileri kazırken dikkatli olunmalı ve ilgili yasalara uyulmalıdır.
Web Kazıma İçin Popüler Programlama Dilleri ve Kütüphaneler
Web kazıma betikleri genellikle belirli programlama dilleri ve bu dillere özgü kütüphaneler kullanılarak geliştirilir. En popüler seçeneklerden bazıları şunlardır:
Python, sunduğu kütüphaneler ve kullanım kolaylığı nedeniyle genellikle ilk tercih olmaktadır. Şimdi Python özelindeki popüler kütüphanelere daha yakından bakalım:
Python ile Web Kazıma Kütüphaneleri:
1. Requests:
HTTP istekleri atmak için basit ve kullanıcı dostu bir kütüphanedir. Bir web sayfasının HTML içeriğini almak için kullanılır.
2. BeautifulSoup (bs4):
HTML ve XML belgelerini ayrıştırmak için mükemmel bir kütüphanedir. Requests ile alınan HTML içeriğini yapılandırılmış bir şekilde analiz etmeyi sağlar. Etiketlere, sınıflara, ID'lere göre kolayca arama yapabilir ve verileri çekebilirsiniz.
3. Scrapy:
Büyük ölçekli ve karmaşık web kazıma projeleri için tasarlanmış tam teşekküllü bir web kazıma framework'üdür. Eşzamansız işlem, orta katmanlar (middlewares), boru hatları (pipelines) gibi gelişmiş özellikler sunar. Veri toplama, işleme ve depolama süreçlerini tek bir çatı altında yönetmeyi sağlar. Bu konudaki daha fazla teknik bilgi ve kaynak için Scrapy resmi dokümantasyonunu ziyaret edebilirsiniz.
Yukarıdaki Scrapy kodu örneği, alıntıları ve yazarları toplayan, ayrıca bir sonraki sayfaya geçiş yapan basit bir örümcek (spider) gösterir. Scrapy, eşzamansız yapısı sayesinde yüzlerce veya binlerce sayfanın aynı anda işlenmesine olanak tanır.
4. Selenium:
JavaScript ile dinamik olarak yüklenen içerikleri kazımak için Selenium vazgeçilmezdir. Normalde Requests veya BeautifulSoup sadece sayfanın ilk yüklenişindeki HTML'i görürken, Selenium bir tarayıcıyı (Chrome, Firefox vb.) gerçek anlamda çalıştırır ve JavaScript'in sayfayı tamamen oluşturmasını bekler. Bu sayede, AJAX istekleriyle yüklenen veriler veya kullanıcı etkileşimleriyle (buton tıklamaları, form doldurma) ortaya çıkan içerikler de kazınabilir.
Betik Geliştirme İpuçları ve En İyi Uygulamalar
Web Kazıma Betiklerinin Pratik Uygulamaları
Web kazıma betikleri birçok farklı alanda kullanılabilir:
Sonuç
Web kazıma betikleri, dijital dünyadaki devasa veri okyanusundan değerli bilgileri çekmek için güçlü araçlardır. Python ve kütüphaneleri (Requests, BeautifulSoup, Scrapy, Selenium) bu alanda geliştiricilere büyük esneklik ve yetenekler sunar. Ancak, bu gücü kullanırken etik kurallara ve yasalara uymak esastır. Sunucuya dostça davranmak,
kurallarına riayet etmek ve veri çekme sıklığını düzenlemek, hem sizin IP adresinizin engellenmesini önler hem de web sitelerinin düzgün çalışmasını sağlar. Doğru araçlarla ve doğru yaklaşımla, web kazıma betikleri iş süreçlerinizi otomatikleştirebilir, değerli içgörüler sağlayabilir ve rekabet avantajı yaratabilir. Bu betikleri geliştirirken sabır, deneme-yanılma ve sürekli öğrenme önemli olacaktır. Başarılı ve verimli web kazıma projeleri için yukarıda belirtilen en iyi uygulamaları takip etmek, betiklerinizin sağlamlığını ve sürdürülebilirliğini artıracaktır.
Web kazıma, internet üzerindeki web sitelerinden otomatik olarak veri çekme işlemidir. Bu işlem, genellikle belirli bir düzen içinde sunulan bilgileri toplamak, analiz etmek veya başka bir sistemde kullanmak amacıyla yapılır. Örneğin, e-ticaret sitelerinden ürün fiyatlarını karşılaştırmak, haber sitelerinden makaleler çekmek, finansal verileri izlemek veya sosyal medya platformlarından kamuya açık bilgileri toplamak gibi çeşitli kullanım alanları vardır. Manuel olarak yapılması mümkün olmayan, büyük ölçekli veri toplama ihtiyaçları için vazgeçilmez bir otomasyon aracıdır. Web kazıma betikleri, bu süreci otomatikleştirerek zaman ve emek tasarrufu sağlar. Veri, HTML formatında gelir ve betikler bu HTML'i ayrıştırarak (parsing) istenen bilgileri çıkarır.
Etik ve Yasal Hususlar
Web kazıma yaparken en önemli konulardan biri etik ve yasal sınırlamalara uymaktır. Her web sitesinin kendi kullanım koşulları ve veri politikaları bulunur. Bu koşullara riayet etmek büyük önem taşır. Çoğu site, botların ve otomatik erişimlerin nasıl davranması gerektiğini belirten bir
Kod:
robots.txt
Kod:
User-agent: *
Disallow: /admin/
Disallow: /private/
Crawl-delay: 10
Kod:
robots.txt
Kod:
User-agent: *
Kod:
Disallow
Kod:
Crawl-delay
Web Kazıma İçin Popüler Programlama Dilleri ve Kütüphaneler
Web kazıma betikleri genellikle belirli programlama dilleri ve bu dillere özgü kütüphaneler kullanılarak geliştirilir. En popüler seçeneklerden bazıları şunlardır:
- Python: Şüphesiz en popüler web kazıma dilidir. Zengin kütüphane ekosistemi, basit sözdizimi ve geniş topluluk desteği sayesinde yeni başlayanlardan deneyimli geliştiricilere kadar herkes için uygundur.
- Node.js: JavaScript tabanlı olduğu için web geliştiricileri için tanıdıktır. Eşzamansız (asynchronous) yapısı sayesinde yüksek performanslı kazıyıcılar oluşturmak mümkündür.
- Ruby: `Nokogiri` ve `Mechanize` gibi güçlü kütüphanelere sahiptir. Python kadar yaygın olmasa da oldukça yeteneklidir.
- PHP: Özellikle web tabanlı araçlar veya basit kazıma görevleri için kullanılabilir.
Python, sunduğu kütüphaneler ve kullanım kolaylığı nedeniyle genellikle ilk tercih olmaktadır. Şimdi Python özelindeki popüler kütüphanelere daha yakından bakalım:
Python ile Web Kazıma Kütüphaneleri:
1. Requests:
HTTP istekleri atmak için basit ve kullanıcı dostu bir kütüphanedir. Bir web sayfasının HTML içeriğini almak için kullanılır.
Kod:
import requests
url = "https://www.example.com"
response = requests.get(url)
print(response.status_code) # HTTP durum kodu (200 başarılı)
print(response.text[:500]) # Sayfanın HTML içeriğinin ilk 500 karakteri
HTML ve XML belgelerini ayrıştırmak için mükemmel bir kütüphanedir. Requests ile alınan HTML içeriğini yapılandırılmış bir şekilde analiz etmeyi sağlar. Etiketlere, sınıflara, ID'lere göre kolayca arama yapabilir ve verileri çekebilirsiniz.
Kod:
from bs4 import BeautifulSoup
import requests
url = "https://www.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# Başlık etiketini bulma
title = soup.find('title')
if title:
print(f"Sayfa Başlığı: {title.text}")
# Belirli bir sınıf adına sahip tüm bağlantıları bulma
links = soup.find_all('a', class_='nav-link')
print("Navigasyon Bağlantıları:")
for link in links:
print(f"- {link.text}: {link.get('href')}")
# Belirli bir ID'ye sahip bir div bulma
content_div = soup.find('div', id='main-content')
if content_div:
print("\nAna İçerik Bölümü:")
print(content_div.get_text(separator=' ', strip=True)[:200]) # İçeriğin ilk 200 karakteri
Büyük ölçekli ve karmaşık web kazıma projeleri için tasarlanmış tam teşekküllü bir web kazıma framework'üdür. Eşzamansız işlem, orta katmanlar (middlewares), boru hatları (pipelines) gibi gelişmiş özellikler sunar. Veri toplama, işleme ve depolama süreçlerini tek bir çatı altında yönetmeyi sağlar. Bu konudaki daha fazla teknik bilgi ve kaynak için Scrapy resmi dokümantasyonunu ziyaret edebilirsiniz.
Kod:
# Scrapy projesi oluşturma (komut satırı)
# scrapy startproject my_scraper
# cd my_scraper
# scrapy genspider my_spider example.com
# my_spider.py içeriği (örnek)
# import scrapy
# class MySpider(scrapy.Spider):
# name = 'my_spider'
# start_urls = ['http://quotes.toscrape.com/']
# def parse(self, response):
# for quote in response.css('div.quote'):
# yield {
# 'text': quote.css('span.text::text').get(),
# 'author': quote.css('small.author::text').get(),
# 'tags': quote.css('div.tags a.tag::text').getall(),
# }
# next_page = response.css('li.next a::attr(href)').get()
# if next_page is not None:
# yield response.follow(next_page, callback=self.parse)
4. Selenium:
JavaScript ile dinamik olarak yüklenen içerikleri kazımak için Selenium vazgeçilmezdir. Normalde Requests veya BeautifulSoup sadece sayfanın ilk yüklenişindeki HTML'i görürken, Selenium bir tarayıcıyı (Chrome, Firefox vb.) gerçek anlamda çalıştırır ve JavaScript'in sayfayı tamamen oluşturmasını bekler. Bu sayede, AJAX istekleriyle yüklenen veriler veya kullanıcı etkileşimleriyle (buton tıklamaları, form doldurma) ortaya çıkan içerikler de kazınabilir.
Kod:
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
# Chrome WebDriver'ı başlatma (WebDriver'ı PATH'inize eklediğinizden emin olun)
driver = webdriver.Chrome() # Ya da webdriver.Firefox()
url = "https://www.example.com/dynamic-content"
driver.get(url)
try:
# Sayfadaki belirli bir elemanın yüklenmesini bekleme
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic-data"))
)
print(f"Dinamik İçerik: {element.text}")
# Bir butona tıklama
button = driver.find_element(By.CLASS_NAME, "load-more-button")
button.click()
# Tıklama sonrası yeni verilerin yüklenmesini bekleme
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "new-item"))
)
new_items = driver.find_elements(By.CLASS_NAME, "new-item")
for item in new_items:
print(f"Yeni Öğe: {item.text}")
except Exception as e:
print(f"Hata oluştu: {e}")
finally:
driver.quit() # Tarayıcıyı kapatma
Selenium, "headless" modda da çalıştırılabilir, yani tarayıcı arayüzü olmadan arka planda işlem yapabilir. Bu, sunucu ortamlarında veya görsel arayüze ihtiyaç duyulmayan durumlarda performans için önemlidir.
Betik Geliştirme İpuçları ve En İyi Uygulamalar
- robots.txt Kontrolü: Her zaman ilk adım olmalıdır. Sunucuyu yormamak ve yasal sorunlardan kaçınmak için bu dosyayı okuyun ve kurallarına uyun.
- İstekler Arası Gecikme (Crawl Delay): Sunucuya aşırı yük bindirmemek için ardışık istekler arasına bilerek bir gecikme (
Kod:
time.sleep()
- Kullanıcı Aracısı (User-Agent): Varsayılan Python user-agent'ı yerine gerçek bir tarayıcı user-agent'ı kullanmak, bazı sitelerin bot tespiti mekanizmalarını atlatmaya yardımcı olabilir.
Kod: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)
- Hata Yönetimi: Ağ hataları, HTTP durum kodları (404, 500), beklenmedik HTML yapısı gibi durumlara karşı betiklerinizi dirençli hale getirin (
Kod:
try-except
- Veri Saklama: Çektiğiniz verileri yapılandırılmış bir şekilde saklayın. CSV, JSON dosyaları veya bir veritabanı (SQLite, MySQL, PostgreSQL, MongoDB) yaygın seçeneklerdir.
Kod:import json data = [ {"başlık": "Makale 1", "yazar": "X"}, {"başlık": "Makale 2", "yazar": "Y"} ] with open('output.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4)
- IP Rotasyonu ve Proxy'ler: Büyük ölçekli kazımalarda IP adresinizin engellenmesini önlemek için proxy sunucuları veya IP rotasyon hizmetleri kullanmayı düşünebilirsiniz.
- CSS Seçiciler ve XPath: Veri çekmek için BeautifulSoup veya Scrapy ile CSS seçiciler (
Kod:
.class-name
Kod:#id
Kod:tag
Kod://div[@id='content']//a
- Yapısal Değişikliklere Adaptasyon: Web siteleri zamanla HTML yapılarını değiştirebilirler. Bu durumda betikleriniz bozulabilir. Betiklerinizi periyodik olarak kontrol edin ve sitenin yapısı değiştiğinde güncelleyin.
- İlerleme Kaydı (Logging): Betiğinizin ne yaptığını, hangi hatalarla karşılaştığını ve hangi verileri işlediğini kaydetmek için
Kod:
logging
- Paralel ve Dağıtılmış Kazıma: Çok büyük veri setleri için birden fazla betiği aynı anda çalıştırmak veya farklı makinelerde dağıtılmış kazıma yapmak performansı artırabilir. Ancak bu, sunucular üzerindeki yükü de artıracağı için robot.txt ve sunucu politikalarına daha sıkı uyulmasını gerektirir.
- Başarısız İstekleri Yeniden Dene: Geçici ağ sorunları veya sunucu tarafı kısıtlamalar nedeniyle bir istek başarısız olabilir. Bu durumda, betiğinizin belirli bir gecikmeyle isteği birkaç kez yeniden denemesini sağlamak, betiğin daha sağlam olmasını sağlar.
Web Kazıma Betiklerinin Pratik Uygulamaları
Web kazıma betikleri birçok farklı alanda kullanılabilir:
- Pazar Araştırması: Rakip fiyatlarını, ürün özelliklerini ve müşteri yorumlarını toplama.
- Gayrimenkul Analizi: Emlak sitelerinden ilan verilerini çekerek pazar eğilimlerini belirleme.
- Haber ve İçerik Toplama: Belirli konularda sürekli güncellenen haberleri veya makaleleri otomatik olarak alma.
- Akademik Araştırma: Bilimsel makalelerin özetlerini, anahtar kelimelerini veya atıflarını toplama.
- Sosyal Medya Analizi: Kamu açık profillerden veya paylaşımlardan veri toplayarak trendleri ve kamuoyu görüşlerini anlama.
- SEO Analizi: Web sitelerinin arama motoru sıralamalarını, geri bağlantılarını ve anahtar kelime kullanımlarını izleme.
- Finansal Veri Çekme: Borsa verileri, döviz kurları, şirket bilançoları gibi halka açık finansal bilgileri toplama.
Sonuç
Web kazıma betikleri, dijital dünyadaki devasa veri okyanusundan değerli bilgileri çekmek için güçlü araçlardır. Python ve kütüphaneleri (Requests, BeautifulSoup, Scrapy, Selenium) bu alanda geliştiricilere büyük esneklik ve yetenekler sunar. Ancak, bu gücü kullanırken etik kurallara ve yasalara uymak esastır. Sunucuya dostça davranmak,
Kod:
robots.txt