2008/01/31


CodeReposに面白そうな物が入ってたので物色中。
どういうロジックでFriendを探しているのかは、まだ見てませんが...

こんなコードを実行すると... #!/usr/bin/perl

use strict;
use Net::Twitter::Friend::Finder::FromGoogle;

my $twitter = Net::Twitter::Friend::Finder::FromGoogle->new( {
        username => 'xxxxxxxxx',
        password => 'xxxxxxxxx' ,
        on_echo => 1,
        limit => 20 ,
        lang => 'ja' } );

$twitter->search;
$twitter->show;
こんな結果が返ります。 .----------------------------------------------.
| Net::Twitter::Friend::Finder::FromGoogle     |
'----------------------------------------------'
.---------+------------------------------------.
| Keyword | twitter                            |
'---------+------------------------------------'
.-----+----------------------+-----------------.
| #   | Twitter id           | Found count     |
'-----+----------------------+-----------------'
.-----+----------------------+-----------------.
| 1   | ikasam_a             | 1               |
| 2   | tsuda                | 1               |
| 3   | blog                 | 1               |
| 4   | help                 | 1               |
| 5   | tdtds                | 1               |
'-----+----------------------+-----------------'
なんだかwktk。

ところでFriend一覧で出てきたアカウント「help」って...

twitter-help
ちょwww
Posted at by




タレントスケジュールなんてサイトを見つけたので、さっそくスクレイピング。
ドキュメントに同じid属性が複数あるという、なんともダイナミックなHTMLにもめげず作り上げたのが以下 #!/usr/bin/perl

use encoding 'utf-8';
use strict;
use warnings;
use Encode qw(from_to);
use URI;
use URI::Escape qw(uri_escape_utf8);
use Web::Scraper;
use YAML;

if ($^O eq 'MSWin32') {
    binmode(STDERR, ':encoding(shift_jis)');
    Encode::from_to($ARGV[0], 'cp932', 'utf-8');
}
my $talent = shift || '小島よしお';

my $talent_schedule = scraper {
    process '//div[@class="find_bl"]/following-sibling::*[1]//td', day => 'TEXT';
    process '//div[@class="find_bl"]/following-sibling::*[1]//td/div',
        'schedule[]' => scraper {
            process 'div', media => sub { my $m = $_->attr('class'); $m =~ s/^icon_//g; $m };
            process '/div/a', url => '@href';
            process '/div/a', title => 'TEXT';
            process '/div/node()[1]', timespan => sub {
                my $s = $_->string_value;
                $s =~ s/ //;
                $s =~ s/(^|[^\d])(\d):(\d\d)/0$2:$3/g;
                my @span = split(/[^\d:]/, $s);
                \@span;
            };
        };
    result qw/day schedule/;
};
my $uri = URI->new('http://talent-schedule.jp/'.uri_escape_utf8($talent));
my $oppappi_schedule = $talent_schedule->scrape($uri);
warn Dump $oppappi_schedule;
ちょっと日付まわりで苦労してますが...

小島よしおって、結構番組出てますねぇ。

でもそんなの関係ry)
Posted at by




Web::Scraper使うときに、scraperコマンドを使って頑張る人もいれば、FirebugのDOMツリーで「XPathをコピー」とやっている人もいるでしょう。
前者の場合、端末でスクロールアウトするHTMLを見ながらXPathをこさえて間違ったらズラズラズラ…と画面が流れて行ってしまいます。後者の場合は、CLASSやID属性を使わないXPathが出来上がってしまいます。
映画に出てくるHackerの如く一発でXPathを決められればそれは素晴らしい事だと思いますが、いかんせん幾度か失敗しますよね。
で、何回もXPathを確かめられるツールが欲しいなと思い、perl-GTK2で作ってみました。

画面はこんな感じ
WebScraperHelper1
引数に「http://b.hatena.ne.jp/」を付けて起動したらこんな感じ
WebScraperHelper2
URLを変更して「Get」をクリックすれば再読み込みします。
そして、はてなブックマークトップページの「注目の動画」部分にある画像一覧を取得する為に //a[text()="注目の動画"]/../../..//img
というXPathを書いて「Update」をクリックすれば
WebScraperHelper3
こんな感じのHTMLが出来上がります。
あとはこれをWeb::Scraperのprocess部分に貼っつけるだけ。

ちなみにXPathでの属性値参照も出来ますので、はてなブックマークトップページで //meta[@http-equiv="Content-Type"]/@content
というXPathを書けば content="text/html; charset=UTF-8"
という結果が返ります。
起動にはCPANからGtk2モジュールをインストールする必要があります。HTMLのパース方法やノードの取得方法等は大体Web::Scraperと合わせていますので、Web::Scraperが動く環境にGtk2をインストールすれば動くかと思います。
また画面はLinux上で起動した物ですが、UN*Xらしい事は一切やってませんのでWindowsでも動作するかと思います。
ダウンロード:

もう少し機能を足そうかと思いましたが、今日はもうギブアップ。寝ます。
Posted at by