Анимация
JavaScript


Главная  Библионтека 

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

• Возможно, вам не разрешат создать "глубокую связь" с авторским 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