使用Perl::Mechanize的网页缩略图截图

使用Perl::Mechanize的网页缩略图截图,perl,parsing,mechanize,thumbnails,Perl,Parsing,Mechanize,Thumbnails,我使用WWW::Mechanize::Firefox控制一个Firefox实例,并使用$mech->content\u作为\u png转储呈现的页面 新更新:请参见初始发布末尾: 多亏了用户1126070,我们有了一个新的解决方案——我想在今天晚些时候试用(现在我在办公室而不是在家——在有程序的机器前) $mech->repl->repl->setup_client( { extra_client_args => { timeout => 5*60 } } );

我使用WWW::Mechanize::Firefox控制一个Firefox实例,并使用$mech->content\u作为\u png转储呈现的页面

新更新:请参见初始发布末尾: 多亏了用户1126070,我们有了一个新的解决方案——我想在今天晚些时候试用(现在我在办公室而不是在家——在有程序的机器前)

$mech->repl->repl->setup_client( { extra_client_args => { timeout => 5*60 } } );
我试用了
将链接放到@list并使用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 ($@){
          print "link: $link failed\n";
          push(@list,$link);#put the end of the list
          next;
        }
        print "$link is done!\n";

}
顺便说一句:用户1126070将图像缩小到缩略图大小。我应该在这里用成像仪吗。你能在这里提出一些解决方案吗。。。!?那太好了

更新结束

问题提纲在这里继续——如本问答开头所述

问题概述:我有2500个网站的列表,需要抓取它们的缩略图。我该怎么做?我可以尝试用Perl解析这些站点。-机械化是一件好事。注意:我只需要一个缩略图,在长尺寸最大240像素的结果。目前,我有一个解决方案,速度很慢,而且不会返回缩略图:如何使脚本运行得更快,开销更少-吐出缩略图

但我必须意识到,设置它可能会带来相当大的挑战。 如果一切正常,您可以简单地使用这样的脚本转储所需网站的图像,但您应该启动Firefox并手动将其调整到所需的宽度(高度无关紧要,WWW::Mechanize::Firefox始终转储整个页面)

到目前为止,我已经做了很多工作,我与mozrepl一起工作。目前我正在努力解决超时问题:有没有办法用WWW::Mechanize::Firefox指定Net::Telnet timeout? 目前我的网络连接非常慢,有时会出错

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

> $mech->repl->repl->timeout(100000);
不幸的是,它不起作用:无法通过包“MozRepl”找到对象方法“timeout” 文件表明,这应该:

$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);
}
这里-这是我的来源:查看url列表中我的站点的一个片段示例

URL.txt-源的列表

www.google.com
www.cnn.com
www.msnbc.com
news.bbc.co.uk
www.bing.com
www.yahoo.com and so on...
顺便说一句:有这么多的url,我们不得不期待一些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
};
子内容作为png{
我的($self,$tab,$rect)=@;
$tab | |=$self->tab;
$rect | |={};
#大部分来自
# http://wiki.github.com/bard/mozrepl/interactor-screenshot-server

我的$screenshot=$self->repl->declare(你试过了吗?它能用吗

$mech->repl->repl->setup_client( { extra_client_args => { timeout => 5*60 } } );
将链接放到@list并使用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 ($@){
          print "link: $link failed\n";
          push(@list,$link);#put the end of the list
          next;
        }
        print "$link is done!\n";

}

你试过了吗?有效吗

$mech->repl->repl->setup_client( { extra_client_args => { timeout => 5*60 } } );
将链接放到@list并使用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 ($@){
          print "link: $link failed\n";
          push(@list,$link);#put the end of the list
          next;
        }
        print "$link is done!\n";

}

thx user1126070!!!看起来很棒。我已经把你的想法放在了最初的帖子的顶部。我把这个设置为
$mech->repl->repl->setup_client({extra_client_args=>{timeout=>5*60});
和:我想在当天晚些时候试一试[现在我在办公室里,而不是在家里-在有程序的机器前]顺便说一句,把图片缩小到缩略尺寸怎么样了。我应该在这里使用imager吗?你能在这里提出一些想法和建议吗…!?那太好了。你好,非常感谢,我检查了!我回来报告了所有的发现。thx againthx user1126070!!!看起来很棒。我已经把你的想法放在了最初帖子的顶部。我将其设置为
$mech->repl->repl->setup_client({extra_client_args=>{timeout=>5*60});
和:我想在当天晚些时候试用[现在我在办公室,不在家-在有程序的机器前]顺便说一句,把图像缩小到缩略尺寸是怎么回事。我应该在这里使用imager吗?你能在这里提出一些想法和建议吗…!?那太好了。嗨,那里-非常感谢-我查看了!我回来报告了所有的发现。thx仅供参考,这些关于如何使用perl控制WebKit的幻灯片可能也很有趣:和他的代码,如screenshot.pl:,没有试过,但看起来很有趣。非常感谢您的精彩提示仅供参考,这些关于如何使用perl控制WebKit的幻灯片可能也很有趣:他的代码,如screenshot.pl:,没有试过,但看起来很有趣。非常感谢您的精彩提示