Следующим шагом неплохо было бы определить страну клиента. Конечно, это можно сделать по домену первого уровня, взятого из имени хоста, но, во-первых, физическое расположение хоста не всегда соответствует стране, которой приписан домен (например, хост зоны .com может находиться и в России), к тому же есть такие интернациональные домены как .org, .net, .edu и т.д.
Проблему можно разрешить, получив статистику о распределении адресного пространства от одной из организаций, ответственной за это (APNIC (), RIPE NCC(), ARIN ()). Эти организации с определенной периодичностью размещают такую статистику на своих FTP серверах. Для получения этой информации и формирования базы распределения ip адресов по странам, было решено воспользовался кодом, описанным в статье Д.Откидача "Определение страны по IP адресу" (). Приведенный в статье код распространяется под лицензией в стиле 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". Вывод на экран можно продублировать выводом в отдельный файл для последующего анализа.
Навигация