当我查询GeoLite2-City时,我得到错误的位置。使用ip = '104.6.30.56'的mmdb数据库。他们的演示站点返回该IP (https://www.maxmind.com/en/geoip-demo)的良好数据。
In [33]: import geoip2.database
In [34]: reader = geoip2.database.Reader('.../GeoLite2-City.mmdb')
In [35]: reader.city('104.6.30.56').city # should be Santa Rosa, Ca
Out[35]: geoip2.records.City(geoname_id=None, confidence=None, _locales=['en'], names={})
In [36]: reader.city('104.6.30.56').location # should be ~(38, -122)
Out[36]: geoip2.records.Location(postal_confidence=None, average_income=None, accuracy_radius=None, time_zone=None, longitude=-97.0, metro_code=None, population_density=None, postal_code=None, latitude=38.0)
In [37]: reader.city('173.194.116.131').city # works fine for Google
Out[37]: geoip2.records.City(geoname_id=5375480, confidence=None, _locales=['en'], names={u'ru': u'u041cu0430u0443u043du0442u0438u043d-u0412u044cu044e', u'fr': u'Mountain View', u'en': u'Mountain View', u'de': u'Mountain View', u'zh-CN': u'u8292u5ef7u7ef4u5c24', u'ja': u'u30deu30a6u30f3u30c6u30f3u30d3u30e5u30fc'})
版本:
In [39]: reader.metadata()
Out[39]: maxminddb.reader.Metadata(binary_format_major_version=2, description={u'en': u'GeoLite2 City database'}, record_size=28, database_type=u'GeoLite2-City', languages=[u'de', u'en', u'es', u'fr', u'ja', u'pt-BR', u'ru', u'zh-CN'], build_epoch=1438796457, ip_version=6, node_count=3199926, binary_format_minor_version=0)
In [40]: geoip2.__version__
Out[40]: '2.2.0'
这是因为我使用的是精简版吗?
Geoip定位只是有点准确。
像MaxMind这样的提供商尽他们最大的努力去理解什么IP地址与什么地理位置相关联。然而,这是一项艰巨的任务。IP地址可以由控制它们的公司重新分配,有些公司不公布与地址相关的地理位置,您观察到的IP可能属于远离实际用户的代理服务器,并且可能存在编译数据的错误。由于他们的在线系统返回正确的地理位置,这可能是最后一类的一个例子。
在广泛使用地理位置并将其与用户的已知事实相关联的过程中,我观察到地理位置数据库在85% - 90%的时间内是准确的。有些提供商在正确处理较难处理的IP地址方面比其他提供商做得更多,但没有一个是完美的。
如果GeoIP返回正确的结果而GeoLite没有,那么是的,您可能会看到GeoLite精度降低的影响。这实际上是一个"你想要支付吗?如果是,支付多少?"
请记住,他们最近推出了第三级"Precision"服务,City数据库本身现在是降级版本。