Twitterアカウントを指定して、全ての発言(ツイート)を取得するための perl スクリプトです。
目的は、
- あなたの彼の浮気調査
でもいいし(笑)、真面目に解析してもいいし。私の場合は、先に書いた「絡ったー」がらみで使う予定です。
twitter api を使うとアクセス制限(1時間に500回ぐらいかな)となるので、公式サイト http://twitter.com/ から直接引っ張ってきます。なので、公式サイトの形式が変わると取れなくなるんですが、ま、ひとまず、こんな感じで取得できるとという例として。
インストールは、
- activeperl などをダウンロード
- wget をダウンロード
分かる人は、cUrl に変更しても ok
コマンドラインから
perl krmall.pl [アカウント]
とすると、
- 全発言のファイル アカウント.txt
- 絡む人のファイル アカウント_st.txt
が作成されます。これをメモ帳で見る、ぐらいですね。HTML形式に変換し直すと、リンク先に飛べたりして便利です。
例えば、孫正義さんの全ツイートを取得する場合は、
perl krmall.pl masason
とします。
それなりに時間がかかりますが、WEBサイト等でクリックしていくよりも便利でしょう。
え~と、どういう風に取得しているかというと、
- 指定したアカウントのツイート数を取得
http://twitter.com/アカウント - 全ページ数 = ツイート数/20 + 1 を計算。
- ページ毎に過去を取得
http://twitter.com/アカウント?page=n - IDやツイートなどを検索して取り出し。
な感じです。いわゆるサイト経由のクローリングと同じです。
以下は、ソースコード。
# 指定アカウントの全発言を取得 $user = $ARGV[0]; # アカウント $wget = "wget"; if ( $user eq "" ) { print "perl krmall.pl [アカウント]"; exit; } # 現在のツイート数を取得 `$wget http://twitter.com/$user -Otemp.txt`; open( FILE, "<temp.txt" ); while(<FILE>) { if ( /<span id="update_count" class="stat_count">([0-9,]+)<\/span>/ ) { $cnt = $1; $cnt =~ s/,//; break; } } close( FILE ); $pmax = int($cnt/20)+1; print "account: $user count: $cnt pages: $pmax\n"; # 指定アカウントを全て読み込み unlink( "$user.txt" ); open( OUT, ">>$user.txt" ); for ($i=1; $i<=$pmax; $i++ ) { `$wget http://twitter.com/$user?page=$i -Otemp.txt`; open( FILE, "<temp.txt" ); while(<FILE>) { if ( /<span class="entry-content">/ ) { $text = $_; if ( !/<\/span>/ ) { while(<FILE>) { if ( /<\/span>/ ) { $text .= $_; last; } $text .= $_; } } $text =~ s/\n//g; $text =~ s/\r//g; $text =~ /<span class="entry-content">(.*)<\/span>/; $text = $1; <FILE>; <FILE>; $id = <FILE>; $id =~ /status\/([0-9]+)/; $id = $1; $date = <FILE>; $date =~ /data="{time:'([^']+)'}/; #" $date = $1; $text =~ s/<[^>]+>//g; print OUT "---\n"; print OUT "$id\n"; print OUT "$text\n"; print OUT "$date\n\n"; } } close( FILE ); } close( OUT ); # " # 統計表示 open( OUT, "<$user.txt"); open( ST, ">${user}_st.txt"); while(<OUT>) { if ( /^---/ ) { $_ = <OUT>; chomp; $id = $_; $_ = <OUT>; chomp; $text = $_; $_ = <OUT>; chomp; $date = $_; $_ = $text ; @res = /(@[A-Za-z0-9_]+)/g; foreach $re ( @res ) { $users{ $re } = $users{ $re } + 1; } } } close( OUT ); foreach $re ( sort {$users{$b} <=> $users{$a}} keys %users ) { if ( $re ne "@".$user ) { print ST "$re (".$users{$re}.")\n"; } } close( ST );
—
2012/01/11 追記
上記のコードでは最新の公式クライアントでは動かないので、下記を試してみてください。C# で記述しています。
指定したTwitterアカウントの全ツイートを取得(暫定.NET版) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2851
はじめまして。
このたび、検索からこちらのサイトを発見してお伺いさせていただきました。
ツイートを取得する件で質問なのですが、「wget」さんはどのようにダウンロードすることができるのでしょうか?
色々と検索したのですが、こちらのサイトがちょっと英語でわかりにくくダウンロード先がよくわからなく・・・。
よろしくご指導いただければと思います。
「wget windows ダウンロード」で検索して、
wget(Windows版) – 俺の基地
http://yakinikunotare.boo.jp/orebase/index.php?wget%A1%CAWindows%C8%C7%A1%CB
とか。