Проблема: у меня есть список из 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 :: TelnetNet :: Telnet не в CORE - это значит, что я не могу, как и выше
кстати: как упоминалось Øyvind Skaar: При том, что многие URL, мы должны ожидать, что некоторые откажутся и справятся с этим. Например, мы помещаем несостоявшиеся в массив или хеш и повторяем их X раз.
Я бы использовал fork() для многопроцессорной обработки, чтобы немного ускорить работу ... –
Привет, Алекс - какой бой захватывает очень маленькие изображения (/ Thumbnails), это ускоряет процесс !? Заметьте, мне не нужны большие изображения. Очень очень маленькие изображения подходят очень хорошо ... Что вы думаете !? Примечание. Мне нужны некоторые идеи по применению imager. – zero
С этим большим количеством URL-адресов вы должны ожидать, что некоторые из них потерпят неудачу и обработают это. Например, поместите несостоявшиеся в массив или хеш и повторите их X раз. –