Perl Mechanize - как заставить скрипт работать быстрее с меньшими издержками - PullRequest
3 голосов
/ 20 февраля 2012

Проблема: у меня есть список из 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 :: Telnet␤␤Net :: Telnet не был в CORE - это означает, что я не могу идти как выше

btw : как сказал Ойвинд Скаар: «С таким количеством URL мы должны ожидать, что некоторые потерпят неудачу и справятся с этим». Например, мы помещаем неисправные в массив или хэш и повторяем их X раз.

1 Ответ

5 голосов
/ 20 февраля 2012

Посмотрите на Parallel :: ForkManager , который является одним из самых простых и надежных способов параллельной обработки в Perl.Большая часть вашей работы будет связана с сетью и вводом-выводом, ваш ЦП будет ожидать возвращения удаленного веб-сервера, и вы, вероятно, получите большие выигрыши.где-то внутри MozRepl и по умолчанию 10 секунд.Вам нужно либо создать объект MozRepl :: Client с другим тайм-аутом и каким-то образом заставить его использовать WWW :: Mechanize :: Firefox, либо вы можете сделать некоторые недокументированные вещи. Этот поток perlmonks показывает, как изменить время ожидания.Также есть недокументированная переменная окружения MOZREPL_TIMEOUT, которую вы можете установить.

...