Python İle Web Üzerinden Gerçek Zamanlı Veri Çekme Nasıl Yapılır?

Python İle Web Üzerinden Gerçek Zamanlı Veri Çekme Nasıl Yapılır?
Python İle Web Üzerinden Gerçek Zamanlı Veri Çekme Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Python ile gerçek zamanlı veri çekme süreçlerine başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı standartlarında Python 3.12 veya üzeri bir sürüm kullanmanız önerilir. Asenkron programlama (asyncio) ve WebSocket protokolü, bu eğitimin temelini oluşturacaktır.

Gerekli kütüphaneleri kurmak için terminalinizde aşağıdaki komutu çalıştırın:

pip install asyncio websockets aiohttp requests

Bu paketler; asenkron işlemler, WebSocket bağlantıları ve HTTP istekleri için endüstri standartlarıdır. Ayrıca, kodunuzu düzenli tutmak için bir sanal ortam (venv) kullanmanız, bağımlılık çakışmalarını önlemek adına kritik bir adımdır.

WebSocket Protokolü ile Canlı Veri Akışı

WebSocket, istemci ve sunucu arasında çift yönlü, sürekli açık bir bağlantı sağlar. Geleneksel HTTP istek-cevap döngüsünden farklı olarak, sunucu yeni bir veri olduğunda bunu istemciye anında iletir. Python'da websockets kütüphanesi bu iş için en verimli araçtır.

Aşağıdaki örnekte, halka açık bir WebSocket sunucusuna bağlanarak canlı veri akışını nasıl başlatacağınızı görebilirsiniz:

import asyncio
import websockets

async def veri_dinle():
    uri = "wss://echo.websocket.org" # Örnek test sunucusu
    async with websockets.connect(uri) as websocket:
        while True:
            mesaj = await websocket.recv()
            print(f"Gelen Veri: {mesaj}")

# Asenkron döngüyü başlat
asyncio.run(veri_dinle())

Bu kodda async with bloğu, bağlantının güvenli bir şekilde açılmasını ve işlem bittiğinde otomatik kapanmasını sağlar. recv() metodu ise sunucudan yeni bir paket gelene kadar bekler (blocking olmayan bekleme).

Asenkron HTTP İstekleri ile Veri Çekme

Bazen WebSocket desteği olmayan kaynaklardan veri çekmeniz gerekebilir. Bu durumda aiohttp kütüphanesi ile asenkron HTTP istekleri kullanarak, programınızın donmasını engelleyebilir ve aynı anda birden fazla kaynaktan veri alabilirsiniz.

import aiohttp
import asyncio

async def veri_cek(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            data = await response.json()
            return data

async def ana_islem():
    url = "https://api.example.com/canli-fiyat"
    sonuc = await veri_cek(url)
    print(sonuc)

asyncio.run(ana_islem())

Bu yöntem, özellikle birden fazla API'den aynı anda veri toplamanız gerektiğinde performansı ciddi oranda artırır. Geleneksel requests kütüphanesi senkron çalıştığı için, büyük ölçekli gerçek zamanlı uygulamalarda darboğaz yaratabilir.

Veri Çekme Yöntemlerinin Karşılaştırılması

Hangi yöntemi seçeceğiniz, hedeflediğiniz veri kaynağının teknik altyapısına bağlıdır. Aşağıdaki tablo, yaygın veri çekme yöntemlerini özetlemektedir:

Yöntem Teknoloji Avantajı Dezavantajı
WebSocket TCP/IP Düşük gecikme (Low latency) Bağlantı kopması yönetimi zordur
Polling HTTP GET Basit uygulama Sunucuya gereksiz yük bindirir
Server-Sent Events HTTP Stream Tek yönlü canlı akış Sadece sunucudan istemciye veri

Hata Yönetimi ve Bağlantı Dayanıklılığı

Gerçek zamanlı sistemlerde bağlantı kopmaları kaçınılmazdır. Kodunuzun sürekli çalışır kalması için "retry" (yeniden deneme) mekanizmaları kurmalısınız. Aşağıdaki örnek, bağlantı koptuğunda otomatik olarak yeniden bağlanmayı gösterir:

import asyncio
import websockets

async def guvenli_baglanti():
    uri = "wss://api.example.com/data"
    while True:
        try:
            async with websockets.connect(uri) as ws:
                print("Bağlantı kuruldu.")
                async for message in ws:
                    print(f"Veri: {message}")
        except Exception as e:
            print(f"Hata oluştu: {e}. 5 saniye sonra tekrar deneniyor...")
            await asyncio.sleep(5)

asyncio.run(guvenli_baglanti())

Bu yapı, uygulamanızın internet kesintilerinde çökmesini engeller. try-except bloğu sayesinde hata oluşsa bile döngü devam eder.

Kritik Güvenlik Uyarısı: Web üzerinden veri çekerken API anahtarlarınızı asla kodun içerisine düz metin (hardcoded) olarak yazmayın. Her zaman çevresel değişkenleri (environment variables) kullanın ve verileri işlerken gelen girdilerin doğruluğunu mutlaka kontrol edin (input validation).

Veri İşleme ve Kaydetme

Çekilen veriyi anlık olarak işlemek için pandas veya basit bir JSON dosyası kullanabilirsiniz. Gerçek zamanlı bir akışta veriyi bir veritabanına yazarken, darboğaz oluşmaması için asenkron veritabanı sürücülerini (örneğin motor veya aiopg) tercih etmelisiniz.

import json

def veriyi_kaydet(veri):
    # Basit bir dosya yazma işlemi
    with open("canli_veri.json", "a") as f:
        json.dump(veri, f)
        f.write("\n")

# Veri akışı içinde çağrılabilir
# veriyi_kaydet(gelen_mesaj)

Sıkça Sorulan Sorular

WebSocket bağlantım sürekli kopuyor, ne yapmalıyım?

WebSocket bağlantıları genellikle sunucu tarafındaki "idle timeout" (boşta kalma zaman aşımı) nedeniyle kopar. Bağlantıyı canlı tutmak için "ping-pong" paketleri gönderen kütüphane ayarlarını kontrol edin veya bağlantı koptuğunda yeniden bağlanma mantığını (reconnect logic) mutlaka ekleyin.

Çektiğim verinin doğruluğunu nasıl sağlarım?

Web'den gelen veriler her zaman güvenilir değildir. Gelen JSON verisini mutlaka bir şema (Pydantic gibi kütüphaneler ile) ile doğrulayın. Beklenmedik bir veri formatı geldiğinde uygulamanızın hata vermemesi için "try-except" blokları ile veriyi süzün.

Aynı anda binlerce veriyi nasıl işlerim?

Python'un asyncio.Queue yapısını kullanarak veri çekme ve veri işleme süreçlerini birbirinden ayırın. Bir görev veriyi çekerken, diğer görev veriyi işleyip veritabanına yazsın. Bu "Producer-Consumer" (Üretici-Tüketici) modeli performansı optimize eder.

Hangi durumlarda WebSocket yerine HTTP Polling tercih etmeliyim?

Eğer verinin saniyeler bazında güncellenmesi yeterliyse ve sunucu WebSocket desteklemiyorsa HTTP polling (belli aralıklarla istek atma) daha sürdürülebilir bir yöntemdir. WebSocket, milisaniyelik gecikmelerin kritik olduğu durumlar içindir.

Üretim ortamında veri çekme hızını nasıl sınırlarım?

API sağlayıcılarının "rate limit" (istek sınırı) kurallarına uymak zorundasınız. asyncio.sleep() kullanarak istekleriniz arasına küçük gecikmeler ekleyebilir veya bir "semaphore" kullanarak eşzamanlı istek sayısını kontrol altında tutabilirsiniz.

Yasal Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Web sitelerinden veri çekerken ilgili sitenin "robots.txt" dosyasını kontrol etmeli, kullanım koşullarına uymalı ve sunuculara aşırı yük bindirecek saldırı niteliğinde isteklerden kaçınmalısınız. İzinsiz veri kazıma (scraping) yasal sorunlara yol açabilir.

İleri Seviye Optimizasyon: Veri Akışında Performans Yönetimi

Gerçek zamanlı veri çekme süreçlerinde, özellikle yüksek frekanslı (high-frequency) veri akışlarında, Python'un tek çekirdekli yapısı darboğaz oluşturabilir. Uygulamanızın performansını artırmak için sadece asenkron yapılar kurmak yeterli değildir; aynı zamanda veri işleme hattınızı (pipeline) optimize etmeniz gerekir.

Bellek Yönetimi ve Veri Yapıları

Canlı verilerle çalışırken sürekli yeni nesneler oluşturmak, çöp toplayıcının (garbage collector) sık çalışmasına ve uygulamanın anlık donmalarına neden olur. Bunun yerine, verileri sabit boyutlu kuyruklarda (deque) tutarak bellek kullanımını stabilize edebilirsiniz.

import collections

# Maksimum 1000 elemanlık bir kuyruk oluşturun
# Yeni veri geldiğinde en eski veri otomatik silinir
data_buffer = collections.deque(maxlen=1000)

def process_live_data(new_item):
    data_buffer.append(new_item)
    # İşleme mantığı burada devam eder

Veri İşleme Hattında Multiprocessing Kullanımı

Eğer gelen veriyi aynı anda analiz etmeniz, veritabanına yazmanız ve bir API üzerinden servis etmeniz gerekiyorsa, CPU yoğun işlemleri asyncio dışına çıkararak multiprocessing modülü ile farklı çekirdeklere dağıtmalısınız.

Canlı Veri Uygulamalarında Dağıtık Mimari ve Deployment

Uygulamanız yerel ortamdan üretim ortamına geçtiğinde, ağ gecikmeleri (latency) ve sunucu kısıtlamaları ile karşılaşacaksınız. Gerçek zamanlı veri çekme projelerinde "Dockerize" edilmiş mikro hizmetler kullanmak, sistemin ölçeklenebilirliğini doğrudan etkiler.

Redis ile Veri Paylaşımı

Birden fazla veri çekme (scraper) örneği çalıştırıyorsanız, verileri ortak bir noktada toplamak için Redis'in "Pub/Sub" mekanizmasını kullanmak en verimli yöntemdir. Bu sayede veri toplayan servis ile veriyi işleyen servis birbirinden bağımsız çalışabilir.

import redis
import json

# Redis bağlantısı
r = redis.Redis(host='localhost', port=6379, db=0)

def publish_data(channel, data):
    # Veriyi JSON formatında yayınla
    r.publish(channel, json.dumps(data))

# Örnek kullanım:
# publish_data('market_updates', {'symbol': 'BTC', 'price': 50000})

Deployment Stratejileri

Canlı veri akışını yöneten uygulamalar için Supervisor veya Systemd gibi süreç yöneticileri kullanmak kritiktir. Uygulamanız bir hata nedeniyle kapandığında, bu araçlar otomatik olarak yeniden başlatma yaparak veri akışının kesintisiz sürmesini sağlar.

Profesyonel İpucu: Üretim ortamında veri çekme hızını kontrol altında tutmak için "Token Bucket" algoritmasını uygulayın. Bu, sunucuya gönderdiğiniz istek sayısını belirli bir zaman diliminde sabitleyerek IP adresinizin banlanmasını engeller.

Sonuç

Python ile gerçek zamanlı veri çekme, doğru kütüphaneler ve asenkron programlama mantığı ile oldukça güçlü bir yetenektir. WebSocket ve asenkron HTTP isteklerini kullanarak, verinin akışına hakim bir uygulama geliştirebilirsiniz. Unutmayın ki, başarılı bir veri çekme mimarisi sadece veriyi alan değil, hataları yönetebilen ve sistem kaynaklarını verimli kullanan yapıdır.

Bir sonraki adım olarak, çektiğiniz bu canlı verileri bir görselleştirme kütüphanesi (Plotly veya Dash gibi) ile tarayıcı üzerinde canlı grafiklere dönüştürmeyi deneyebilirsiniz. Bu, veriyi sadece toplamakla kalmayıp, onu anlamlı bir bilgiye dönüştürmenizi sağlayacaktır.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

Yedi yıllık dijital içerik deneyimiyle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Pratik yaşam hackleri ve ev yönetimi konularında uzmanım.

Yorumlar (0)

Yorum Yaz