思い付きスクリプト


帰宅後、ダカダカ書いてた物を晒しときまーす。

いろいろ書きかけですが。

twitscrape.pl

#!perl
use strict;
use warnings;
use utf8;
use Encode;
  binmode STDOUT, ":utf8";
use Web::Scraper;
use URI;

  my $input = $ARGV[0] or die 'no input error.';
  unless($input =~ /^\w+$/) {
    exit;
  }
  my $username = $input;

  my $i;
  for($i = 1; $i < 999; $i++) {
    my $twit = &do_scrape_twit($username, $i);
    unless($twit) { last; }
    foreach(@$twit) {
      print $_->{uri}."\t".$_->{date}."\t".$_->{msg}."\n";
    }
  }
  print "\nscraping: $i\n";

  exit;

sub do_scrape_twit {
  my $id = shift or return;
  my $page = shift or return;
  my $uri = new URI('http://twitter.com/'.$id.'?page='.$page);
  sleep(5);
  return scraper {
    process 'ol.statuses li span.status-body',
      'twit[]' => scraper {
        process 'span.entry-content', msg => 'TEXT';
        process 'span a.entry-date', uri => '@href';
        process 'span a.entry-date span.published', date => 'TEXT';
      };
    result 'twit';
  }->scrape($uri);
}

引数にユーザー名を指定するとWeb::ScraperでついったのWebページからそのユーザーの発言を抽出します。

連続して拾うとついったが500とかになったりする気がするのでウェイトとして5秒入れてますが、タイミングの問題かもしれませんなー。

Webで表示されてるものそのままなので、直近の発言時間は現在から相対時間ですね・・・。あと、いろいろテキトーですwww

twitrss.pl

#!perl
use strict;
use warnings;
use utf8;
use Encode;
  binmode STDOUT, ":utf8";
use XML::TreePP;
use HTML::Entities;
use Web::Scraper;
use URI;

  my $input = $ARGV[0] or die 'no input error.';
  unless($input =~ /^\w+$/) {
    exit;
  }
  my $username = $input;
  my $urirss = &get_rss_uri($username) or die('doesnot get user-code.');

  my $i;
  for($i = 1; $i < 999; $i++) {
    my $twit = &get_rss_twit($urirss, $i);
    unless($twit) { last; }
    foreach(@$twit) {
    print $_->{pubDate}."\t".$_->{link}."\t".
          HTML::Entities::decode($_->{title})."\n";
    }
  }
  print "\nscraping: $i\n";

  exit;

sub get_rss_uri {
  my $id = shift or return;
  my $uri = new URI('http://twitter.com/'.$id);
  my $rss = scraper {
    process 'html head link', 'rss[]' => '@href';
    result 'rss';
  }->scrape($uri);
  foreach(@$rss) {
    if($_ =~ /^http:\/\/twitter\.com\/statuses\/user_timeline\/\d+\.rss$/) {
      return $_;
    }
  }
  return;
}

sub get_rss_twit {
  my $uri = shift or return;
  my $page = shift or return;
  sleep(5);
  my $xtpp = XML::TreePP->new() or return;
  my $rss = $xtpp->parsehttp(GET => $uri.'?page='.$page) or return;
  my $item = $rss->{rss}->{channel}->{item} or return;
  return $item;
}

こっちはRSS経由で発言を抽出します。

以前はついったのRSSって反映遅かった気がしますが最近は普通みたいなのでこっちでいいんじゃね?

こっちはさらにいろいろテキトーにやっちゃてますけど・・・。しかしなんで日本語が数値文字参照になってんでしょうね? RSSの仕様かなんかですかね?

それと時間に関してはUTC表記になってる(?)のでこっちの方が使いやすいですねってそりゃそうだwww

あと、見えてるものしか取れないので、プロテクトな人のTLは取得できないっす。(両方とも)



しかし、Web::Scraper って凄いし面白いな〜。

Perl使いにとっちゃ当たり前らしいけどはじめて使ってみたよ。

XPath練習もそのうちしようっと。