создание эскизов с помощью WWW::Mechanize::FireFox с использованием Mozrepl — некоторые попытки отладки

хорошо, я запускаю этот скрипт, который написан для того, чтобы сделать несколько скриншотов веб-сайтов, которые у меня также есть, и работает mozrepl

здесь у нас есть файл с некоторыми запрошенными URL-адресами ... обратите внимание, что это всего лишь короткий фрагмент реального списка - реальный список намного длиннее. он содержит более 3500 строк и URL-адресов

http://www.unifr.ch/sfm
http://www.zug.phz.ch
http://www.schwyz.phz.ch
http://www.luzern.phz.ch
http://www.schwyz.phz.ch
http://www.phvs.ch
http://www.phtg.ch
http://www.phsg.ch
http://www.phsh.ch
http://www.phr.ch
http://www.hepfr.ch/
http://www.phbern.ch
http://www.ph-solothurn.ch
http://www.pfh-gr.ch
http://www.ma-shp.luzern.phz.ch
http://www.heilpaedagogik.phbern.ch/

какой странный вывод - см. ниже... вопрос: стоит ли менять скрипт

почему я получаю вывод с помощью следующего небольшого скрипта:

#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s/^www\.//;
        $name .= ".png";
        open(OUTPUT, ">$name");
        print OUTPUT $png;
        sleep (5);
}

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

http://www.unifr.ch/sfm
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 2.
http://www.zug.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 3.
http://www.schwyz.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 4.
http://www.luzern.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 5.
http://www.schwyz.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 6.
http://www.phvs.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 7.
http://www.phtg.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 8.
http://www.phsg.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 9.
http://www.phsh.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 10.
http://www.phr.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 11.
http://www.hepfr.ch/
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 12.
http://www.phbern.ch                                                                                                                                                                  

Некоторые размышления: ну, во-первых, я думаю, что это не очень серьезная ошибка - я думаю, что мне нужно ее отладить, и тогда она будет работать лучше. Во-вторых, я сначала подумал, что скрипт как бы "перегружает машину"? Теперь я не очень уверен в этом: симптомы действительно выглядят странно, но я думаю, что нет необходимости делать вывод о «перегрузке машины».

В-третьих, я думаю об определенных шагах, которые необходимо предпринять, чтобы убедиться, что проблема вообще связана с WWW::Mechanize::Firefox? Это подводит меня к тому, что означает предупреждение Perl, и к идее использовать прагму диагностики, чтобы получить больше объяснений: что вы думаете?

print() on unopened filehandle FH at -e line 1 (#2) (W unopened) An I/O operation was attempted on a filehandle that w +as never initialized. 

во-первых - нам нужно сделать вызов open(), sysopen() или so +cket(), или вызвать конструктор из пакета FileHandle кроме этого - альтернативно, print() на закрытом filehandle OUTPUT также дает много ответов, которые говорят нам, что мы не использовали autodie, а также не проверяли возвращаемое значение open. Прежде всего, я должен отладить его и обязательно найти, где возникает ошибка[/QUOTE]

Но после некоторых размышлений я думаю, что стоит повнимательнее взглянуть на все тестовые вещи - что вы думаете об идее всегда тестировать, чтобы убедиться, что файл открыт перед его использованием. Это означает что мы также должны взять за привычку использовать три

arg open():

open my $fh, '>', $name or die "Can't open file $name : $!";
print $fh $stuff;

ну, я думаю, что мы можем или должны обойти это без использования die(), но нам придется вручную иметь какой-то метод, чтобы сообщить нам, какие файлы не могут быть созданы. В нашем случае это выглядит как все....которые показаны выше...

update при выборе хорошего имени файла вы имеете в виду, что мне нужно иметь имя файла для хранения изображений. Примечание: я хочу сохранить их все локально. Но если у меня есть огромный список URL-адресов, я получаю огромный список выходных файлов. Поэтому мне нужно иметь хорошие имена файлов. Можем ли мы отражать эти вещи и потребности в программе!?

самое последнее обновление; кажется, есть некоторые ошибки с механизацией.... наверное да!!!


person zero    schedule 27.03.2012    source источник


Ответы (1)


Если вы хотите распечатать двоичные данные (файл jpg), вы должны указать это явно. Во-вторых, закройте обработчик файлов, если он вам больше не нужен, и вы «или умрете» при открытии. В-третьих, выберите хорошее имя файла.

С уважением,

http://perldoc.perl.org/functions/binmode.html

#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        next if $_ =~ m/http/i;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s#http://##is;
        $name =~s#/##gis;$name =~s#\s+\z##is;$name =~s#\A\s+##is;
        $name =~s/^www\.//;
        $name .= ".png";
        open(my $out, ">",$name) or die $!;
        binmode($out);
        print $out $png;
        close($out);
        sleep (5);
}
person user1126070    schedule 27.03.2012
comment
Здравствуйте, дорогой пользователь 1126070 - большое спасибо. Я сделаю, как посоветовали. я установлю это явно и закрою обработчик файлов, если он мне больше не нужен, и вы «или умрете» при открытии. Выбирая хорошее имя файла, вы имеете в виду, что мне нужно иметь имя файла для хранения изображений. Примечание: я хочу хранить все изображения локально. Но если у меня есть огромный список URL-адресов, я получаю огромный список выходных файлов. Поэтому мне нужно иметь хорошие имена файлов. Можем ли мы отражать эти вещи и потребности в программе!? с нетерпением ждем услышать . большое спасибо заранее - person zero; 27.03.2012
comment
«Хорошее имя файла», я имею в виду, чтобы очистить их. Удалите '://,/' и другие вещи, которые могут помешать их созданию. Для этого я добавил несколько регулярных выражений. - person user1126070; 27.03.2012
comment
привет user1126070 Большое спасибо за дополнительные подсказки. ты заслуживаешь монстра, поздравляю. Привет - person zero; 27.03.2012
comment
Обновить; кажется, есть некоторые ошибки с механизацией.... я так думаю!!! что ты говоришь!!?? - person zero; 28.03.2012