Загрузка ссылок с LinuxToday и оглавления выпуска Linux Gazette с помощью Python (и Perl)
Автор: © Mark Nielsen
|
Содержание
ВведениеЯ хотел добавить ссылки с Linux Today на мой вэбсайт GNUJobs.com просто так, для забавы. Позже я хочу добавить заголовки с других вэбсайтов и, может быть, последний выпуск LG. У меня был выбор - что ипользовать: Python или Perl. Я остановился на Python, потому что я долгое время использовал этот язык в математических проектах, и он доказал свою полезность. Теперь я хочу сделать для себя привычкой использование Python. Для меня становится легче программировать на Python, чем на Perl. В будущем, я также собираюсь использовать разбиение процесса на потоки (threads) для одновременного скачивания большого количества вэбстраниц одновременно, что Python делает очень хорошо. К тому же, я использую Python сейчас, так как знаю, что буду использовать его и потом.И Perl, и Python позволят Вам загрузить вэбстранички из интернета. Вы можете также делать многое другое, нежели просто скачивать страницы. В вашем распоряжении инструменты для работы с ftp, gopher и другими сервисами. Загрузка вэб-страницы - всего лишь пример того, что можно сделать с помощью этих языков. В данном случае от языка программирования требует следующее:
Эта статья обещает быть не слишком длинной. Описываемый Python-код подробно откомментирован. Python-скриптЕсли Вы хотите включить вывод этого скрипта непосредственно в вэбстраницу, тогда Вы можете использовать модуль Server-Side Include (SSI) сервера Apache, и в Вашей вэбстранице использовать команду типа:<!--#include virtual="/lthead.html" -->С помощью различных языков программирования (таких как PHP, Perl ASP, Perl Mason и т.д.) также можно включать файлы в вэбстраницу. Подразумевается, что Вы используете операционную систему GNU/Linux. Я, также, использую Python версии 1.5.2, которая не является самой последней. Чтобы сделать скрипт исполняемым, Вам придется выполнить команду chmod 755 LinuxToday.py (Файл http://linuxtoday.com/backend/lthead.txt состоит из трехстрочных записей разделенных двойным амперсандом. Первая строка в записи - заголовок, вторая - линк, третья - дата. прим. пер.) [Текстовая версия этого листинга.] #!/usr/bin/python # Одна очевидная вещь, которую нужно сделать - применить проверку для скачиваемого url, # скачанная информация должна содержать по крайней мере одно вхождение, # и у нас должна быть возможность создать новый файл. # Это будет сделано позже. ### импортировать модули web, string, re, os import urllib, string, re, os ### Определить название для нового HTML файла, который мы создаем, и где взять информацию Download_Location = "/tmp/lthead.html" Url = "http://linuxtoday.com/backend/lthead.txt" #----------------------------------------------------------- ### Создать web объект с Url LinuxToday = urllib.urlopen( Url ) ### Собрать всю информацию в массив (если много, замените на считывание по одной строке) Text_Array = LinuxToday.readlines() New_File = open(Download_Location + "_new", 'w'); New_File.write("<ul>\n") ### Установить значение по умолчанию недействительным Valid = 0 ### Записать число допустимых вхождений Entry_No = 0; Entry_Valid = 0 ### Установить значения по умолчанию Date = "" Link = "" Header = "" Count = 0 ### Создать шаблон соответствия выражению Match = re.compile ("^\&\&") ### Добавить && , чтобы удостовериться, что мы анализируем последнее вхождение Text_Array.append('&&') ### Для каждой строки сделать for Line in Text_Array : ### Если есть &&, начать опять с пустых значений, добавить посл. вхождение if Match.search(Line) : ### Если текущее вхождение допустимо и не является первым if (Entry_No > 1) and (Entry_Valid > 0) : ### Одна вещь, которую Perl делает лучше Python'а - выполнение команды print. ### Мне не нравится как "печатает" Python (никакой интерполяции переменных). New_File.write('<li> <a href="' + Link + '">' + Header + '</a>. ' + Date + "</li>\n") ## "Опустошить" значения переменных. Header = ""; Link = ""; Date = ""; Entry_Valid = 0 Count = 0 ### Стереть пробелы в конце строки Line = string.rstrip(Line) ### Если счетчик равен 1 то заголовок, 2 - линк, 3 - дата if Count == 1: Header = Line elif Count == 2: Link = Line elif Count == 3: Date = Line ### Если все поля заполнены, мы имеем допустимое вхождение if (Header != "") or (Link != "") or (Date != "") : Entry_No = Entry_No + 1 Entry_Valid = 1 ### Добавить 1 к Count Count = Count + 1 New_File.write("</ul>\n") New_File.close() ### Если у нас допустимые вхождения переместим файл в реальное место расположения if Entry_No > 0 : ### Мы могли бы сделать просто: ### os.rename(Download_Location + "_new", Download_Location) ### Но здесь показано как сделать то же с помощью внешней команды. Command = "mv " + Download_Location + "_new " + Download_Location os.system( Command ) Cron скрипт для еженочного запуска программыНе самый лучший crontab файл, но работать будет.#/bin/sh ### Crontab file ### Назвать файл "Crontab" и запускать его командой "crontab Crontab" ### Загружать каждые 2 часа */2 * * * * /www/Cron/LinuxToday.py >> /www/Cron/out 2>&1 Мой Perl-скрипт для скачивания оглавленияLinux GazetteТолько для того, чтобы вы могли сравнить Python с языком Perl, я создал Perl-скрипт, который скачивает оглавление LG самой последней редакции. [Текстовая версия этого листинга.]#!/usr/bin/perl # Copyright Mark Nielsen January 20001 # Copyrighted under the GPL license. # Я горжусь этим скриптом. # Я написал его из ничего и при тестировании обнаружил только 2 незначительные ошибки. system ("lynx --source http://www.linuxgazette.com/ftpfiles.txt > /tmp/List.txt"); ### Открыть вэбстраницу которую мы загрузили и поместить в массив. open(FILE,'/tmp/List.txt'); my @Lines = <FILE>; close FILE; ### Отфильтровать строки, которые не содержат "волшебных" символов. my @Lines = grep(($_ =~ /lg\-issue/) || ($_ =~ /\.tar\.gz/), @Lines ); my @Numbers = (); foreach my $Line (@Lines) { ## Отбросить ненужное слева my ($Junk,$Good) = split(/lg\-issue/,$Line,2); ## Отбросить ненужное справа ($Good,$Junk) = split(/\.tar\.gz/,$Good,2); ## Если это число большее единицы, сохранить его if ($Good > 0) {push (@Numbers,$Good);} } ### Отсортировать числа начиная с большего @Numbers = sort {$a<=>$b} @Numbers; my $Highest = pop @Numbers; ## Создать url, который мы собираемся скачать my $Url = "http://www.linuxgazette.com/issue$Highest/index.html"; ## Скачать его system ("lynx --source $Url > /tmp/LG_index.html"); ### Открыть индекс. open(FILE,"/tmp/LG_index.html"); my @Lines = <FILE>; close FILE; ### Выделить части между началом и концом оглавления. my @TOC = (); my $Count = 0; my $Start = '<!-- *** BEGIN toc *** -->'; my $End = '<!-- *** END toc *** -->'; foreach my $Line (@Lines) { if ($Line =~ /\Q$End\E/) {$Count = 2;} if ($Count == 1) {push(@TOC, $Line);} if ($Line =~ /\Q$Start\E/) {$Count = 1;} } ### Переделать все линки, чтобы они показывали на Linux Gazette my $Relink = "http://www.linuxgazette.com/issue$Highest/"; grep($_ =~ s/HREF\=\"/HREF\=\"$Relink/g, @TOC); ### Сохранить вывод open(FILE,">/tmp/TOC.html"); print FILE @TOC; close FILE; ### Все! Мой Perl скрипт для скачивания еженедельных новостей DebianЯ люблю следить за еженедельными новостями Debian, так что я написал и этот скрипт. Одно плохо в программировании, когда ты по-настоящему хорошо программируешь на одном языке, трудно переключиться на другой язык программирования. Эти два скрипта на Perl я написал, не заглядывая ни в какой другой код. Python код отнял у меня время, потому что я еще не привык к этому языку. [Text version of this listing.]#!/usr/bin/perl # Copyright Mark Nielsen January 2001 # Copyright under the GPL license. system ("lynx --source http://www.debian.org/News/weekly/index.html > /tmp/List2.txt"); ### скачанную вэбстраницу поместить в массив. open(FILE,'/tmp/List2.txt'); my @Lines = <FILE>; close FILE; ### Выделить части между началом и концом TOC. my @TOC = (); my $Count = 0; my $Start = 'Recent issues of Debian Weekly News'; my $End = '</p>'; foreach my $Line (@Lines) { if (($Line =~ /\Q$End\E/i) && ($Count > 0)) {$Count = 2;} if ($Count == 1) {push(@TOC, $Line);} if ($Line =~ /^\Q$Start\E/i) {$Count = 1;} } ### Переделать все линки, чтобы они показывали на DWN my $Relink = "http://www.debian.org/News/weekly/"; grep($_ =~ s/HREF\=\"/HREF\=\"$Relink/ig, @TOC); grep($_ =~ s/\"\>/\" target=_external\>/ig, @TOC); ### Сохранить вывод open(FILE,">/tmp/D.html"); print FILE @TOC; close FILE; ### Все! ЗаключениеФактически, скрипт на Python'е является гораздо более полным решением, чем необходимо. Причиной того, почему я сделал его более длинным является то, что я ввел различные модули и сделал его более гибким на случай, если формат LinuxToday когда-нибудь изменится. Единственное, чего не хватают скрипту, так это обнаружение ошибок при невозможности скачать страницу, открыть новый файл или переименовать его. Обратите внимание также на модули обработки регулярных выражений в Python, так как они были изменены в последних версиях для увеличения эффективности и поддержки Unicode.Python как язык программирования - рулез. Я нашел очень легкими в использовании модули Python. Похоже на то, что Python модуль для обработки вэбстраниц легче в использовании, чем модуль LWP в Perl. Так как Python - язык с большими возможностями, у меня есть план создания программы, которая будет скачивать одновременно множество вэбстраниц, используя способность многопоточности Python'а. Ссылки
|
Copyright © 2001, Mark Nielsen. Copying license http://www.linuxgazette.com/copying.html Published in Issue 63 of Linux Gazette, Mid-February (EXTRA) 2001 |
Вернуться на главную страницу |