2012-02-21 12 views
1

WWW :: Mechanize :: Firefoxを使用してFirefoxのインスタンスを制御し、レンダリングしたページを$ mech-> content_as_pngでダンプします。Perl :: Mechanizeを使用したWebページのサムネイルのスクリーンショット

新アップデート:最初の投稿の最後に参照してください。user1126070へ おかげで、我々は新しいソリューションを持っている - 私は今、私はオフィスではなく自宅で午前[後で日を試してみたい - 中プログラムとマシンのフロント]

$mech->repl->repl->setup_client({ extra_client_args => { timeout => 5*60 } }); 

私はput links to @list and use evalそのバージョンを試してみると次のようにします。ところで

while (scalar(@list)) { 
     my $link = pop(@list); 
     print "trying $link\n"; 
     eval{ 
     $mech->get($link); 
     sleep (5); 
     my $png = $mech->content_as_png(); 
     my $name = "$_"; 
     $name =~s/^www\.//; 
     $name .= ".png"; 
     open(OUTPUT, ">$name"); 
     print OUTPUT $png;   
     close(OUTPUT); 
     } 
     if ([email protected]){ 
      print "link: $link failed\n"; 
      push(@list,$link);#put the end of the list 
      next; 
     } 
     print "$link is done!\n"; 

} 

user1126070サムネイルサイズに画像をトリミングするとどうなりますか?私はここでイメージャを使うべきですか?あなたはここに何か解決策を提案することができます...!?それは素晴らしいだろう。ここで

更新の

エンド引き続き問題-概要 - このQ &

問題の輪郭の非常に最初に書かれたとおり、私は2500のウェブサイトのリストを持っているそれらのサムネイルのスクリーンショットを取得する必要があります。それ、どうやったら出来るの?私はPerlでサイトを解析しようとする可能性があります.- Mechanizeは良いことです。注:私は、長い次元の最大240ピクセルのサムネイルとして結果を必要とします。現時点では、私は遅く、サムネイルを返さないソリューションを持っています:サムネイルを吹き飛ばして、スクリプトをより速く実行する方法 -

しかし、私はそれを設定することでかなりのしかし、挑戦。 もし期待どおりに動作していれば、このようなスクリプトを使って目的のWebサイトの画像をダンプすることができますが、Firefoxを起動して、希望の幅に手動でサイズ変更してください(高さは関係ありません)。常にページ全体をダンプします)。

私が持っているものこれまでに行われたはたくさんあります - 私はmozreplで作業しています。現時点ではタイムアウトに苦しんでいます:WWW :: Mechanize :: FirefoxでNet :: Telnetタイムアウトを指定する方法はありますか?現時点で 私のインターネット接続が非常に遅く、時々私はエラー

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

THIS ONEを参照して取得:

> $mech->repl->repl->timeout(100000); 

残念ながら、それは動作しません。パッケージを経由してオブジェクトのメソッド「タイムアウト」を見つけることができませんが「MozRepl」 ドキュメントは言う。このすべき:

$mech->repl->repl->setup_client({ extra_client_args => { timeout => 1 +80 } }); 

私が出回っ試してみました何。ここにある:

#!/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 and so on... 

のリスト:我々はいくつかが失敗して、それを処理することを期待する必要があり、多くのURLので。たとえば、失敗したものを配列またはハッシュに入れて、それらをX回再試行します。

UTSLここで、この一つでどれだけ

...

sub content_as_png { 

my ($self, $tab, $rect) = @_; 
$tab ||= $self->tab; 
$rect ||= {}; 

# Mostly taken from 
# http://wiki.github.com/bard/mozrepl/interactor-screenshot-server 
my $screenshot = $self->repl->declare(<<'JS'); 
function (tab,rect) { 
    var browser = tab.linkedBrowser; 
    var browserWindow = Components.classes['@mozilla.org/appshell/window-mediator;1'] 
     .getService(Components.interfaces.nsIWindowMediator) 
     .getMostRecentWindow('navigator:browser'); 
    var win = browser.contentWindow; 
    var body = win.document.body; 
    if(!body) { 
     return; 
    }; 
    var canvas = browserWindow 
      .document 
      .createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); 
    var left = rect.left || 0; 
    var top = rect.top || 0; 
    var width = rect.width || body.clientWidth; 
    var height = rect.height || body.clientHeight; 
    canvas.width = width; 
    canvas.height = height; 
    var ctx = canvas.getContext('2d'); 
    ctx.clearRect(0, 0, width, height); 
    ctx.save(); 
    ctx.scale(1.0, 1.0); 
    ctx.drawWindow(win, left, top, width, height, 'rgb(255,255,255)'); 
    ctx.restore(); 

    //return atob(
    return canvas 
      .toDataURL('image/png', '') 
      .split(',')[1] 
    //); 
} 
JS 
    my $scr = $screenshot->($tab, $rect); 
    return $scr ? decode_base64($scr) : undef 
}; 

愛はあなたから聞いて! 挨拶ゼロ

+1

を@listし、使用する

$mech->repl->repl->setup_client({ extra_client_args => { timeout => 5*60 } }); 

プット・リンクはちょうどFYI、PerlでのWebKitを制御する方法についてはこれらのスライドは、同様に参考になります。http://potyl.github.com/ Talk-WebKit-Perl /と彼のコード(screenshot.pl:https://github.com/potyl/Webkit/blob/master/screenshot.plなど)。それを試していないが、それは非常に興味深いように見えます。 –

+0

人の偉大なヒントの多くのありがとう – zero

答えて

1

あなたはこれを試してみましたか?それは働いている? evalの

while (scalar(@list)) { 
     my $link = pop(@list); 
     print "trying $link\n"; 
     eval{ 
     $mech->get($link); 
     sleep (5); 
     my $png = $mech->content_as_png(); 
     my $name = "$_"; 
     $name =~s/^www\.//; 
     $name .= ".png"; 
     open(OUTPUT, ">$name"); 
     print OUTPUT $png;   
     close(OUTPUT); 
     } 
     if ([email protected]){ 
      print "link: $link failed\n"; 
      push(@list,$link);#put the end of the list 
      next; 
     } 
     print "$link is done!\n"; 

} 
+0

thx user1126070 !!!それは素晴らしいようです。私はあなたのアイデアを**最初の投稿**の**トップ**に入れました。 これを '$ mech-> repl-> repl-> setup_client({extra_client_args => {timeout => 5 * 60}})に設定してください; そして:私は後でその日[今すぐ試してみたい私はオフィスにいて自宅ではない - プログラムのあるマシンの前で] ** BTW **、サムネイルサイズに画像をトリミングするとどうなるの?私はここで**イメージャ**を使用する必要があります。いくつか**アイデアとライン**をここに提案できますか?!?それは素晴らしいだろう。 – zero

+0

これをチェック:http://www.imagemagick.org/script/perl-magick.php – user1126070

+0

こんにちは - 多くの多くのありがとう - 私はそれをチェック!私は戻ってすべての発見を報告する。もう一度 – zero

関連する問題