什么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']