Поиск

Заимствование информации

Вы, наверное, видели Web-серверы, на страницах которых были достаточно новые данные котировок ценных бумаг, заголовки последних новостей или сведения о том, с каким счетом закончилась та или иная спортивная игра. Причем иногда человек, администрирующий данный Web-узел, не имеет никакого отношения к первоначальным источникам информации.

В таких случаях обычно происходит следующее: программа, работающая на компьютере, на котором находится рассматриваемая вами Web-страница, время от времени связывается с первоначальным источником информации и "вытягивает" из него данные. Затем эта информация пере форматируется и отображается на заданной странице. На рис. 24.1 показано, как выглядит этот процесс.

Таким образом, вы видите, что ваш Web-сервер с помощью CGl-программ превратился в Web-клиента. Если сервер может сам извлекать страницы, то он сможет также объединить их вместе и вновь представить информацию уже иным способом.

Важный момент: не играйте с огнем

Не спешите сразу переходить к заимствованию информации. Для начала следует запомнить несколько важных вещей. Во-первых, если информация, представленная на вашей странице, не является вашей собственностью (она получена из другого Web-сервера или чей-то базы данных), то, вероятно, она защищена авторским правом. Заимствование информации на одном Web-сервере для представления ее на другом может привести к серьезным проблемам с законом. Нарушение закона об авторском праве может повлечь за собой закрытие вашего Web-сервера, наложение санкций на вашего провайдера, а вас могут оштрафовать, заключить в тюрьму и возбудить уголовное дело.

Все это возможные следствия отсутствия культуры работы в Internet.

Прежде чем использовать информацию из другого источника на своем Web-сервере, всегда спрашивайте разрешение на это. Большинство владельцев Web-серверов разрешат вам отображать содержимое их страниц, но могут попросить вас соблюдать некоторые правила и выполнить несколько ответных шагов, которые перечислены ниже.

  • Вы указываете источник информации — возможно, с помощью баннера, гиперссылок или текста.
  • Четко формулируете, кому принадлежит авторское право на представляемую информацию, и указываете, что она используется с разрешения автора.
  • Возможно, вам не разрешат создать "глубокую связь" с авторским Web-сервером, т.е. связываться со страницами, которые находятся на несколько уровней глубже главной страницы. Скорее всего, владельцы сервера предпочтут, чтобы вы создали ссылку только на страницу самого верхнего уровня.
  • Возможно, вам разрешат обновлять "вытягиваемую" с сервера информацию только время от времени. Некрасиво перегружать трафик на чужом сервере только ради того, чтобы улучшить впечатление от своего.

Владельцы Web-сервера Slashdot.Org, девиз которых звучит "Новости для технарей", а информация рассчитана на пользователей с техническим образованием, позвонили мне использовать их сервер при написании книги, чтобы на примерах продемонстрировать возможности языка Perl. Поэтому, прежде чем реализовать коды программ из описанных ниже примеров на собственных Web-страницах, вы должны спросить разрешения у их авторов. Подробные сведения о том, как с ними связаться, можно найти на их Web-сервере и в разделе FAQ по адресу http://www.slashdot.org.

Пример: „вытягивание"заголовков

Схема отображения заголовков сервера Slashdot.Org на вашей Web-странице выглядит примерно так.

  1. CGI-программа headlines.cgi запускается через анализируемую серверомWeb-страницу.
  2. Затем CGI-программа проверяет, самый ли свежий вариант заголовков находится на локальном диске. Если да, то она использует его. В противном случае программа "вытягивает" новые заголовки с Web-сервера Slashdot.Org.
  3. После этого CGI-программа анализирует файл заголовков и отображает их на своей Web-странице.

Для "вытягивания" Web-страницы или любого другого содержимого какого-либо Web-сервера вам нужен модуль LWP::Simple, который не входит в стандартную поставку Perl. Модуль LWP позволяет "вытягивать" из Internet все виды информации: Web-страницы, файлы через протокол FTP, статьи из групп новостей и т.д.

Модуль LWP:: Simple является составной частью пакета под именем libwww-perl. В этом пакете содержатся модули для "вытягивания" Web-страниц, анализаторы HTML-кода и URL, средства навигации по Web-серверу и многое другое. Эти модули дают вам колоссальные преимущества, так что имеет смысл потратить время на их установку. Пакет libwww-perl находится на компакт-диске, прилагаемом к данной книге.

Установив модуль LWP::Simple, вы сможете "вытянуть" Web-страницу следующим образом:

Теперь переменная $content содержит текст Web-страницы, находящейся по указанному URL. Просто, не правда ли?

Программа "вытягивания" заголовков сервера Slashdot и их последующего отображения приведена в листингах 24.1—24.3. Чтобы использовать данную программу, нужно запустить ее непосредственно из командной строки или из анализируемой сервером Web-страницы.

Проведем анализ программы.

  • Строки 3—6. Для написания этой программы понадобится несколько дополнительных модулей. Следует использовать модуль Fcntl, поскольку нужно, чтобы программу одновременно мог запускать только один пользователь. Вам понадобится также модуль LWP:: Simple, точнее его функция get, чтобы "вытянуть" заголовки из Web-сервера Slashdot. И, онечно, вам необходим модуль CGI, поскольку вы собираетесь создать CGI-программу.
  • Строка 8. Здесь указывается URL файла, в котором находятся заголовки. Формат этого файла выглядит примерно так:
     
  • Каждый элемент заключен между дескрипторами <story>. Для написания этого файла использован более современный вариант языка разметки под названием XML. Как вы увидите позже, это позволяет значительно упростить его обработку Perl-программой.
  • Строка 9. Переменная $cache содержит имя файла, в котором ъы собираетесь временно хранить заголовки сервера Slashdot. Благодаря этому файлу каждый раз при вызове программы вам не нужно опрашивать сервер Slash-dot, чтобы получить информацию, поскольку у вас есть ее локальная копия.
  • Строки 11-18. Подпрограммы get_lock() и ге1еаве_1оск() должны быть вам хорошо знакомы, так как вы уже встречались с ними на трех занятиях. Эти подпрограммы нужны вам, потому что файл, имя которого хранит переменная $cache, может обновляться не более чем одной программой одновременно, и, следовательно, его нужно заблокировать.
     
  • Строка 23. Определяет следующее: если файл в кэш-памяти отсутствует или если ее содержимое хранится уже более 60 минут, то следует обновить информацию. Функция -М в Perl возвращает время модификации файла с момента запуска Perl-программы. Это время выражается в дробных долях дня. Так, если файлу один день, то функция -м возвращает значение 1; если файлу 6 часов, то -М возвращает значение 0.25 (четверть дня); если файлу всего один час, то -м возвращает значение 0.0416666 (приблизительно 1/24).
  • Строка 24. С помощью функции get модуля LWP::Simple осуществляется выборка заголовков по заданному URL, как было описано выше. В следующих нескольких строках извлеченный документ, который хранится в переменной $doc, записывается в кэш-файл. Если выполнение функции get завершилось неудачей, она возвращает значение undef, которое проверяется в строке 25.

Обратите внимание, что вызовы функций get lock() и release_lock() находятся вне "сферы влияния" оператора if. Этот момент очень важен. Если один экземпляр CGl-программы обновляет кэш-файл, то вам совсем не нужно, чтобы другая программа одновременно проверяла, существует ли кэш-файл и когда он модифицировался последний раз.

Последняя часть этой программы — самая простая.

  • Строки33—35. Здесь отображается вводная информация и время последнего обновления кэш-файла.
  • Строка 34. Здесь содержится некий хитроумный прием, позвольте мне его объяснить. Сначала функция stat получает информацию о файле, имя которого хранится в переменной $cache, и возвращает ее в виде списка. Далее извлекается 9-й элемент (время последней модификации) этого списка. И, наконец, для этого времени вызывается функция localtime, которая в скалярном контексте возвращает хорошо отформатированную строку.
  • Строки 40—43. Извлекаются разделы <title> и <url> файла заголовков сервера Slashdot. После анализа регулярного выражения соответствующие части заглавия и U RL сохраняются в переменной , а затем присваиваются переменным Stitle и $link соответственно.
  • Строка 45. Поскольку элемент <url> всегда идет после элемента <title>, то при обработке элемента <url> значение обеих переменных $ title и $link уже может быть выведено в выходной поток.

В общем случае эти регулярные выражения не следует использовать для обработки HTML-файлов. Они используются здесь, потому что XML-файл заголовков сервера Slashdot тщательно отформатирован так, что в каждой строке содержится ровно один XML-элемент. Если вам покажется, что формат этого файла изменился и эта программа не может обработать его, то следует обратиться к списку часто задаваемых вопросов сервера Slashdot, чтобы узнать, что случилось.

После того как вы запустите эту программу, результат (т.е. ее выходные данные) будет выглядеть примерно так, как на рис. 24.2.

Разумеется, вам придется приложить все свое искусство форматирования HTML-документа, чтобы придать этим данным более привлекательный вид.