Perlで遊ぼう  

ってことで、私がちょいと調べてみたPerlのサンプルスクリプトなどを載せてみます。
最低限CPANの知識が必要です。その他Linuxの知識がいろいろと。
構造生物学とは関係ないです。

GtkMozEmbedを使ってWebページをキャプチャ  

MozillaのAPIを使ってWebページをキャプチャしてみます。

Gtk::MozEmbedのインストール  

CPANからGtk::MozEmbedを取得してインストールします。システムで必要だったのは以下のものです。

ぐらいだったと思います。これだけ入れたらたぶんcpanシェルでもすんなり入ると思います(手動でインストールしましたが)。

スクリプトサンプル  

こんな感じで作りました。Gtk2 APIを使うのが初めてだったので妥当なコードかどうかはわかりませんが・・・
Gtk::MozEmbedのサンプルを使って作成しました。

#!/usr/bin/perl
use strict;
use warnings;
use Glib qw(TRUE FALSE);
use Gtk2 -init;
use Gtk2::MozEmbed;

main();

sub main {
    Gtk2::MozEmbed->set_profile_path($ENV{HOME} . "/.mybrowser", "MyBrowser");
    my $window = Gtk2::Window->new("toplevel");         # windowを作成
    my $moz = Gtk2::MozEmbed->new();                    # MozEmbedを作成

    # windowクローズ時のシグナル
    $window->signal_connect(delete_event => sub {
        Gtk2->main_quit;
        return FALSE;
    });

    $moz->signal_connect(net_stop => \&on_net_stop);    # データダウンロード後のシグナル
    $window->set_title("MyBrowser");
    $window->set_default_size(600,400);                 # ウィンドウサイズ
    $window->add($moz);
    $window->show_all();
    $moz->load_url("http://gtk2-perl.sf.net");          # 接続先URL

    Gtk2->main;                                         # メインループへ
}

# データダウンロード後の処理
# すぐにキャプチャすると描画されていないのでタイマーで1秒待つ
sub on_net_stop {
    my $self = shift;
    Glib::Timeout->add(1000,sub { capture($self) });
}

# キャプチャメソッド
sub capture {
    my $moz = shift;
    my ($x,$y,$w,$h,$depth) = $moz->window->get_geometry();
    my $pixbuf = Gtk2::Gdk::Pixbuf->new("GDK_COLORSPACE_RGB",FALSE,8,$w,$h);
    $pixbuf->get_from_drawable($moz->window,$moz->window->get_colormap,0,0,0,0,$w,$h);
    $pixbuf->save("screen.png","png");
    print "Captured!!\n";
    Gtk2->main_quit();
    return FALSE;
}

このサンプルはGtk2を使うので当然X環境が必要になります。X環境が構築されているなら問題ありませんが、Xを導入していないようなサーバで使う場合はXvfb(X Virtual Frame Buffer)を使います。

# Xvfb :1 -screen 0 1024x768x24 &   <-- rootでXvfbスクリーンを作成する
$ setenv DISPLAY :1.0               <-- cshの場合
$ perl captest.pl

これでscreen.pngという名前でキャプチャされます。コマンドラインで便利に使いたい場合はURLとファイル名を指定できるようにすればおっけー。

 
参考