Проблема: у меня есть список из 2500 веб-сайтов, и мне нужно сделать их скриншот.Как я могу это сделать?Я мог бы попытаться разобрать сайты либо с помощью Perl. Механизация была бы хорошей вещью.Примечание. Мне нужны только результаты в виде миниатюр, максимальная длина которых составляет 240 пикселей.На данный момент у меня есть решение, которое является медленным и не возвращает миниатюры: как заставить скрипт работать быстрее с меньшими накладными расходами - выплевывая миниатюры
Предварительные условия: addon / mozrepl /модуль WWW :: Mechanize :: Firefox;модуль имиджера
Первый подход: Вот первое решение Perl:
use WWW::Mechanize::Firefox;
my $mech = WWW::Mechanize::Firefox->new();
$mech->get('http://google.com');
my $png = $mech->content_as_png();
Структура: Возвращает данную вкладку или текущийстраница отображается как изображение PNG.Все параметры являются необязательными.$ tab по умолчанию соответствует текущей вкладке.Если координаты заданы, этот прямоугольник будет вырезан.Координаты должны быть хэшем с четырьмя обычными записями: left, top, width, height. Это относится к WWW :: Mechanize :: Firefox.
Как я понял из perldoc, эта опция с координатами,это не изменение размера всей страницы, это просто вырезанный из нее прямоугольник .... ну, WWW :: Mechanize :: Firefox заботится о том, как сохранять скриншоты.Ну, я забыл упомянуть, что мне нужно, чтобы изображения были только маленькими миниатюрами, поэтому у нас не должно быть очень очень больших файлов ... мне нужно только сделать скриншот из них.Я выполнил поиск на cpan для некоторого модуля, который уменьшает $ png, и обнаружил, что Imager
Меха-модуль не занимается изменением размера изображений.Здесь у нас есть различные модули изображений на CPAN, такие как Imager.Imager - расширение Perl для создания 24-битных изображений: Imager - это модуль для создания и изменения изображений.Он может читать и писать различные форматы изображений, рисовать примитивные формы, такие как линии и многоугольники, смешивать несколько изображений вместе различными способами, масштабировать, обрезать, отображать текст и многое другое.Я установил модуль - но я не расширил свой базовый подход
Что я уже пробовал;вот оно:
#!/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 пикселей.В качестве предварительного условия я уже установил модуль формирования изображений
Как заставить скрипт работать быстрее с меньшими накладными расходами - выплевывая миниатюры
Обожаю вас слышать!приветствия ноль
Обновление: в дополнение к идее Швермса, которая очень очень интересна, я обнаружил интересующий Monkthread , который говорит о тех же таймаутах:
Есть ли способ указать время ожидания Net :: Telnet с помощью WWW :: Mechanize :: Firefox?В настоящее время у меня очень медленное интернет-соединение, и иногда я получаю сообщение об ошибке
$mech->get(): command timed-out at /usr/local/share/perl/5.10.1/MozRepl/Client.pm line 186
Возможно, мне придется искать после mozrepl-Timeout-configuration !?Но в конце концов: это странно, и я не знаю, откуда берется этот тайм-аут.Возможно, это действительно таймфрейм Firefox, так как он занят синхронной загрузкой какого-то результата.Как вы видите на трассировке, WWW :: Mechanize :: Firefox опрашивает каждую секунду (или около того), чтобы определить, выбрал ли Firefox страницу.
Если это действительно Net :: Telnet, то у вас будетчтобы погрузиться:
$mech->repl->repl->client->{telnet}->timeout($new_timeout);
** Обновление ** , поэтому вопросы : я использую ** Net :: Telnet: **, который находится в Perl-Core
@ Александр Черный: спасибо за подсказку!впоследствии я сделал бы это следующим образом: use: Net :: Telnet; , но если его нет в ядре, я не могу так поступить.@ Daxim: $ corelist Net :: TelnetNet :: Telnet не был в CORE - это означает, что я не могу идти как выше
btw : как сказал Ойвинд Скаар: «С таким количеством URL мы должны ожидать, что некоторые потерпят неудачу и справятся с этим». Например, мы помещаем неисправные в массив или хэш и повторяем их X раз.