くれすのPerl日記 このページをアンテナに追加 RSSフィード

この日記の方針。

  1. この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
  2. ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
  3. 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
  4. perl -e die

2008-12-19 (Fri)Twitterプログラミング

[][] TwitterHTMLをパースする 01:51  TwitterのHTMLをパースする - くれすのPerl日記 を含むブックマーク はてなブックマーク -  TwitterのHTMLをパースする - くれすのPerl日記  TwitterのHTMLをパースする - くれすのPerl日記 のブックマークコメント

ログイン認証をクリアするのが厄介すぎるのでここまで。認証通るようにしました。

とりあえず、公開ユーザの最新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