Судя по отзывам на статьи, посвященные кодингу, эта тема пользуется не очень большой популярностью среди читателей "Х". Возможно, потому что большинство жаждет легкой славы, возможно, сказывается недостаток базовых знаний, а может быть, хороших статей по этой теме не так уж много. Моя статья ни в коей мере не претендует на это гордое звание, так как то, о чем я пишу, сложно назвать кодингом. Это просто автоматизация выполнения часто встречающихся действий, и время создания программы лишь несколько превышает время необходимое на то, чтобы набрать ее исходный код. Несмотря на это, она может чему-то научить, или по крайней мере показать, что в этой самой автоматизации нет ничего запредельного. Итак, передо мной стояла задача скачать с сайта 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 . Удачного тебе программирования
:).