dersblog

IP ve Bölge Eşlemesi, Python

IP adresini yaklasik olarak bir bolgeye, sehre, hatta enlem boylam kordinatina eslemek icin pygeoip adli Python paketi var. Kurmak icin

sudo easy_install pygeoip

Kodun ek veri dosyalarina ihtiyaci var. Bu dosyalar

http://dev.maxmind.com/geoip/geolite#IP_Geolocation-1

adresinde Downloads bolumunden indirilebilir, GeoIP.dat.gz, GeoIPv6.dat.gz, GeoLiteCity.dat.gz dosyalari mesela. Ornek kod, mesela 212.174.157.30 ip adresi icin (adresi nslookup www.tbmm.gov.tr ile bulduk)

import pygeoipgi = pygeoip.GeoIP('[DIZIN]/GeoLiteCity.dat')
print gi.record_by_addr('212.174.157.30')

Sonuc

{'city': u'B\xfcy\xfck', 'region_name': u'61', 'area_code': 0,
'time_zone': 'Asia/Istanbul', 'dma_code': 0, 'metro_code': None,
'country_code3': 'TUR', 'latitude': 40.66669999999999, 'postal_code':
'', 'longitude': 40.400000000000006, 'country_code': 'TR',
'country_name': 'Turkey', 'continent': 'EU'}

Sonuc Istanbul (sitenin barindirma servisi degisik bir sehirde demek ki). Diger ornekler

https://github.com/appliedsec/pygeoip

Eger mesela Pandas DataFrame objesi uzerindeki bir IP adresini isleyip, hesaplanan enlem / boylam degerlerini ayni satira ayri kolonlar olarak yazmak isteseydiniz,

import pygeoip, os
import pandas as pd
gi = pygeoip.GeoIP('[DIZIN]/GeoLiteCity.dat')
def ip_loc(x):
    rec = gi.record_by_addr(x)
    lat = rec['latitude']
    lon = rec['longitude']
    return pd.Series([lat, lon], index=['latitude','longitude'])

df = pd.DataFrame({'ip': ['212.174.157.30','212.174.157.30','212.174.157.30']})
df[['latitude','longitude']] = df['ip'].apply(ip_loc)
print df

Buradan gelen sonuc

ip  latitude  longitude0  212.174.157.30   40.6667       40.41 
212.174.157.30   40.6667       40.42  212.174.157.30   40.6667      
40.4

Yukarı