Synapse + NativeXML. Обработка Sitemap в Delphi.Источник: wwwwebdelphiru
Если предыдущий пост предназначался исключительно для пользователей программы "Пинговалка", то этот - для разработчиков. Сегодня будем разбираться с sitemap.xml. В целом sitemap может пригодится для чего угодно, начиная от того, чтобы просто получить список всех страниц, так и, например, для того, чтобы по полученному списку в дальнейшем спарсить названия страниц, проверить индексацию в поисковиках и т.д. Зная путь к sitemap, можно сэкономить достаточно много времени на получение необходимой информации по сайту. Как и сказано в заголовке поста - использовать будем две бесплатные, кроссплатформенные библиотеки - Synapse и NativeXML. Прежде, чем перейдем к реализации чтения sitemap в Delphi, немного разберемся с тем, что нас ждет. Немного слов про SitemapФайл Sitemap представляет собой XML-файл, в котором перечислены URL-адреса веб-сайта в сочетании с метаданными, связанными с каждым URL-адресом. В качестве мета-данных, в sitemap может содержаться следующая информация: дата последнего изменения, частота изменений, приоритетность на уровне сайта. Sitemap используется для того, чтобы поисковые системы могли более грамотно сканировать сайт. Например, запись отдельного URL с мета-данными может выглядеть так: Если сайт более менее старенький, то его Sitemap может насчитывать тысячи URL. К примеру, sitemap моего блога насчитывает сейчас 865 страниц, включая страницы по тегам. А если взять какой-нибудь варезник где обновления могут проходить по 100 штук на день? Или раскрученный, популярный форум? Там sitemap может насчитывать достаточно большое количество страниц. Поэтому разработчики протокола Sitemap сделали ограничение - 50000 URL на один файл. Также файл должен быть размером до 10 Мб. Если передается информация по 50000+ страницам, то в поисковую систему отправляется индексный файл Sitemap. В этом фале перечислены пути к XML-файлам в которых содержаться уже URL"ы страниц. Запись в индексном файле может выглядеть так: Все данные в Sitemap передаются в кодировке UTF-8. Вот, пожалуй, вся та информация, которая нам пригодится для разработки. Теперь перейдем к реализации нашей программы. Парсим Sitemap в DelphiНапишем небольшую программу, которая будет без лишних вопросов скачивать и парсить sitemap любого вида - как с индексным файлом, так и без него. Для этого, вначале немного определимся с алгоритмом. Работать будем так:
Получать будем всю доступную информацию - адреса, явки, пароли, даты изменения, приоритеты и т.д. Начнем с описания необходимых типов данных. Каждый элемент в sitemap будет представлен в виде записи (record):
Загружать и обрабатывать Sitemap будем в отдельном потоке:
Для потока определено всего два события:
Теперь жмем Ctrl+Shift+C и, если у вас Delphi не Starter Edition, то IDE создаст вам "скелеты" методов потока. рассмотрим их подробнее. Конструктор:
Метод TryLoadHeadSitemap пробует скачать XML-файл, URL которого был задан в конструкторе. Если файл успешно скачан и помещен в поле FHeaderXML (скачать мы можем и не XML), то метод вернет нам True:
IsChanked проверяет является ли загруженый в методе TryLoadHeadSitemap XML-файл индексным. Если файл индексный, то в этом же методе считываются URL'ы всех sitemap, содержащих данные по страницам сайта:
LoadFile грузит XML-файл, засположенный по адресу URL и, если файл загружен успешно, то этот файл заносится в массив FChankedXML:
Ну и, собственно, Execute в котором все эти методы собраны воедино:
Теперь нам остается только разработать GUI для нашего приложения. Так как все операции по загрузке Sitemap будут у нас выполнятся по одному клику, то GUI будет аскетичным :) 1 Edit, 1 кнопка и 1 ListView для вывода результатов - всё, что нам потребуется. Вначале определим обработчики событий потока:
Теперь, в обработчике OnClick кнопки нам остается только правильно запустить поток. Делаем это следующим образом:
Запускаем программу, вводим в edit адрес к Sitemap, жмем кнопку и спустя несколько секунд получаем результат: Как и ожидалось, при каждом получении элемента Sitemap наш список обновляется, но из за достаточно высокой скорости работы NativeXML обновление превращается в быстрое мельтешение ListView, поэтому по-хорошему, обновление следовало бы проводить только в самом конце работы потока, а для визуализации процесса заполнять ProgressBar, отсчитывать что-нибудь в Label и т.д. Также было бы неплохо предусмотреть вывод сообщений, в случае, если скачаный файл не содержит XML или скачивание вообще невозможно, но пусть реализация этих моментов останется в качестве самостоятельной работы тем, кто скачает исходники программы :). |