WWW::Mechanize::Firefox работает хорошо: некоторые попытки сделать скрипт немного более устойчивым
Друзья
У меня есть хороший скрипт, который работает как скребок для изображений. Для первых испытаний и испытаний все идет хорошо.
Вот список URL-адресов, которые я использую в файле urls.txt, который я запускаю со сценарием. Обратите внимание, что это только короткий список. Мне нужно работать с 2500 URL-адресами, поэтому было бы неплохо, если бы скрипт был немного более надежным и продолжал работать, если некоторые URL-адреса недоступны или занимают слишком много времени. Я думаю, что скрипт сталкивается с некоторыми проблемами, если некоторые URL-адреса недоступны или занимают слишком много времени или блокируют mozrepl, а WWW:Mechanize::Firefox занимает слишком много времени.
Вы думаете, что мои идеи и предложения, вероятно, являются причиной проблемы или нет? Если так, как мы можем улучшить сценарий и сделать его сильнее, мощнее и надежнее, чтобы он не останавливался слишком рано.
Рад тебя слышать.
Привет.
http://www.bez-zofingen.ch
http://www.schulesins.ch
http://www.schulen-turgi.ch/pages/bezirksschule/startseite.php
http://www.schinznach-dorf.ch
http://www.schule-seengen.ch
http://www.gilgenberg.ch/schule/bez/2005-06/
http://www.rheinfelden-schulen.ch/bezirksschule/
http://www.bezmuri.ch
http://www.moehlin.ch/schulen/
http://www.schule-mewo.ch
http://www.bez-frick.ch
http://www.bezendingen.ch
http://www.bezbrugg.ch
http://www.schule-bremgarten.ch/content/view/20/37/
http://www.bez-balsthal.ch
http://www.schule-baden.ch
http://bezaarau.educanet2.ch/info/.ws_gen/index.htm
http://www.benedict-basel.ch
http://www.institut-beatenberg.ch/
http://www.schulewilchingen.ch
http://www.ksuo.ch
http://www.international-school.ch
http://www.vsgtaegerwilen.ch/
http://www.vgk.ch/
http://www.vstb.ch
Но я думаю, что я был бы очень счастлив, если бы он был более надежным, чем сейчас.
Конечно, он управляет настоящим браузером, как с WWW::Mechanize::Firefox
Так что где-то это может быть несколько нестабильно, возможно, больше, чем любое другое решение для очистки экрана. Я получаю некоторые ошибки, подобные следующим... (см. Ниже)
Обратите внимание, что я также поближе посмотрел на страницы отладки в Firefox Troubleshooting с ее советами, хитростями и обходными путями, касающимися различных ошибок, проблем и тому подобного.
#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize::Firefox;
my $mech = new WWW::Mechanize::Firefox();
open my $URLs, '<', 'URLs.txt' or die $!;
while (<$URLs>) {
chomp;
next unless /^http/I;
print "$_\n";
$mech->get($_);
my $png = $mech->content_as_png;
my $name = $_;
$name =~ s#^http://##I;
$name =~ s#/##g;
$name =~ s/\s+\z//;
$name =~ s/\A\s+//;
$name =~ s/^www\.//;
$name .= ".png";
open(my $out, '>', "/home/martin/images/$name") or die $!;
binmode $out;
print $out $png;
close $out;
sleep 5;
}
Смотрите результаты, а также ошибки, где это останавливается.
martin@linux-wyee:~/perl> perl test_10.pl
http://www.bez-zofingen.ch
Datei oder Verzeichnis nicht gefunden at test_10.pl line 24, <$URLs> line 3.
martin@linux-wyee:~/perl> perl test_10.pl
http://www.bez-zofingen.ch
http://www.schulesins.ch
http://www.schulen-turgi.ch/pages/bezirksschule/startseite.php
http://www.schinznach-dorf.ch
http://www.schule-seengen.ch
http://www.gilgenberg.ch/schule/bez/2005-06/
http://www.rheinfelden-schulen.ch/bezirksschule/
Not Found at test_10.pl line 15
martin@linux-wyee:~/perl>
Что ты предлагаешь? Как мы можем сделать скрипт немного более устойчивым? Как сделать так, чтобы он не остановился так рано?
2 ответа
Оберните все методы / системные вызовы, которые могут быть неправильными в обработчике исключений(См. Главу 13 из Perl Best Practices для обсуждения этой темы.) Установите явные тайм-ауты для Mozrepl.
При появлении ошибки зарегистрируйте ее и перейдите к следующему URL-адресу. По завершении прогона проверьте файл журнала и повторите прогон с теми URL-адресами, которые не могли быть обработаны ранее. Сортировка URL-адресов для страниц, которые постоянно отключены. Наконец, может быть оставлено несколько страниц, которые по какой-то причине нельзя скриншотить через Mozrepl. Обработайте их вручную.
Вы должны всегда проверять, является ли ваш ответ успешным или нет. Ваш исправленный код:
use strict;
use warnings;
use WWW::Mechanize::Firefox;
my $mech = new WWW::Mechanize::Firefox();
open my $URLs, '<', 'URLs.txt' or die $!;
while (<$URLs>) {
chomp;
next unless /^http/I;
print "$_\n";
my $res = $mech->get($_);
if(!$res->is_success()){
next; # or continue;
}
my $png = $mech->content_as_png;
my $name = $_;
$name =~ s#^http://##I;
$name =~ s#/##g;
$name =~ s/\s+\z//;
$name =~ s/\A\s+//;
$name =~ s/^www\.//;
$name .= ".png";
open(my $out, '>', "/home/martin/images/$name") or die $!;
binmode $out;
print $out $png;
close $out;
sleep 5;
}
`