2012-02-21 2 views
1

Я использую WWW :: Mechanize :: Firefox для управления экземпляром firefox и дампом отображаемой страницы с помощью $ mech-> content_as_png.thumbnail скриншот веб-страниц с Perl :: Механизировать

Новое обновление: см в конце первоначального размещения: благодаря 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 что с обрезкой вниз изображения до миниатюры. Должен ли я использовать тепловизор здесь. Можете ли вы предложить некоторые решения здесь ...!? Это было бы прекрасно.

конец Update

Здесь проблема контурный продолжается - как написано в самом начале этого Q &

проблема контурного: У меня есть список 2500 сайтов и вам нужно взять снимок экрана из миниатюры. Как мне это сделать? Я мог бы попытаться разобрать сайты либо с Perl.- Mechanize было бы хорошо. Примечание. Мне нужны только результаты в виде миниатюр, максимальных 240 пикселей в длинном размере. На данный момент у меня есть решение, которое медленное и не возвращает эскизы: как заставить скрипт работать быстрее с меньшими накладными расходами - выкручивание эскизов

Но я должен знать, что его настройка может представлять собой довольно вызов. Если все работает так, как ожидалось, вы можете просто использовать сценарий, подобный этому, чтобы сбрасывать изображения с нужных веб-сайтов, но вы должны запустить Firefox и изменить его размер до нужной ширины вручную (высота не имеет значения, WWW :: Mechanize :: Firefox всегда выгружает всю страницу).

Что у меня есть сделано до сих пор is alot - я работаю с mozrepl. На данный момент я борюсь с таймаутами: есть ли способ указать Net :: Telnet таймаут с WWW :: Mechanize :: Firefox? На данный момент мое подключение к интернету очень медленно, и иногда я получаю ошибку

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

СМОТРИТЕ ЭТОТ:

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

Unfortunatly он не работает: не удается найти метод объекта «тайм-аут» с помощью пакета "MozRepl" Документация говорит, что это необходимо:

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

Что я попробовал Allready; здесь:

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

И здесь - это мой источник: см сниппета-пример сайтов, которые я в списке адресов.

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

Просто FYI, эти слайды о том, как управлять WebKit с Perl, может представлять интерес, а также: http://potyl.github.com/ Talk-WebKit-Perl/и его код, например screenshot.pl: https://github.com/potyl/Webkit/blob/master/screenshot.pl. Не пробовал, но выглядит очень интересно. –

+0

мужчина огромное спасибо за отличные подсказки – zero

ответ

1

Вы пробовали это? Это работает?

$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 ([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 **, что с обрезкой вниз по изображениям до миниатюры. Должен ли я использовать ** imager ** здесь. Можете ли вы предложить некоторые ** идеи и строку ** здесь ...!? Это было бы прекрасно. – zero

+0

проверить это: http://www.imagemagick.org/script/perl-magick.php – user1126070

+0

привет там - много спасибо - я проверю! Я возвращаюсь и сообщаю все выводы. THX снова – zero

Смежные вопросы