@xaicron
2014/10/24 perlcasual#6
最近の様子
ハッカドール知ってる人〜?
これね↓
スクレイピングってなんでしょうか?
jQuery っぽい感じで HTML をほげほげできる便利なやつ。
use Data::Dumper;
use Web::Query qw(wq);
my $links = [];
wq('https://metacpan.org/author/XAICRON')->find('#author_releases a')->each(sub {
my ($i, $e) = @_;
push @$links, $e->attr('href');
});
warn Dumper $links;
みたいにやると、リンクの一覧が取れちゃう!
wq() に URL を指定しているけども、ここは HTML の文字列か HTML::Element オブジェクトでもよい。
上記の each() のところの $e は Web::Query のオブジェクトなので、再帰的に処理することもできて便利。
最近 next() と prev() が追加されたので、nextSibling 的なことも簡単にできて便利ですね。
cookie を保持できるクライアントじゃないとリダイレクトされちゃうページとかがあってめんどいので、デフォルトでその辺めんどうみてくれる WWW::Mechanize を使っている。
use Data::Dumper;
use WWW::Mechanize;
use Web::Query qw(wq);
my $mech = WWW::Mechanize->new;
my $res = $mech->get('https://metacpan.org/author/XAICRON');
my $links = [];
wq($res->decoded_content)->find('#author_releases a')->each(sub {
my ($i, $e) = @_;
push @$links, $e->attr('href');
});
warn Dumper $links;
HTML の中身が &#xxx みたいになっていることがあるので前処理として一発かませておくと便利ですね。
use HTML::Entities (decode_entities); $html = decode_entities $html;
より詳細に HTML を操作したい場合に利用する。
たとえば、HTML コメントを取り除きたかったり、<br /> タグを全部改行に変えたいなど、あらゆる用途に利用可能。
実際にはこれだけでスクレイピングすることも不可能ではないが、わりと低レベルな操作を求められるので局所的につかうことをおすすめ。
use HTML::Filter::Callbacks;
my $filter = HTML::Filter::Callbacks->new;
$filter->handler(comment => []); # HTML コメントは削除
# br を改行に変更
$filter->add_callbacks(
br => {
start => sub {
my $tag = shift;
$tag->remove_tag;
$tag->text($tag->text =~ s/^\s+|\s+$//mgr);
$tag->append("\n");
},
},
);
my $filtered_html = $filter->process($html);
とあるサービスでブログとかで出てくる画像のなかでそれなりにいいやつを選択したいこととががあるようないような気がしますね。
画像のサイズとか、色数とかをそこそこ取得してなんとなくいいかんじに使えば良さそうですね!
今回は Imager をつかってみます。
use Imager;
use Image::Info qw(image_type); # 画像の種類を取得する奴
my $data = $ua->get('http://example.com/sample.png')->content;
my $img = Imager->new(data => $data); # raw data が食える
my $file_type = lc(image_type(\$data)->{file_type} || '');
my $height = $img->getheight;
my $width = $img->getwidth;
my $bits = $img->bits;
my $colors = $img->getcolorcount;
my $channels = $img->getchannels;
my $file_size = length $data;
こんなかんじでとっても簡単に画像の詳細を取得できますね。
あとはピクセル数とか色数とかのしきい値をきめていい感じな画像を選択すればよいですね。
生まれて初めてプログラミングの勉強会というもので発表することになった。
当初 15分枠だったため、それなりにスライドを書いたがのちに参加者の増加にともなって 5分に変更になった。
ちなみにその時のスライドは驚異の 150枚超。
初めての発表からスライドすっ飛ばし芸は存在していたようだ。
余談ですが、ここで @hidek さんに初めて会って紆余曲折あって DeNA に入ることになったのであった。
http://blog.livedoor.jp/xaicron/archives/51053533.html
フレッシュマンとして参加して、Dan さんにサインを貰ったらしい!
http://blog.livedoor.jp/xaicron/archives/51135723.html
みんなだいすき Encode の話をしたっぽいですね!
ジュンク堂書店 池袋本店で開催された会。
池袋は心の距離が遠く、断念。
二次元からログアウトできなくなっていた
@bayashi さんに突然
「お前、基調講演だから。」
と言われる。冗談だと思っていたらマジだったので、当日に資料を作り始めるて発表。 <- イマココ
というわけで Perl-Casual は良いイベントなので #100 ぐらいまで続いたりすると良いですね。
j or →: next
k or ←: prev
h or ↑: list
l or ↓: return
o or ↵: open
? or /: toggle this help