• Партнер

  • Привет! Итак, я вижу, ты
    решил основательно взяться за свою
    страничку. Сегодня я помогу тебе сделать её
    более продвинутой. Ты, наверное, часто
    встречал разделы новостей на крутых сайтах,
    и всегда мечтал, чтобы на твоём сайте был
    такой же. Да-да, я понимаю, что тебе не
    хватает времени в IRC посидеть, а тут
    придется искать эти чёртовы новости. Хорошо
    бы было, если б их для тебя искал кто-нибудь (или
    что-нибудь) другой. И сейчас я расскажу тебе
    о небольшом скрипте, который будет “выуживать”
    эти самые новости из крутых сайтов. Дело,
    конечно, нехорошее - тырить чужие новости,
    но я думаю, они не обидятся =) Писать будем на
    Perl. Все, что требуется от тебя это найти
    подходящий сайт с новостями, просмотреть
    его source и между какими тегам находятся
    новости. Далее ты меняешь пару строк в
    скрипте и всё! Теперь вместо того, чтобы
    тратить драгоценное время инета на поиски
    новостей, тебе нужно будет всего лишь
    обновить базу данных! В общем, лови сам
    скрипт (мои комментарии будут следовать за #):

    #!/perl/bin/perl #Путь к Perl,
    желательно правильный =)
    #Далее подключаем необходимые нам модули
    use LWP::Simple; #Этот модуль
    поможет нам скачать страничку с новостями
    use CGI qw(param); #Модуль для
    извлечения передаваемых ключей
    print "Content-type: text/html\n\n";
    $action = param("action"); #Извлекаем значения
    ключа action
    if ($action eq "refresh") { #Значение равно refresh (обновить)
    ?
    $content = get("http://www.somedomain.ru/newspage.html"); #Скачиваем
    # страничку newspage.html и
    записываем её source в переменную и всё
    # это не без помощи
    модуля LWP :)))
    @first = split("\n",$content); #Разбиваем source
    странички по символу перевода
    # строки и записываем их
    в массив @first

    for($i = 0;$i <= $#first+1;$i++) { #Цикл для “прохода” по
    всему массиву.
    # $#имя это количество элементов в массиве “имя”
    на 1 меньше
    if ($flag == 0) { #Переменная
    flag равна 1, если мы уже дошли до нужного тега
    if ($first[$i] = ~/ начальный
    тег /) {
    delete $first[$i]; #Удаляем элемент массива (точнее
    делаем его пустой строкой)

    $flag = 1
    } else {delete $first[$i]} } elsif ($flag == 1) {

    if ($first[$i] = ~/ конечный тег /) {

    delete $first[$i];
    $#first = --$i; #Сократить длину массива, т.е.
    удалить все следующие элементы
    last; #Выходим из цикла
    }}}
    foreach $item(@first) {if ($item) {push(@second, $item)}} #Все
    элементы которые
    # не являются пустыми
    строками заносим в массив @second (они, кстати,
    и
    # есть нужные нам
    новости)

    foreach $item(@second) {$item = "\n";} #Каждому
    элементу добавляем “\n”

    open(FILE,">file.dat"); #Открываем файл в
    режиме перезаписи
    print FILE @second; #Записываем
    в него весь массив. Он запишется
    # в столбик, т.к. мы
    прибавили каждому элементу символ перевода
    строки.

    close(File);
    } elsif ($action eq "") { #Если значение ключа
    пустое или не указано, т.е. нам
    # нужно, чтобы скрипт
    просто вывел все новости на экран.
    open(FILE,"file.dat"); #Открываем файл в режиме
    чтения
    while (<FILE>) { #Читаем по
    одной строке
    print $_ #Выводим на экран
    }
    close(FILE)
    }

    Ну, вот и всё. Не забудь
    вставить в поиск по шаблону настоящие
    добытые тобой теги (или просто строки).
    Когда будешь их вставлять, не забудь
    проверить на содержание специальных
    символов. Например, если в строке будет
    символ “/”, то перед ним нужно будет
    поставить “\”, тем самым ты говоришь, что
    следующий символ – обыкновенный (тег </td>
    станет <\/td>) Если в этой строке будут
    содержаться числа, которые могут со
    временем измениться, то вместо них лучше
    написать “\d+”. Ну, в общем, пораскинь
    мозгами =)

    Отдельный случай для тех,
    у кого есть шелл с возможностью запуска
    программ в background процессе. Тогда ты можешь
    написать небольшой скрипт-демон, который
    будет раз в сутки, например, вызывать наш
    скрипт с параметром refresh. И тогда тебе
    вообще не нужно будет заботиться о новостях,
    обо всём позаботится Perl :)))

    Теперь, когда скрипт
    готов, тебе только осталось
    подредактировать свой html. В том месте, где
    ты хотел бы видеть свои новости, тебе нужно
    вызвать наш скрипт с помощью директивы <!--#exec
    cgi="/путь/название.cgi"-->. Также, если ты
    собираешься сам обновлять базу данных,
    можно нарисовать маленькую картинку под
    цвет фона (примерно 7 на 7 мм) и где-нибудь
    внизу вставь такой тег: <a href=”/путь/название_скрипта.cgi?action=refresh”><img
    src=”/путь_к_картинке/название_картинки” border=”0”></a>

    Теперь при нажатии на неё
    ты обновишь базу данных. Почему не сделать
    нормальную ссылку рядом с новостями? Потому
    что обязательно найдётся чел, который
    захочет пощёлкать по этой ссылке, а это
    будет сильно тормозить загрузку остальных
    посетителей.

    Если возникнут вопросы,
    то пиши на fork@e-mail.ru.
    Удачи, Fork….

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии