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
ipaddresskü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
multiprocessingkü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ı
ipaddresskütüphanesi ile mutlaka doğrulayın. - Hata Toleransı: API tabanlı sorgulamalarda
requests.exceptions.Timeouthataları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.


Yorumlar (0)
Yorum Yaz