Судя по отзывам на статьи, посвященные кодингу, эта тема пользуется не очень большой популярностью среди читателей "Х". Возможно, потому что большинство жаждет легкой славы, возможно, сказывается недостаток базовых знаний, а может быть, хороших статей по этой теме не так уж много. Моя статья ни в коей мере не претендует на это гордое звание, так как то, о чем я пишу, сложно назвать кодингом. Это просто автоматизация выполнения часто встречающихся действий, и время создания программы лишь несколько превышает время необходимое на то, чтобы набрать ее исходный код. Несмотря на это, она может чему-то научить, или по крайней мере показать, что в этой самой автоматизации нет ничего запредельного. Итак, передо мной стояла задача скачать с сайта www.xakep.ru статьи, для того чтобы потом иметь возможность просматривать их в оффлайне. Дело затрудняется тем, что ссылок на большинство статей на сайте нет, а если и есть, то доступ к ним не так прост. Выручает то, что все статьи расположены по ссылкам вида
http://www.xakep.ru/post/XXXXX/default.asp?flash=1, где XXXXX - пятизначное число, указывающее на номер статьи. Используемый язык программирования - Perl. Платформа - Win. Скачать Perl для этой платформы можно по адресу:
http://www.activestate.com/activeperl. Неплохая документация доступна по адресу:
http://cgiworld.al.ru/library.htm.

Итак, вот текст программы:

#С подобной строки должна начинаться любая Перл - программа. Это путь к
интерпретатору.
#!/usr/bin/perl

#Подключаем библиотеку для работы с сокетами.
use IO:Socket;

#В options.ini хранится номер последней скачанной статьи.
#Эти три строки открывают текстовый файл, и считывают его в массив @lines1
open (TXTFILE, "options.ini");
@lines1 = <TXTFILE>;
close(TXTFILE);

#Переменной $last_checked_num присваиваем первую строку файла
$last_checked_num = lines1 [0];
#Инкрементируем эту переменную. (увеличиваем значение на 1)
$last_checked_num ++ ;

#Инициализируем переменные
$host = "www.xakep.ru";
$port = 80;

#Метка в Перл вводится именно так (label - имя метки. В данном случае label не является зарезервированной инструкцией языка, и используется как идентификатор.)
label: ;

#Конструируем путь к статье. (Точка предназначена для конкатенации [строкового сложения].)
$path_to_info = "http://www.xakep.ru/post/"&$last_checked_num&"/default.asp?flash=1";

#Пытаемся открыть сокет. Если не получится, то выполнится команда после or. В данном случае я останавливаю работу программы, с выдачей сообщения об ошибке.
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP") or die "Не могу подключиться к серверу.\n";

#Конструируем HTTP запрос:

$url = "GET " . $path_to_info;
$buffer = " HTTP/1.0\r\n";
$end = "\r\n\r\n";
$url = $url . $buffer . $end;

#Отправляем запрос.
print $socket "$url";

#Получаем ответ в массив @lines
@lines = <$socket>;
#Выводим сообщение об успехе.
print "Попытка удалась\n";

#Открываем html файл в режиме перезаписи. Его имя - номер статьи.
open (TXTFILE, "$last_checked_num.htm");

#Этот флаг используется для того, чтобы определить, следует ли записывать строку из массива @lines в файл. #Дело в том, что помимо необходимых нам HTML инструкций, в нем будет еще служебная информация (заголовок).
#В файл будет записано все, что идет после <html>

$flag=0;

#Для каждой строчки массива выполнять:
#Внутри тела инструкции foreach обращение к текущей строке происходит через переменную $line

foreach $line (@lines) 
{

#если флаг не 0, то продолжаем, если ноль, то переходим к инструкциям после else
if ($flag != 0)
{
#Если текущая строка не пустая, то записываем ее в файл
if ($line ne "\n") {print TXTFILE $line;}
}
#Иначе если встретили <html>, то устанавливаем флаг в 1.
else {if ($line =~ /<html>.*/){$flag=1;print TXTFILE "<html>";}}
};

#Закрываем файл
close TXTFILE;

#Записываем в options.ini номер статьи, которая была сохранена в файл.
@lines1[0] = $last_checked_num;
$filename = ">options.ini";
open (TXTFILE, $filename);
print TXTFILE @lines1;
close(TXTFILE);

#Переходим к следующей статье.
$last_checked_num ++ ;

#Круг замкнулся. 🙂
goto label;

Хочу обратить твое внимание на то, что в случае если соединение прервется в момент получения текста статьи, то в файле options.ini может быть установлено некорректное значение. Просто посмотри номер последней нормально
скачавшейся статьи и запиши его в options.ini . Удачного тебе программирования
:).

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

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