この日記の方針。
- この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
- ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
- 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
- perl -e die
2008-12-19 (Fri)Twitterプログラミング
■ [Net][Twitter] TwitterのHTMLをパースする

ログイン認証をクリアするのが厄介すぎるのでここまで。認証通るようにしました。
とりあえず、公開ユーザの最新20件の発言を抽出して画面に表示するだけ。Windows環境で作ったので、出力文字コードがcp932になっているのは笑ってやってください。
#!/usr/bin/perl use strict; use HTTP::Request; use LWP::UserAgent; use HTML::Parser; use Encode; my $req = HTTP::Request->new( GET => 'http://twitter.com/cress_cc', ); my $ua = LWP::UserAgent->new; my $res = $ua->request($req); unless ($res->is_success) { print $res->status_line, "\n"; exit; } my $content = $res->content; my $parser = HTML::Parser->new( api_version => 3, start_h => [ sub { my($self, $tagname, $attr, $text) = @_; $self->{entry} ++ if ($tagname eq 'span' && ($self->{entry} || $attr->{class} eq 'entry-content')); }, 'self, tagname, attr, text', ], text_h => [ sub { my($self, $dtext) = @_; $self->{text} .= $dtext if $self->{entry}; }, 'self, dtext', ], end_h => [ sub { my($self, $tagname) = @_; if ($tagname eq 'span' && $self->{entry}) { $self->{entry} --; print encode('cp932', decode('UTF-8', $self->{text})), "\n"; $self->{text} = ''; } }, 'self, tagname, attr', ], marked_sections => 1, ); $parser->parse($content);
結構ごちゃごちゃしてくるなあ・・・
HTML::Parserを継承して、Twitter::Parserみたいなのを作っちゃった方がいいかも。
spanの中にさらにspanがある場合があるので、その処理がちょっと厄介。もうちょっと綺麗に書けないものか。
追記
Uchimataさんより、BASIC認証で認証が通るとの情報を受けて、一部修正してみた。
my $req = HTTP::Request->new( GET => 'http://twitter.com/home', ); $req->authorization_basic('USERNAME', 'PASSWORD');
これでスクレイピングができる。
しかし、ここまで書いて発言者のIDを取り出し忘れていることに気づく。何やってんだ自分。
コメントを書く
トラックバック - http://perl.g.hatena.ne.jp/Cress/20081219