什么python库可以告诉我大概的位置和时区给予一个IP地址?
希望用Python实现更好的地理位置。
Hostip.info是一个开源项目,其目标是build立/维护将数据库映射到城市的IP地址 。 他们关于页面解释数据源依靠填充这个数据库。
使用HostIP,有两种方法从IP地址获取位置数据:
他们也有一个devise良好且易于使用的RESTFUL API :在GET请求string中的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库。 但是http://ipinfodb.com/提供了一个web服务,可以通过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文档 。
你可能会发现这些模块很有用: MaxMind的GeoIP和纯粹的版本 ,以及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可以parsing的JSON输出。
我得到以下的JSON键,这应该足以满足你的需要:
- IP
- 国家代码
- 国家的名字
- REGION_CODE
- REGION_NAME
- 市
- 邮政编码
- 纬度
- 经度
- METRO_CODE
- 区号
findhttps://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也是非常好的方法。
我认为freegeip是一个不错的select。 下面是获取位置和时区的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'
我使用ipinfodb,是免费的(需要注册),并有2个查询每秒的限制,似乎是准确的。
尝试:
http://api.ipinfodb.com/v3/ip-city/?key= {{API_KEY}}&ip = 190.188.221.244&timezone = true
收益:
OK ;; 190.188.221.244; AR; ARGENTINA; BUENOS AIRES; LA PLATA; – ; – 34.931; -57.949; -03:00
“ Geopy使开发人员可以轻松地使用第三方地理编码器和其他数据源(如wiki)在全球范围内定位地址,城市,国家和地标的坐标。
geopy目前包括对六个地理编码器的支持:Google Maps,Yahoo! 地图,Windows本地Live(虚拟地球),geocoder.us,GeoNames,MediaWiki页面(带有GIS扩展)以及Semantic MediaWiki页面。 “
安装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解决scheme相反,这个选项没有每小时IP数量的限制,可以在没有互联网连接的情况下在本地使用,地理坐标通常更准确。
您可以使用请求拨打我的服务https://ipdata.co
import requests ip = '1.1.1.1' response = requests.get('https://api.ipdata.co/{}'.format(ip)).json() response['time_zone']