Pythonでより良い地理位置情報を実装しようとしています。
Hostip.infoは、データベースの構築/維持を目的としたオープンソースプロジェクトです都市へのIPアドレスのマッピング。彼らのaboutページは、このデータベースを作成するために依存するデータソースを説明しています。
HostIPを使用して、IPアドレスから位置データを取得するには2つの方法があります。
また、適切に設計された使いやすいRESTFUL[〜#〜] api [〜#〜]:GETリクエスト文字列のi *** p = ***の後にIPアドレスを渡すだけです:
import urllib
response = urllib.urlopen('http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true').read()
print(response)
第二に、プロジェクトのウェブサイトは完全な データベース をダウンロード可能にします。
Python libではありません。しかし、 http://ipinfodb.com/ は、Python =たとえば、urllibを使用したコード。
http://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&ip=74.125.45.100
http://api.ipinfodb.com/v3/ip-country/?key=<your_api_key>&ip=74.125.45.100
無料のAPIキーをリクエストする必要があります。詳細については、 API doc を参照してください。
これらのモジュールが役立つ場合があります: MaxMindのGeoIP およびその pureバージョン 、 pytz も同様です。
私はこれを埋められた別の質問に投稿しましたが、ここにリンクされています:
#!/usr/bin/env python
from urllib2 import urlopen
from contextlib import closing
import json
# Automatically geolocate the connecting IP
url = 'http://freegeoip.net/json/'
try:
with closing(urlopen(url)) as response:
location = json.loads(response.read())
print(location)
location_city = location['city']
location_state = location['region_name']
location_country = location['country_name']
location_Zip = location['zipcode']
except:
print("Location could not be determined automatically")
HTTP GETリクエストをfreegeoip.net/{format}/{ip_or_hostname}に送信して、Python解析可能なJSON出力を受信します。
次のJSONキーを取得します。これは、必要なものに十分なはずです。
見つかった https://freegeoip.net/ ; python以下のサンプル。
import requests
FREEGEOPIP_URL = 'http://freegeoip.net/json/'
SAMPLE_RESPONSE = """{
"ip":"108.46.131.77",
"country_code":"US",
"country_name":"United States",
"region_code":"NY",
"region_name":"New York",
"city":"Brooklyn",
"Zip_code":"11249",
"time_zone":"America/New_York",
"latitude":40.645,
"longitude":-73.945,
"metro_code":501
}"""
def get_geolocation_for_ip(ip):
url = '{}/{}'.format(FREEGEOPIP_URL, ip)
response = requests.get(url)
response.raise_for_status()
return response.json()
IP API も非常に良い方法です。
import urllib
ip= '12.24.36.48'
url = 'http://ip-api.com/json/' + ip
req = urllib.request.Request(url)
out = urllib.request.urlopen(req).read()
freegeip は良い選択肢だと思います。以下は、位置とタイムゾーンを取得するためのPython 3.4.2コードです。
>>> import requests
>>> ip = '141.70.111.66'
>>> url = 'http://freegeoip.net/json/'+ip
>>> r = requests.get(url)
>>> js = r.json()
>>> js['country_code']
'DE'
>>> js['country_name']
'Germany'
>>> js['time_zone']
'Europe/Berlin'
"Geopy は、サードパーティのジオコーダーやその他のデータソースを使用して、世界中の住所、都市、国、ランドマークの座標を開発者が簡単に特定できるようにします。ウィキとして。
geopyは現在、6つのジオコーダーのサポートを含んでいます:Googleマップ、Yahoo!マップ、Windowsローカルライブ(Virtual Earth)、gecoder.us、GeoNames、MediaWikiページ(GIS拡張機能付き)、およびセマンティックMediaWikiページ。 "
私はipinfodbを使用しています。無料で(登録が必要です)、1秒あたり2クエリの制限があり、正確であるようです。
試してください:
http://api.ipinfodb.com/v3/ip-city/?key= {{API_KEY}}&ip = 190.188.221.244&timezone = true
戻り値:
OK ;; 190.188.221.244; AR;アルゼンチン;ブエノスアイレス;ラプラタ;-;-34.931; -57.949; -03:00
リクエストを使用して、私のサービスを呼び出すことができます https://ipdata.co
import requests
ip = '1.1.1.1'
response = requests.get('https://api.ipdata.co/{}'.format(ip)).json()
response['time_zone']
Pythonモジュールpygeoipをインストールする
_C:>pip install pygeoip
_
ここからGeoLite Cityのバイナリファイルをダウンロードします。 https://dev.maxmind.com/geoip/legacy/geolite/
次に:
>>> import pygeoip
>>> g = pygeoip.GeoIP('GeoLiteCity.dat')
>>> ip = '134.222.199.110' #just an example
>>> g.record_by_addr(ip)['latitude']
52.38239999999999
>>> g.record_by_addr(ip)['longitude']
4.899499999999989
>>> g.record_by_addr(ip)['time_zone']
'Europe/Amsterdam'
他のコメントにあるfreegeoipソリューションとは異なり、このオプションには1時間あたりのIP数に制限がなく、インターネットに接続せずにローカルで使用でき、一般に地理座標はより正確です。