0

さて、私はこのスクリプトを実行します。これは、私が持っているWebサイトのスクリーンショットを作成するために作成されています。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パッケージからコンストラクターを呼び出す必要があります-あるいは、閉じたファイルハンドルOUTPUTのprint()も多くの答えを提供しますこれは、autodieを使用せず、openの戻り値もチェックしなかったことを示しています。何よりも、デバッグして、エラーが発生する場所を確認する必要があります[/ QUOTE]

しかし、いくつかの熟考の後で、すべてのテスト事項を詳しく調べる価値があると思います-、ファイルを使用する前にファイルが開いていることを確認するために常にテストするというアイデアについてどう思いますか?3つを使用する習慣

arg open():

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

ええと-私は、を使用せずにこれを回避できる、または回避する必要があると思いdie()ますが、作成できなかったファイルを通知するための何らかの方法を手動で用意する必要があります。私たちの場合、それらすべてのように見えます....上に示されています...

適切なファイル名を選択する際の更新は、画像を保存するためのファイル名が必要であることを意味します。注:すべての画像をローカルに保存したいのです。しかし、URLの膨大なリストがある場合は、出力ファイルの膨大なリストを取得します。したがって、私は良いファイル名を持っている必要があります。それらのことやニーズをプログラムに反映させることはできますか?

最新のアップデート; mechanizeにエラーがあるようです....そうだと思います!!!

4

1 に答える 1

2

バイナリ データ (jpg ファイル) を出力したいのですが、明示的に設定する必要があります。次に、ファイルハンドラーが不要になった場合はファイルハンドラーを閉じ、開いたときに「または死ぬ」。3 番目に適切なファイル名を選択します。

よろしく、

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);
}
于 2012-03-27T06:57:00.360 に答える