3

問題: 2500 の Web サイトのリストがあり、それらのサムネイル スクリーンショットを取得する必要があります。それ、どうやったら出来るの?Perl を使用してサイトを解析することもできます。Mechanize を使用するとよいでしょう。注: 長辺が最大 240 ピクセルのサムネイルとしてのみ結果が必要です。現時点では、遅くてサムネイルを返さない解決策があります。オーバーヘッドを減らしてスクリプトを高速に実行する方法 - サムネイルを吐き出す

前提条件: addon/mozrepl/ モジュール WWW::Mechanize::Firefox; モジュールイメージャ

最初のアプローチ:最初の Perl ソリューションは次のとおりです。

 use WWW::Mechanize::Firefox;
 my $mech = WWW::Mechanize::Firefox->new();
 $mech->get('http://google.com');
 my $png = $mech->content_as_png();

アウトライン:指定されたタブまたは PNG 画像としてレンダリングされた現在のページを返します。すべてのパラメーターはオプションです。$tab のデフォルトは現在のタブです。座標が指定されている場合、その長方形が切り取られます。座標は、左、上、幅、高さの 4 つの通常のエントリを持つハッシュにする必要があります。これは WWW::Mechanize::Firefox に固有のものです。

perldoc からわかるように、座標を使用したオプションは、ページ全体のサイズ変更ではなく、単に長方形を切り取ったものです....まあ、WWW::Mechanize::Firefox がスクリーンショットの保存方法を処理します。さて、私は画像を小さなサムネイルとして持つだけでよいことを忘れていました-したがって、非常に大きなファイルを用意する必要はありません...それらのサムネイルのスクリーンショットを取得するだけで済みます。$png を縮小するモジュールを cpan で検索したところ、Imager が見つかりました。

mecha-module は、画像のサイズ変更には関与しません。ここには Imager のような CPAN 上のさまざまな画像モジュールがあります。Imager - 24 ビット イメージを生成するための Perl 拡張機能: Imager は、イメージを作成および変更するためのモジュールです。さまざまな画像形式の読み取りと書き込み、線や多角形などの基本的な形状の描画、さまざまな方法での複数の画像のブレンド、スケーリング、トリミング、テキストのレンダリングなどを行うことができます。モジュールをインストールしましたが、基本的なアプローチを拡張していませんでした

私がすでに試したこと; ここにあります:

#!/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);
}

さて、これはサイズを気にしません:

出力コマンドラインを参照してください。

linux-vi17:/home/martin/perl # perl mecha_test_1.pl
   www.google.com
    www.cnn.com
    www.msnbc.com
command timed-out at /usr/lib/perl5/site_perl/5.12.3/MozRepl/Client.pm line 186
linux-vi17:/home/martin/perl # 

これは私の情報源です... URL リストにあるサイトのスニペット [例] を参照してください。

urls.txt [ソースのリスト]

www.google.com
www.cnn.com
www.msnbc.com
news.bbc.co.uk
www.bing.com
www.yahoo.com

質問:タイムアウトで停止しないようにソリューションを拡張する方法。および-小さなサムネイルのみを保存します注:繰り返しますが、長い寸法で最大240ピクセルのサムネイルとしての結果のみが必要です。前提条件として、私はすでにモジュールイメージャーをインストールしています

少ないオーバーヘッドでスクリプトの実行を高速化する方法 - サムネイルを吐き出す

ご連絡をお待ちしております。挨拶ゼロ

更新:非常に興味深いSchwermsのアイデアに加えて、同じタイムアウトについて話す興味深いMonkthreadを見つけました:

WWW::Mechanize::Firefox で Net::Telnet タイムアウトを指定する方法はありますか? 現在、インターネット接続が非常に遅く、時々エラーが発生します

 $mech->get(): command timed-out at /usr/local/share/perl/5.10.1/MozRepl/Client.pm line 186

おそらく、mozrepl-Timeout-configuration を確認する必要があります!? しかし、結局のところ、これは奇妙で、そのタイムアウトがどこから来たのかわかりません。たぶん、実際には Firefox が何らかの結果を同期的に取得するのに忙しいため、タイムアウトしているのでしょう。トレースでわかるように、WWW::Mechanize::Firefox は Firefox がページをフェッチしたかどうかを確認するために毎秒 (またはそれくらい) ポーリングします。

それが本当に Net::Telnet である場合は、次の手順を実行する必要があります。

$mech->repl->repl->client->{telnet}->timeout($new_timeout);

**更新**なので、質問は次のとおりです。Perl-Coreにある** Net::Telnet:**の使用方法

@ Alexandr Ciornii: ヒントは thx! その後、次のように 使用します: Net::Telnet; でもそれが核心にないなら、私はこのように行くことはできません。@ Daxim: $ corelist Net::Telnet␤␤Net::Telnet は CORE にありませんでした - つまり、上記のように進むことはできません

ところで: Øyvind Skaar が述べたように: その多くの URL では、一部が失敗してそれを処理することを期待する必要があります。たとえば、失敗したものを配列またはハッシュに入れて、X 回再試行します。

4

1 に答える 1

5

Perlで並列処理を行うためのより簡単で信頼性の高い方法の1つであるParallel::ForkManagerを調べてください。ほとんどの作業はネットワークとI/Oバウンドであり、CPUはリモートWebサーバーが戻るのを待っており、大きな成果を上げる可能性があります。

タイムアウトに関しては、それはMozRepl内のどこかにあり、デフォルトは10秒です。タイムアウトの異なるMozRepl::Clientオブジェクトを作成し、それを使用するために何らかの方法でWWW :: Mechanicale :: Firefoxを取得するか、文書化されていないことを行う必要があります。 このperlmonksスレッドは、タイムアウトを変更する方法を示しています。設定できる文書化されていないMOZREPL_TIMEOUT環境変数もあります。

于 2012-02-20T02:29:37.383 に答える