Одна из неотъемлемых частей программного обеспечения Web-сервера - сбор статистики по разнообразным показателям работы сервера за различные периоды времени. В данной статье на примере работы системы Geography дается описание и анализ путей решения проблем, возникающих при идентификации посетителей Web-сервера с помощью сетевых средств языка программирования Java.
Наиболее типичные параметры статистики: число сеансов, число запросов страниц, средняя продолжительность сеанса, среднее число загружаемых страниц за сеанс, общее число уникальных пользователей, число новых пользователей, наиболее часто запрашиваемые документы и др. Все эти сведения тем или иным способом можно собрать из регистрационных файлов (.log-файлов), генерируемых программой-сервером httpd.
Еще одним интересным показателем является статистика запросов по «географическому» признаку - из какой страны и города было сделано обращение с последующей их группировкой по регионам. Однако файлы .log не позволяют получить данную информацию; из них можно почерпнуть только доменное имя или IP-адрес машины, с которой был заход на сервер. Все, что может сделать в этой ситуации программа сбора статистики — это определить страну по последним двум буквам доменного имени. Однако и это сделать невозможно, если «гость» представлен в файле .log своим IP-адресом, либо доменный адрес заканчивается на .com, .net, .edu и т.д., что совсем не обязательно означает США (скажем, домен skif.net находится в Донецке). Разумеется, определить в такой ситуации город нельзя уже ни в каком случае, а ведь эта информация тоже интересна.
Получение «сырых» данных
Любому Internet-специалисту известно, что информацию о принадлежности IP-адреса или доменного имени можно получить на сервере www.checkdomain.com. Средства пакета java.net.* позволяют автоматизировать процесс подачи HTTP-запроса с указанием запрашиваемого адреса. Необходимо лишь, чтобы перед этим программа анализа файла .log подготовила файл со списком IP-адресов посетителей. Программа на языке Java перебирает все записи этого файла и для каждой из них генерирует запрос следующим образом (блоки обработки исключительных ситуаций для краткости опущены):
public static void main(String argv[]){ Geography ge = new Geography(); ge.start(); } public Geography(){ f1 = new File(«Adresa»); d1 = new DataInputStream(new FileInputStream(f1)); } ... public void run() { URL u; while(true) { if ((ret=d1.readLine()). length()!=0) { System.out.println(«Got string» +ret); ret=«http://www.checkdomain.com/cgi-bin/ checkdomain.pl?domain» +ret; u=new URL(ret); InputStream is = u.openStream(); System.out.println(«Link to URL Okay»);}}}
Если соединение произошло успешно, из входного потока InputStream можно считывать HTML-код результирующего документа и производить его синтаксический разбор, что является наиболее содержательной и трудной частью работы.
Следует отметить ряд обстоятельства. Во-первых, особым образом должны обрабатываться внутренние адреса типа «192.168....», на которые не имеет смысла делать запрос. Во-вторых, запрос не всегда завершается удачей. Результирующий документ может либо содержать запись «Multiple entries for address ...» (адрес не распознается однозначным образом), либо не содержать никакой географической информации, например «Russian Institute for Public Networks». В этих случаях поставленная задача, видимо, неразрешима, однако подобных адресов, к счастью, немного. Так, на базе данных посетителей сервера Сургутского государственного университета, содержащей около 12 тыс. адресов, доля «трудных» адресов составила не более 2%.
И, наконец, главная проблема. При посылке запроса, содержащего доменное имя, выясняется, что доменные системы многих государств (в частности, всех стран СНГ, кроме России) серверу www.checkdomain.com не знакомы. Бесполезно запрашивать информацию об адресах, заканчивающихся на .ua, .by, .kz, .uz и т.д. Однако по IP-адресам этих хостов информация выдается. В этой связи предварительно необходимо все доменные имена в исходном файле преобразовать в IP-адреса. В операционной системе Unix это делает команда nslookup. Для автоматизации данного процесса написана вспомогательная программа на языке Си. Есть идеальное для таких целей средство - канал «команда shell - пользовательская программа», который открывается с помощью системного вызова popen. Программа анализирует выходной поток команды nslookup (он очень прост и четко структурирован), выделяет в нем IP-адрес и записывает его отдельной строкой в выходной файл, который затем станет входным для программы на Java. Если же получить IP-адрес не удалось, в выходной поток записывается первоначальный доменный адрес. Естественно, отличить во входном файле IP-адрес от доменного труда не составляет: первый состоит только из цифр и точек, второй же содержит хотя бы одну букву.
Синтаксический анализ HTML-документа
Получение сырых данных об адресах - самая трудная часть задачи, причем положительный результат принципиально не может быть гарантирован на 100%. По сути дела, речь идет об экспертной системе с нечеткой логикой принятия решений, где практически невозможно сформулировать всегда справедливое правило.
Цель синтаксического анализа - выделение двух слов названия (кода) страны и города, в котором зарегистрирован адрес машины посетителя. Ответ сервера www.checkdomain.com содержит гораздо больше информации, вплоть до фамилий и имен системных администраторов (думаю, названий страны и города вполне достаточно, ибо слишком много информации тоже иногда плохо). Главная трудность заключается в том, что строки, содержащие требуемую информацию, не структурированы и имеют практически произвольный порядок записей.
Наиболее благоприятный вариант выдачи информации о владельце IP-адреса имеет вид, приведенный во врезке.
Географическая информация может содержаться в следующих ключевых строках:
- «Country» - двухбуквенный код страны;
- «Address» - иногда это почтовый адрес, но чаще пустая информация, например, «Provider», либо какая-нибудь аббревиатура;
- «Administrative Contact» или «Technical Contact» - полный почтовый адрес, название организации, фамилия и электронная почта ведущего специалиста.
Любые из этих четырех строк могут отсутствовать. Если нет ни одной, наша задача неразрешима. Статистический анализ нашей базы данных IP-адресов показал, что наиболее надежной в смысле присутствия названия города является строка «Technical Contact», затем «Administrative Contact», и наименее надежна «Address». Именно в таком порядке эти строки и анализируются. Название страны берется из строки «Country», а в случае его отсутствия (что характерно для американских хостов) — из других строк. Возможна и ситуация, когда есть только строка «Contact» — без прилагательного.
Наиболее содержательная и при этом трудно формализуемая часть задачи - это синтаксический разбор строки «Technical Contact» (либо «Administrative Contact» или «Address»). Количество вариантов записи адреса в этой строке очень велико и, видимо, эту ситуацию изменить нельзя. Каждый администратор сети, заполняя заявку на выделение адресов и вписывая туда свои географические данные, делает это не всегда так аккуратно, как сотрудник владивостокской организации из примера на врезке, а по-своему, в соответствии со сложившимися национальными, региональными особенностями и личными традициями, поэтому унифицировать форму записи адреса невозможно. Перечислим лишь некоторые из этих особенностей.
- Индекс, название города, страны, улицы, фирмы могут идти в любой последовательности, любое из этих полей может отсутствовать.
- Количество цифровых индексов и всевозможных буквенных аббревиатур различаются для разных стран и регионов.
- Возможен полнейший произвол с расстановкой точек и запятых, ориентация на них совершенно бесполезна при синтаксическом разборе.
- Названия стран и городов могут иметь только одну (первую) прописную букву (первую), а могут быть записаны исключительно прописными буквами.
- Название города или страны может состоять из двух и более слов, например, United Kingdom.
- Слова типа «Street», «Prospect», «Square» могут как присутствовать рядом с соответствующим названием, так и отсутствовать и даже начинаться с прописных букв, а также находиться как спереди, так и после названия.
- Иногда адрес распадается на две и более строки.
- Между различными записями (город — страна, город — улица) может отсутствовать пробел.
- Название страны или города может быть взято в скобки.
Все это приводит к тому, что очень трудно выделить слово, обозначающее название города, а зачастую, и название страны, если нет строки «Country». Типичный ошибочный результат: в качестве названия города выдается совсем другое слово.
Несмотря на это, в результате скрупулезного статистического анализа можно сформулировать некоторые эвристические правила, увеличивающие вероятность удачного распознавания. Эти правила основываются как на формальных знаковых признаках, так и — в особо тонких случаях — на семантике анализируемого текста. Например, учитывается конкретное название страны при распознавании города, если именно для этой страны записи адресов обладают устойчивыми индивидуальными отличительными особенностями.
Приведем примеры таких правил.
- Двухбуквенный код страны в строке «Country» расположен между тегами
- и .
- Адрес записывается между символом «@» и тегом , либо, если «@» отсутствует, между
- и .
- Просмотр слов следует производить справа налево, в строках «Contact» начиная от слов «Phone» или «Fax».
- Слова из набора часто повторяющихся слов которые не могут быть результатом и пропускаются, например: BOX, PROVIDER, POSTBOX, STATE, UNIVERSITY, FEDERATION, REPUBLIC, RELCOM, LIMITED, TELECOM, INSTITUTE и др.
- За словами CITY, TOWN, если они есть, идет название города.
- Слова, обозначающие промежуточную географическую принадлежность и их сокращения (например, REGION, OBLAST, KRAY) пропускаются вместе со стоящим перед ним словом.
- Слова и их сокращения, обозначающие расположение внутри города (например, STREET, St., PROSPEKT, LANE, TRAKT, SQUARE, AVENUE), пропускаются вместе со стоящим перед ним словом. Проблемы, однако, возникают, если название улицы состоит из двух слов, и оба начинаются с прописной буквы.
- Слова-результаты должны начинаться с прописной буквы.
- Результат не может содержать спецсимволы и цифры, за исключением «.» и «-» (пример: St.-Petersburg).
- Названия страны и города не могут разделять более четырех слов.
- Если в строке «Address» между тегами
- и отсутствуют другие теги и знаки пунктуации, эта строка не содержит полезной информации (иногда это не так).
- Если строка «Country» присутствует, а в строке «Contact» найдено только одно подходящее слово, то это слово название города, если же «Country» отсутствует - название страны.
Нет необходимости продолжать этот список, поскольку остальные правила (а их довольно много) слишком длинны и носят вероятностный характер.
Отметим особенно плохо преодолимые проблемы. В американских адресах часто вместо US указывается аббревиатура штата, которая совпадает с кодом другой страны, например CO - Колорадо, но и Колумбия, CA - Калифорния, но и Канада. Администратор сети может находиться в другой стране. В этом случае возникают выдачи типа «Страна: Узбекистан; Город: Москва», формально все правильно, но по смыслу абсурд; разрешение подобной ситуации требует семантического анализа.
Опыт эксплуатации
Программная система Geography уже несколько месяцев работает в качестве ежесуточно запускаемого процесса cron на сервере городской администрации Сургута admsurgut.ru; с результатами ее работы можно ознакомиться в разделе «Статистика» (см. врезку). Точность распознавания названия города доведена до 90%, а распознавания страны - 100%.
В среднем, из 50 попыток распознавания только четыре завершаются сравнительной неудачей. Назовем причины некоторых неудач.
144.206.178.31: отсутствует пробел между строками, название города было записано так: 1Moscow. Программа не нашла подходящего слова и выдала сообщение о неудаче.
195.12.67.193: перед словом Moscow отсутствовал пробел. За название города было принято название улицы.
212.248.26.29: после слово Solyanka отсутствовало слово типа street, поэтому программа, не найдя причин пропустить это слово, приняла его за название города.
195.12.94.102: название города вообще отсутствовало, хотя название улицы (40 лет Октября) приведено. Так что этот случай неудачей считаться не может.
Безусловно, данный синтаксический разбор пока далек от того, который должны выполнять коммерческие программные продукты, однако постоянная доработка системы дает основания полагать, что точность распознавания удастся повысить.
Об авторе
Илья Труб — доцент кафедры прикладной математики Сургутского государственного университета. С ним можно связаться по адресу: trub@surgu.wsnet.ru
- Owner:
- Vladivostok Long Distance And
- Address:
- International Telephone (VMTS)
36, pr. Komarova st.,
690600, Vladivostok, Russia - Country:
- RU
- Administrative Contact:
- Konstantin U Kaplin (kku@vmts.ru)
VMTS
36, pr. Komarova st.
690600 Vladivostok, Russia
Phone: +7 4232 406040
Fax: +7 4232 406029 - Technical Contact:
- Alexei V Golovin
(gav@vmts.ru)
VMTS
36, pr. Komarova st.
690600 Vladivostok, Russia
Phone: +7 4232 406040
Fax: +7 4232 406029 - Information Source:
- Reseaux IP Europeens
Фрагмент отчета программы Geography
212.44.71.76 RU KALININGRAD 212.48.141.92 RU KAZAN 209.244.183.62 US LOUISVILLE 212.107.194.18 RU VLADIVOSTOK intra.virus.ru RU MOSCOW 194.84.9.252 RU MOSCOW 213.24.102.5 RU UFA 212.164.92.4 RU KEMEROVO 195.5.135.254 RU ST.PETERSBURG 202.174.128.4 HK HONG 195.161.195.163 RU KURGAN 212.111.92.11 RU TOMSK 195.161.173.94 RU ROSTOV-ON-DON 213.59.56.135 RU EKATERINBURG 212.120.161.87 RU PERM 144.206.178.31 RU Neudacha 195.12.67.193 RU LUNACHARSKY 194.67.221.29 KZ ALMATY 212.248.26.29 RU SOLYANKA 212.96.101.20 RU STAVROPOL 192.168.13.251 RU Surgut port.tuapse.ru RUSSIA TUAPSE 212.252.6.233 TR ISTANBUL 62.24.70.140 CZ PRAHA 195.50.84.44 GB LONDON 139.20.52.75 DE FREIBERG 53.122.216.254 GERMANY STUTTGART 62.244.28.189 UA KIEV 195.12.94.102 RU LET