Python İle İp Adresi Üzerinden Coğrafi Konum Sorgulama Nasıl Yapılır?

Python İle İp Adresi Üzerinden Coğrafi Konum Sorgulama Nasıl Yapılır?
Python İle İp Adresi Üzerinden Coğrafi Konum Sorgulama Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu eğitimdeki kodları çalıştırabilmek için bilgisayarınızda Python 3.10 veya üzeri bir sürümün yüklü olması önerilir. İşlemler sırasında sanal ortam (virtual environment) kullanmanız, paket bağımlılıklarını yönetmek adına en iyi pratiktir. İhtiyacımız olan temel kütüphaneleri yüklemek için terminalinize aşağıdaki komutu yazarak başlayabilirsiniz:

# Gerekli kütüphaneleri yükleyin
pip install requests geoip2

requests kütüphanesi, dış API'lere HTTP istekleri göndermek için kullanılırken, geoip2 kütüphanesi MaxMind veritabanları ile yerel sorgulama yapmanızı sağlar. Çalışma ortamınızın hazır olduğundan emin olduktan sonra ilk adımımıza geçebiliriz.

Yöntem 1: ip-api.com API'sini Kullanarak Sorgulama

En hızlı ve kurulum gerektirmeyen yöntem, ücretsiz bir API hizmeti kullanmaktır. ip-api.com, herhangi bir API anahtarı gerektirmeden hızlı sorgulama yapmanıza olanak tanır. Ancak, ticari projelerde kullanım limitlerine dikkat etmeniz gerektiğini unutmayın.

import requests

def konum_sorgula_api(ip_adresi):
    url = f"http://ip-api.com/json/{ip_adresi}"
    cevap = requests.get(url)
    if cevap.status_code == 200:
        return cevap.json()
    return None

# Kullanım örneği
ip = "8.8.8.8"
veri = konum_sorgula_api(ip)
if veri:
    print(f"Ülke: {veri.get('country')}, Şehir: {veri.get('city')}")

Bu kod bloğunda, requests kütüphanesi ile belirtilen URL'ye bir GET isteği gönderiyoruz. Dönen JSON verisi, IP adresinin coğrafi bilgilerini içeren bir sözlük yapısındadır. get() metodu ile güvenli veri çekimi yapıyoruz.

Yöntem 2: GeoIP2 ile Yerel Veritabanı Üzerinden Sorgulama

Eğer yüksek trafikli bir uygulamanız varsa, her sorguda bir API'ye istek atmak performans darboğazı yaratabilir. Bu durumda, MaxMind'ın ücretsiz "GeoLite2" veritabanını indirip yerel olarak sorgulama yapmak çok daha güvenli ve hızlıdır. Öncelikle MaxMind sitesinden GeoLite2-City.mmdb dosyasını edinmeniz gerekir.

import geoip2.database

def yerel_konum_sorgula(ip_adresi):
    # Veritabanı dosyasının yolu
    dosya_yolu = 'GeoLite2-City.mmdb'
    with geoip2.database.Reader(dosya_yolu) as reader:
        response = reader.city(ip_adresi)
        return {
            "ulke": response.country.name,
            "sehir": response.city.name,
            "enlem": response.location.latitude,
            "boylam": response.location.longitude
        }

# Kullanım örneği
try:
    print(yerel_konum_sorgula("8.8.8.8"))
except Exception as e:
    print(f"Hata: {e}")

Bu yöntemin en büyük avantajı, ağ bağımlılığını ortadan kaldırmasıdır. with bloğu kullanarak veritabanı bağlantısını güvenli bir şekilde kapatıyoruz, bu da bellek sızıntılarını önler.

Karşılaştırmalı Analiz: API vs Yerel Veritabanı

Özellik API (ip-api vb.) Yerel Veritabanı (GeoIP2)
Hız Düşük (Ağ gecikmesi) Çok Yüksek
Kurulum Çok Kolay Orta (Veritabanı yönetimi)
Güvenilirlik Servis sağlayıcıya bağlı Tamamen yerel
Kullanım Alanı Küçük projeler/Test Kurumsal/Yüksek trafik

Güvenlik ve Hata Yönetimi

IP sorgulama işlemleri sırasında en sık yapılan hata, gelen verinin doğruluğunu kontrol etmemektir. Kullanıcıdan alınan IP adreslerini doğrudan sorguya sokmak, uygulamanızı "Command Injection" veya "SSRF" (Server-Side Request Forgery) saldırılarına açık hale getirebilir. Her zaman IP adresinin geçerli bir formatta olup olmadığını kontrol edin.

import ipaddress

def ip_dogrula(ip_adresi):
    try:
        ipaddress.ip_address(ip_adresi)
        return True
    except ValueError:
        return False

# Güvenli kullanım
ip = "192.168.1.1"
if ip_dogrula(ip):
    # Sorgulama işlemini başlat
    pass
else:
    print("Geçersiz IP adresi formatı.")

Kritik Uyarı: Üretim ortamında (Production) asla kullanıcı tarafından sağlanan ham IP verisini doğrudan API isteklerinde kullanmayın. Her zaman ipaddress kütüphanesi ile veriyi doğrulayın ve API anahtarlarınızı çevresel değişkenlerde (environment variables) saklayın.

Toplu IP Sorgulama ve Veri İşleme

Eğer bir log dosyasındaki binlerce IP adresini aynı anda analiz etmeniz gerekiyorsa, bir döngü kurarak verileri liste veya sözlük yapısında toplayabilirsiniz. Bu işlem sırasında API limitlerine (rate limit) takılmamak için time.sleep() kullanarak istekleri aralıklı göndermek iyi bir pratiktir.

import time

ip_listesi = ["8.8.8.8", "1.1.1.1", "185.179.25.1"]
sonuclar = []

for ip in ip_listesi:
    sonuc = konum_sorgula_api(ip)
    sonuclar.append(sonuc)
    time.sleep(1) # Saniyede bir istek atarak engellenmeyi önleyin

print(sonuclar)

Sıkça Sorulan Sorular

1. IP adresi üzerinden konum sorgulamak %100 doğru mudur?

Hayır. IP tabanlı coğrafi konum verileri, ISP (İnternet Servis Sağlayıcı) kayıtlarına dayanır. VPN, Proxy veya Tor kullanımı gibi durumlarda dönen veri, kullanıcının gerçek fiziksel konumunu değil, çıkış düğümünün konumunu gösterir.

2. Yerel veritabanı dosyası ne kadar sürede güncellenmelidir?

IP blokları sürekli değişmektedir. MaxMind gibi sağlayıcılar genellikle haftalık güncellemeler yayınlar. Doğru sonuçlar için veritabanını en az ayda bir kez güncellemeniz önerilir.

3. Ücretsiz API'ler ticari projelerde kullanılabilir mi?

Çoğu ücretsiz API'nin ticari kullanım için katı kuralları ve limitleri vardır. Ticari bir projede kullanacaksanız, kullanım şartlarını (Terms of Service) mutlaka okumalı ve gerekirse ücretli planlara geçmelisiniz.

4. IPv6 adreslerini sorgulayabilir miyim?

Evet, hem ip-api.com hem de geoip2 kütüphaneleri IPv6 adreslerini desteklemektedir. Kodlarınızda özel bir değişiklik yapmanıza gerek yoktur.

5. Sorgulama yaparken gizlilik kurallarına (KVKK/GDPR) dikkat etmeli miyim?

Evet. IP adresi kişisel veri olarak kabul edilir. Topladığınız bu verileri nerede, ne amaçla kullandığınızı ve nasıl sakladığınızı gizlilik politikanızda belirtmeniz yasal bir zorunluluktur.

Performans Optimizasyonu ve Önbellekleme Stratejileri

IP sorgulama işlemleri, özellikle yüksek trafikli web uygulamalarında ciddi bir gecikme kaynağı olabilir. Her istekte harici bir API'ye bağlanmak veya yerel veritabanında disk okuma işlemi yapmak, sistemin yanıt süresini (latency) artırır. Bu durumu minimize etmek için önbellekleme (caching) mekanizmalarını kullanmak kritiktir.

Redis ile Hızlı Veri Erişimi

Sık sorgulanan IP adreslerinin sonuçlarını Redis gibi bir bellek içi (in-memory) veri deposunda tutarak, veritabanı veya API yükünü %90 oranında azaltabilirsiniz. Aşağıdaki örnek, sorgu sonuçlarını 24 saat boyunca Redis üzerinde saklayan bir yapı sunar:

import redis
import json

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

def get_location_with_cache(ip_address):
    # Önbellekte var mı kontrol et
    cached_data = cache.get(ip_address)
    if cached_data:
        return json.loads(cached_data)
    
    # Yoksa veritabanından/API'den çek (Burada fonksiyonunuzu çağırın)
    location_data = fetch_from_source(ip_address)
    
    # Önbelleğe al (TTL: 86400 saniye = 24 saat)
    cache.setex(ip_address, 86400, json.dumps(location_data))
    return location_data

Coğrafi Veri Görselleştirme: Folium ile Harita Üzerinde Gösterim

Elde edilen enlem ve boylam verilerini ham metin olarak sunmak yerine, kullanıcılarınıza görsel bir harita üzerinde göstermek projenizin değerini artıracaktır. Python'un folium kütüphanesi, bu verileri interaktif HTML haritalarına dönüştürmek için idealdir.

Harita Oluşturma Adımları

Aşağıdaki kod bloğu, belirli bir IP adresinden elde edilen koordinatları bir harita dosyasına (map.html) işler:

import folium

def create_map(lat, lon, city):
    # Harita merkezini belirle
    my_map = folium.Map(location=[lat, lon], zoom_start=10)
    
    # Konum işaretçisi ekle
    folium.Marker(
        [lat, lon], 
        popup=city, 
        icon=folium.Icon(color='red', icon='info-sign')
    ).add_to(my_map)
    
    # HTML olarak kaydet
    my_map.save("konum_haritasi.html")
    print("Harita 'konum_haritasi.html' olarak kaydedildi.")

# Örnek kullanım
create_map(41.0082, 28.9784, "İstanbul")

İleri Seviye İpuçları

  • Toplu İşleme (Batch Processing): Eğer milyonlarca satırlık bir log dosyanız varsa, sorguları tek tek yapmak yerine multiprocessing kütüphanesini kullanarak işlemleri paralel olarak gerçekleştirin.
  • Veri Doğrulama: Sorgulama yapmadan önce IP adresinin geçerli (valid) bir IPv4 veya IPv6 formatında olup olmadığını ipaddress kütüphanesi ile mutlaka doğrulayın.
  • Hata Toleransı: API tabanlı sorgulamalarda requests.exceptions.Timeout hatalarını yakalayarak, sistemin çökmesini engelleyen "fallback" (yedek) mekanizmalar kurun.

Sonuç

Bu rehberde, Python kullanarak IP adresi üzerinden coğrafi konum sorgulamanın hem API tabanlı hem de yerel veritabanı tabanlı yollarını inceledik. Başlangıç seviyesindeki projeler için API kullanımı pratik olsa da, ölçeklenebilir ve güvenli sistemler için yerel veritabanı kullanımı her zaman daha profesyonel bir tercihtir. Bir sonraki adım olarak, elde ettiğiniz bu verileri bir veritabanına (PostgreSQL veya SQLite) kaydederek kendi lokasyon bazlı analiz panelinizi oluşturmayı deneyebilirsiniz.

Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Yazılım güvenliği ve veri gizliliği konusundaki sorumluluk tamamen uygulayıcıya aittir. Kullanıcı verilerini işlerken yerel yasalar ve yönetmeliklere (KVKK vb.) uyum sağlamak sizin sorumluluğunuzdadır.

Bu yazıya tepkinizi paylaşın:
Deniz Arıkan

On yıldır pratik yaşam çözümleri ve ev ekonomisi üzerine editörlük yapıyorum. Karmaşık süreçleri herkesin uygulayabileceği basit adımlara dönüştürme konusunda uzmanım.

Yorumlar (0)

Yorum Yaz