2012-02-19 3 views
3

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

Предпосылка: аддона/mozrepl/ модуль WWW: : Механизируйте :: Firefox; модуль формирования изображений

Первый подход: Вот первое решение Perl:

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

Outline: Это возвращает вкладку данной или текущую страницу показана как PNG изображение. Все параметры являются необязательными. $ tab по умолчанию для текущей вкладки. Если даны координаты, этот прямоугольник будет вырезан. Координаты должны быть хешем с четырьмя обычными элементами, слева, сверху, шириной, высотой. Это специфично для WWW :: Mechanize :: Firefox.

Как я понимаю из perldoc этот параметр с координатами, это не изменение размера всей страницы, это просто прямоугольник, вырезанный из него .... ну WWW :: Mechanize :: Firefox заботится о том, как для сохранения скриншотов. Ну, я забыл упомянуть, что мне нужно только иметь изображения в виде маленьких эскизов - так что нам не нужно иметь очень большие файлы ... Мне нужно всего лишь захватить снимок экрана из миниатюр. Я просмотрел cpan для некоторого модуля, который масштабирует $ png, и я обнаружил Imager

Меча-модуль не относится к изменению размеров изображений. Здесь у нас есть различные модули изображения на CPAN, такие как Imager. Imager - расширение Perl для создания 24-битных изображений: Imager - это модуль для создания и изменения изображений. Он может читать и записывать различные форматы изображений, рисовать примитивные фигуры, такие как линии, и многоугольники, смешивать несколько изображений по-разному, масштабировать, обрезать, отображать текст и многое другое. Я установил модуль - но я не расширил свой базовый подход

Что я пробовал 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 # 

Это мой источник ... см сниппет [пример] из сайты, которые у меня есть в url-списке.

urls.txt [список источников]

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

Вопрос: как продлить решение либо, чтобы убедиться, что он не останавливается на время тайм-аута. и - он хранит только маленькие миниатюры. Примечание: снова: мне нужны только результаты в виде миниатюр, максимальных 240 пикселей в длинном размере.В качестве предпосылок, я Allready установлен модуль тепловизора

Как сделать скрипт работает быстрее, с меньшими затратами - spiting из эскизов

Любовь услышать от вас! привет ноль

Update: в дополнении к Schwerms идее, которая очень и очень интересный я нашел intersting Monkthread, который говорит о тех же таймаутах:

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

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

Возможно, я должен loook после mozrepl-Timeout-конфигурации !? Но ведь: Это странно, и я не знаю, откуда этот тайм-аут. Возможно, на самом деле Firefox отключается, так как он занят синхронным получением некоторого результата. Как вы видите на трассе, WWW :: Mechanize :: Firefox опроса каждую секунду (или так), чтобы узнать, выбрал ли Firefox страницу.

Если это действительно Net :: Telnet, то вам придется нырнуть:

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

** Обновление ** поэтому вопросы: я маг использование ** Net :: Telnet: **, который находится в Perl-Core

@ Alexandr Ciornii: thx для подсказки! впоследствии я бы сделал это следующим образом: использование: Net :: Telnet;, но если он не в ядре, я не могу пойти так. @ Daxim: $ corelist Net :: Telnet␤␤Net :: Telnet не в CORE - это значит, что я не могу, как и выше

кстати: как упоминалось Øyvind Skaar: При том, что многие URL, мы должны ожидать, что некоторые откажутся и справятся с этим. Например, мы помещаем несостоявшиеся в массив или хеш и повторяем их X раз.

+1

Я бы использовал fork() для многопроцессорной обработки, чтобы немного ускорить работу ... –

+0

Привет, Алекс - какой бой захватывает очень маленькие изображения (/ Thumbnails), это ускоряет процесс !? Заметьте, мне не нужны большие изображения. Очень очень маленькие изображения подходят очень хорошо ... Что вы думаете !? Примечание. Мне нужны некоторые идеи по применению imager. – zero

+1

С этим большим количеством URL-адресов вы должны ожидать, что некоторые из них потерпят неудачу и обработают это. Например, поместите несостоявшиеся в массив или хеш и повторите их X раз. –

ответ

5

Посмотрите на Parallel::ForkManager, который является одним из самых простых и надежных способов параллельной обработки в Perl. Большая часть вашей работы будет связана с сетью и I/O, ваш процессор будет ждать, пока удаленный веб-сервер вернется, и вы, вероятно, получите большие выигрыши.

Что касается тайм-аута, это где-то внутри MozRepl и по умолчанию - 10 секунд. Вам нужно будет создать объект MozRepl :: Client с другим тайм-аутом и каким-то образом получить WWW :: Mechanize :: Firefox, чтобы использовать его, или вы можете сделать некоторые недокументированные вещи. This perlmonks thread показывает, как изменить таймаут. Также есть недокументированная переменная среды MOZREPL_TIMEOUT, которую вы можете установить.

+0

hello Schwern, мужчина огромное спасибо за подсказки! я делаю, как советовал! greetigns – zero

+0

hello again schwern: btw: есть Monksthread http://www.perlmonks.org/?node_id=901572, который говорит о тех же таймаутах: Есть ли способ указать Net :: Telnet таймаут с WWW :: Механизируйте :: Firefox? На данный момент мое подключение к Интернету очень медленное, и иногда я получаю ошибку с $ mech-> get(): команда тайм-аут на /usr/local/share/perl/5.10.1/MozRepl/Client.pm строка 186 Ну, я думаю, это очень странно, и я не знаю, откуда этот тайм-аут. Возможно, на самом деле Firefox отключается, так как он занят синхронным получением некоторого результата. – zero

+0

хорошо, что вы думаете - монахи говорят о так: это действительно Net :: Telnet, тогда вам нужно будет погрузиться вниз: $ mech-> repl-> repl-> client -> {telnet} -> Тайм-аут ($ new_timeout); , так что вопрос: нужна ли мне сеть :: Telnet: http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Telnet.pm Это вопрос - мне это нужно или нет!? Могу ли я запускать код с помощью или без Net :: Telnet: ???? – zero