Определение страны по ip адресу

Архив WebclubТехнологии2008

Публикация прежнего Webclub · 2008 год. Примеры и сведения сохранены в историческом контексте.

Следующим шагом неплохо было бы определить страну клиента. Конечно, это можно сделать по домену первого уровня, взятого из имени хоста, но, во-первых, физическое расположение хоста не всегда соответствует стране, которой приписан домен (например, хост зоны .com может находиться и в России), к тому же есть такие интернациональные домены как .org, .net, .edu и т.д.

Проблему можно разрешить, получив статистику о распределении адресного пространства от одной из организаций, ответственной за это (APNIC (http://www.apnic.net/), RIPE NCC(http://www.ripe.net/), ARIN (http://www.arin.net/)). Эти организации с определенной периодичностью размещают такую статистику на своих FTP серверах. Для получения этой информации и формирования базы распределения ip адресов по странам, было решено воспользовался кодом, описанным в статье Д.Откидача "Определение страны по IP адресу" (http://python.ru/2002-06/69.html). Приведенный в статье код распространяется под лицензией в стиле Python и состоит из определения двух классов IPRangeDB и его наследника CountryByIP, в котором определены методы заполнения базы. Для удобства я поместил описания этих классов в отдельный модуль country.py, в конце которого добавил пару строчек:


if __name__ == "__main__":
    db = CountryByIP('country.db', 'n')
    db.fetch()

Таким образом, класс IPRangeDB можно импортировать из основного модуля и использовать для определения страны по ip адресу, а если запустить country.py, будет обновляться база соответствия ip адресов странам. Хороший вариант - периодически автоматически запускать скрипт (через cron в Linux или Task Sheduler в Windows).

В основном скрипте для определения страны пишем следующий код:


db = IPRangeDB('country.db')
undefined_country = {}

if not undefined_country.has_key(ip):
    try:
        country = db[ip]
    except KeyError:
        print 'Не удалось определить страну для: %s' % ip
        undefined_country[ip] = '00'
        country = '00'
else:
    country = '00'

Ip адреса, для которых не удалось определить страну, выводятся на экран и добавляются в словарь undefined_country. При этом стране присваивается код "00". Вывод на экран можно продублировать выводом в отдельный файл для последующего анализа.

Ещё из архива

Архив клуба
веб-разработчиков

HTML, CSS, программирование и история интернета. Публикации прежнего Webclub по своим адресам.

Открыть архив
Сайт на ноутбуке и телефоне