Задать вопрос
welcome32
@welcome32
Backend Python developer

Как получить местоположение по IP?

Есть IP. Необходимо определить примерное местоположение по нему, желательно не используя сторонние сервисы. При подключении к сайту сервер должен определять примерное местоположение пользователя.
Необходимо для определения точек, где сервис пользуется большей популярностью.
Понятно, что будет использоваться в большинстве рядом с городами, особенно крупными, но нужно определять. Если в каком-то городе, то название города и его координаты, если поселок - название поселка и его координаты.
  • Вопрос задан
  • 202 просмотра
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
deepblack
@deepblack Куратор тега Django
Используйте https://github.com/maxmind/GeoIP2-python
Его можно локально использовать, без запросов к стороннему API
spoiler
>>> import geoip2.database
>>>
>>> # This creates a Reader object. You should use the same object
>>> # across multiple requests as creation of it is expensive.
>>> reader = geoip2.database.Reader('/path/to/GeoLite2-City.mmdb')
>>>
>>> # Replace "city" with the method corresponding to the database
>>> # that you are using, e.g., "country".
>>> response = reader.city('128.101.101.101')
>>>
>>> response.country.iso_code
'US'
>>> response.country.name
'United States'
>>> response.country.names['zh-CN']
u'美国'
>>>
>>> response.subdivisions.most_specific.name
'Minnesota'
>>> response.subdivisions.most_specific.iso_code
'MN'
>>>
>>> response.city.name
'Minneapolis'
>>>
>>> response.postal.code
'55455'
>>>
>>> response.location.latitude
44.9733
>>> response.location.longitude
-93.2323
>>> reader.close()


Данный модуль встроен в Django https://docs.djangoproject.com/en/2.2/ref/contrib/...
spoiler
>>> from django.contrib.gis.geoip2 import GeoIP2
>>> g = GeoIP2()
>>> g.country('google.com')
{'country_code': 'US', 'country_name': 'United States'}
>>> g.city('72.14.207.99')
{'city': 'Mountain View',
'country_code': 'US',
'country_name': 'United States',
'dma_code': 807,
'latitude': 37.419200897216797,
'longitude': -122.05740356445312,
'postal_code': '94043',
'region': 'CA'}
>>> g.lat_lon('salon.com')
(39.0437, -77.4875)
>>> g.lon_lat('uh.edu')
(-95.4342, 29.834)
>>> g.geos('24.124.1.80').wkt
'POINT (-97 38)'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Gomonov
@Gomonov
Не всё так просто, особенно с мобильным интернетом. Я, например, нахожусь в Брянске, и если сижу с мобилы, мой ip московский. Давно уже перевалили за 50% по мобильному трафику, поэтому в большинстве случаев geo по ip определяется не точно. Конечно в массштабах стран всё - ок.

Если отвечать конкретно на Ваш вопрос, то базы maxmind в помощь. У них есть платные и бесплатные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы