Анимация
JavaScript
|
Главная Библионтека • Возможно, вам не разрешат создать "глубокую связь" с авторским Web-сервером, т.е. связываться со страницами, которые находятся на несколько уровней глубже главной страницы. Скорее всего, владельцы сервера предпочтут, чтобы вы создали ссылку только на страницу самого верхнего уровня. • Возможно, вам разрешат обновлять "вытягиваемую" с сервера информацию только время от времени. Некрасиво перегружать трафик на чужом сервере только ради того, чтобы улучшить впечатление от своего. Владельцы Web-сервера ot.Org, девиз которых звучит "Новости для технарей", а информация рассчитана на нользователей с техническим образованием, позвонили мне использовать их сервер при написании книги, чтобы на примерах продемонстрировать возможности языка Perl. Поэтому, прежде чем реализовать коды программ из описанных ниже примеров на собственных Web-страницах, вы должны снросить разрешения у их авторов. Подробные сведения о том, как с ними связаться, можно найти на их Web-сервере и в разделе FAQ но адресу http: www.slashdot.org. Примера ивание" заголовков Схема отображения заголовков сервера ot.Org на вашей Web-странице выглядит примерно так. 1 CGI-программа Ипее.cgi запускается через анализируемую сервером Web-страницу. 2 Затем CGI-программа проверяет, самый ли свежий вариант заголовков находится на локальном диске. Если да, то она использует его. В противном случае программа "вытягивает" новые заголовки с Web-сервера SlashdotOrg 3 После этого CGI-программа анализирует файл заголовков и отображает их на своей Web-странице Для "вытягивания" Web-страницы или любого другого содержимого какого-либо Web-сервера вам нужен модуль LWP; ;Sijiple, который не входит в стандартную цоставку Perl. Модуль LWP нозволяет "вытягивать" из Internet все виды информации: Web-страницы, файлы через протокол FTP, статьи из групп новостей и т.д. Модул Simple является составной частью пакета под именем -perl. В этом пакете содержатся модули для "вытягивания" Web-страниц, анализаторы HTML-кода и URL, средства навигации по Web-серверу и многое другое. Эти модули дают вам колоссальные преимущества, так что имеет смысл потратить время на их установку. Пакет libwww-perl находится на компакт-диске, прилагаемом к данной книге. Установив модуле simple, вы сможете "вытянуть" Web-страницу следующим образом: us Simple qw(get); $content=get("http; www.slashdot.org"); Теперь переменная $content содержит текст Web-страницы, находящейся по указанному URL. Просто, не правда ли? Программа "вытягивания" заголовков сервера Slashdot и их последующего отображения приведена в листингах 24.1-24.3. Чтобы использовать данную программу, нужно запустить ее непосредственно из командной строки или из анализируемой сервером Web-страницы. Листинг24.1. Программа "вгтягивания" заголовков сервера Slashdot: часть I 1l: 2: 3: 4: 5: 6: 7: 8: 9: 10: t!/usr/bin/perl шэ strict; иж Fcntl <iw(:flock); иж LWP:: Simple qw (get); иаэ Cnr qw(:all); my $url="http:/7slashdot.org/slashdot.xml"; my $cache="/tmp/slashcache"; my Slockfile=/tmp/slashlock"; 11: sub getjock { 12: open(SEH, ">$lockfile") 13: II dig Овибка цря ссадим сзавфта: $1"; 14: flock(SEM, LOCK EX) [ dig Шйа ipzE sioieemze бтажровки: $ г 15: } 16: sub releasejock { 17: close{SEH); 18: } Проведем анализ программы. Строки 3-6. Для написания этой программы понадобится несколько дополнительных модулей. Следует использовать модуль Fcntl, поскольку нужно, чтобы программу одновременно мог запускать только один пользователь. Вам понадобится также модуль LWP:: Staple, точнее его функция get, чтобы "вытянуть" заголовки из Web-сервера Slashdot. И, конечно, вам необходим модуль CGI, поскольку вы собираетесь создать CGI-программу. Строка 8. Здесь указывается URL файла, в Формат этого файла выглядит примерно так: котором находятся заголовки. <story> <title>Ask SlasMot: Intemet Voting?</title> <url>http: slashdot.org/a8kslashdot/99/09/0S/1732249.shtiiil</url> <tinie1999-09-05 21:34:36</tinie> <author>Cliff</author> Каждый элемент заключен между дескрипторами <story>. Для написания этого файла использован более современный вариант языка разметки под названием XML. Как вы увидите позже, это позволяет значительно упростить его обработку Рег!-программой. Строка 9. Переменная $cache содержит имя файла, в которое собираетесь временно хранить заголовки сервера Slashdot. Благодаря этому файлу каждый раз при вызове программы вам не нужно опрашивать сервер Slash-dot, чтобы получить информацию, поскольку у вас есть ее локальная копия. Строка 18. ПодпрограммоскО должны быть вам хорошо знакомы, так как вы уже встречались с ними на трех занятиях. Эти подпрограммы нужны вам, потому что файл, имя которого хранит переменная $cache, может обновляться не более чем одной программой одновременно, и, следовательно, его нужно заблокировать. 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: нг 24,2.. Программа "вгтягивания" заголовков сервера Slashdot: часть II ♦ EtJM с ма<ЕЕпа саювгвзля кэш-памяти ipairo бсзшю часа, о&енм ее get lock(); if { (irt -е icadE ) or < № $cadhe) > ,04)) { it $doc=get($arl); if {diBd $) { cpai{CF, vScache") die "Оийка запей в кэв: $1"; Effdnt CF clos(); r?Ei€a£Ejock(); • Строка 23. Определяет следующее: если файл в кэш-памяти отсутствует или если ее содержимое хранится уже более 60 минут, то следует обновить информацию. Функция -М в Perl возвращает время модификации файла с момента запуска Perl-программы Это время выражается в дробных долях дня. Так, если файлу один день, то функция -м возвращает значение 1; если файлу 6 часов, то -М возвращает значение 0.25 (четверть дня); если файлу всего один час, то -М возвращает значение 0.0416666 (нриблизительно 1/24). • Строка 24. С помощью функции get модуле imple осуществляется выборка заголовков по заданному как было описано выше. В следующих нескольких строках извлеченный документ, который хранится в переменной $doc, записывается в кэщ-файл. Если вынолнение функции get завершилось неудачей, она возвращает значение undef, которое проверяется в строке 25. Обратите внимание, что вызовы функций и release lock() находятся вне "сферы влияния" оператора if. Этот момент очень важен. Если один экземпляр CGl-профаммы обновляет кэщ-файл, то вам совсем не нужно, чтобы другая программа одновременно проверяла, существует ли кэш-файл и когда он модифицировался последний раз. jммшшjllШ:аголсjBkсBiсерjвераsllShdOiiс 33: 34: 35: 37: 38: 39: 40: pdnt •<H2>Slashdot.Orgs VesSMxtsb as of scaiar(giitinie((stat $сасЬе)[9])), "GMT </B2>!Jpdated HourlyJ<P>"; C5(CT he) [j cie "CliKEKa ijn сокеьпк айпа: !"; my($title, Slink); while(<CF>) { if (in,<title>{.*)</title>,) { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 [ 114 ] 115 116 117 118 119 120 121 122 |