Как я могу сделать снимки экрана веб-страниц с Perl?

Действительно ли возможно записать сценарий в Perl, который открывает различные URL и сохраняет снимок экрана каждого из них?

17
задан Peter Mortensen 28 May 2015 в 12:26
поделиться

5 ответов

Вы можете использовать WWW::Mechanize::Firefox для управления экземпляром Firefox и сбросить отрендеренную страницу с помощью $mech->content_as_png.

Имейте в виду, что его настройка может представлять собой довольно сложную задачу.

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

use WWW::Mechanize::Firefox;
use Path::Class qw/file/;

my $mech = WWW::Mechanize::Firefox->new(
  bufsize => 10_000_000, # PNGs might become huge
);
$mech->get('http://www.stackoverflow.com/');

my $fh = file( 'test.png' )->open( '> :raw' );
print $fh $mech->content_as_png();
25
ответ дан 30 November 2019 в 10:46
поделиться

Используйте модуль WWW :: Selenium , для которого вам понадобится Selenium Remote Control сеанс запущен и работает.

Метод capture_entire_page_screenshot () должен помочь вам начать работу.

Из WWW :: Selenium на CPAN:

$ sel-> capture_entire_page_screenshot ($ filename, $ kwargs)

Сохраняет все содержимое текущего холста окна в файл PNG .. .


Типичный сценарий:

use strict;
use warnings;
use WWW::Selenium;

my $sel = WWW::Selenium->new( host => "localhost", 
                              port => 4444, 
                              browser => "*iexplore", 
                              browser_url => "http://www.google.com",
                            );

$sel->start;
$sel->open("http://www.google.com");
$sel->capture_entire_page_screenshot("screenshot.png");
$sel->close;
9
ответ дан 30 November 2019 в 10:46
поделиться

вызовет ли это проблему?

Да. Замок никогда не освободят.

Источник :

Вызывающий поток должен иметь блокировку параметра obj. Если вызывающий поток владеет блокировкой указанного объекта и выполнил равное количество вызовов Exit и Enter для объекта, блокировка снимается. Если вызывающий поток не вызывал Exit столько раз, сколько Enter, блокировка не снимается.

-121--3879627-

В Bash 4:

declare -A temp    # associative array
for element in "${Array1[@]}" "${Array2[@]}"
do
    ((temp[$element]++))
done
for element in "${!temp[@]}"
do
    if (( ${temp[$element]} > 1 ))
    then
        unset "temp[$element]"
    fi
done
Array3=(${!temp[@]})    # retrieve the keys as values

Edit:

ephemient указал на потенциально серьезную ошибку. Если элемент существует в одном массиве с одним или несколькими дубликатами и вообще не существует в другом массиве, он будет неправильно удален из списка уникальных значений. Приведенная ниже версия пытается справиться с этой ситуацией.

declare -A temp1 temp2    # associative arrays
for element in "${Array1[@]}"
do
    ((temp1[$element]++))
done

for element in "${Array2[@]}"
do
    ((temp2[$element]++))
done

for element in "${!temp1[@]}"
do
    if (( ${temp1[$element]} >= 1 && ${temp2[$element]-0} >= 1 ))
    then
        unset "temp1[$element]" "temp2[$element]"
    fi
done
Array3=(${!temp1[@]} ${!temp2[@]})
-121--1122291-

Можно также использовать Win32:: IE:: Mechanize для визуализации веб-страницы с помощью IE, а затем Win32:: Скриншот для захвата страницы. Вам, вероятно, придется немного поработать, чтобы выяснить, где сделать снимок экрана, но это не должно быть слишком сложно.

Конечно, это будет решение только для платформы Windows, но этого может быть достаточно.

4
ответ дан 30 November 2019 в 10:46
поделиться

Другой подход, не требующий использования браузера, заключается в использовании ImageMagick и HTML2PS для преобразования изображения. Однако будьте осторожны, это нетривиально, и почти невозможно (в последний раз я пытался) заставить это работать в Windows должным образом.

После установки ImageMagick самый простой подход - просто запустить системный вызов программы convert , которую устанавливает ImageMagick . Если вам нужен менее хакерский подход, вы можете использовать API PerlMagick ImageMagick .

Прекрасное обсуждение этого подхода можно найти на PerlMonks .

8
ответ дан 30 November 2019 в 10:46
поделиться

Используйте API веб-службы сторонних производителей, например http://webshotspro.com/ (скриншоты) или http://www.thumbalizr.com/ (эскизы).

3
ответ дан 30 November 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: