0

友達

画像スクレーパーとして機能する素敵なスクリプトがあります。最初の試行とテストでは、すべてうまくいきます。

これは、スクリプトに対して実行している urls.txt で使用する URL のリストです。これは短いリストに過ぎないことに注意してください。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 のトラブルシューティングのデバッグページを詳しく調べて、 さまざまなバグ、トラブルなどに関するヒントやトリック、回避策を調べました。

  #!/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> 

何を指示してるんですか?スクリプトをもう少し堅牢にするにはどうすればよいでしょうか? 早く止まらないようにする方法は?

4

2 に答える 2

3

例外ハンドラで失敗する可能性のあるすべてのメソッド/システムコールをラップします。(このトピックの説明については、 Perlのベストプラクティスの第13章を参照してください。)Mozreplの明示的なタイムアウトを設定します。

エラーが発生した場合は、ログに記録して、次のURLにスキップしてください。実行が完了したら、ログファイルを調べて、以前は処理できなかったURLを使用して実行を繰り返します。完全にダウンしているページのURLを整理します。最後に、何らかの理由でMozreplでスクリーンショットを撮ることができないページがいくつか残っている可能性があります。それらを手動で処理します。

于 2012-04-01T14:24:22.943 に答える
0

応答が成功したかどうかを常に確認する必要があります。あなたの修正されたコード:

    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;
      }

`

于 2017-06-29T13:32:21.130 に答える