Hatena::Grouptodeskin

eigokunの手記 RSSフィード

 | 

2009-09-02

はてブで特定のタグを使ってる人のリストを作成するスクリプトを書いた

23:52 | はてブで特定のタグを使ってる人のリストを作成するスクリプトを書いた - eigokunの手記 を含むブックマーク はてなブックマーク - はてブで特定のタグを使ってる人のリストを作成するスクリプトを書いた - eigokunの手記

Perlクローラというのを書いてみたかったので、書いてみた。基本的な部分は簡単だったんだけど、UAの偽装とか、そういうのが分かりにくかった。

基本的には、はてブタグページから各ブックマークページのリンクを手に入れて、そこで特定のタグを使っている人を抽出するという仕組み。

今回は、試しに [マスゴミ] というタグを使ってる人を集めたら266人とれた。



これは滅多にPerlを書かない(というかプログラム自体も書かない)僕が適当にやったやつなので、誤爆してる可能性もあるので注意。もし誤爆してたらごめんなさい。


#!/usr/bin/perl

use LWP::Simple;
use LWP::UserAgent;
#use utf8;

@tag_list = qw(
	マスゴミ
);

@user_list;

$ua;

main();

sub main {
	$ua = LWP::UserAgent->new(agent => "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Ubuntu/9.04 (jaunty) Firefox/3.5");
	$ua->timeout(40);

	foreach(@tag_list) {
		get_tagpages($_);
	}

	print join("|", @user_list);
	print "\n\n" . @user_list;
}

sub get_tagpages {
	my ($tag) = @_;
	@urls;

	for(my $page_n=0; $page_n<30; $page_n++) {
		my $webpage = $ua->get("http://b.hatena.ne.jp/t/$tag?of=" . $page_n * 25);
		my @line = split(/\n/, $webpage->content);

		foreach(@line) {
			if($_ =~ /<li class="users">/) {
				my $url, $users;
				my @buff, @buff2;

				@buff = split(/\<a href="/, $_);
				@buff2 = split(/" title=/, $buff[1]);

				$url = "http://b.hatena.ne.jp$buff2[0]";

				@buff = split(/\)">/, $_);
				@buff2 = split(/ users<\/a>/, $buff[1]);

				$users = $buff2[0];

				if($url and $users) {
					if($users > 50) {
						push(@urls, $url);
					}
				}
			}
		}

		print STDERR "fetched " . $page_n * 25 . "\n";
	}

	print STDERR "\n";

	my $count = 0;

	foreach(@urls) {
		my $webpage, @line;
		
		$webpage = $ua->get($_);

		@line = split(/\n/, $webpage->content);

		foreach(@line) {
			if($_ =~ /class="tags"/) {
				if($_ =~ /$tag/) {
					my @buff, @buff2;

					@buff = split(/href="\//, $_);
					@buff2 = split(/\//, $buff[1]);

					unless(is_exist($buff2[0])) {
						push(@user_list, $buff2[0]);
					}
				}
			}
		}

		print STDERR "fetched $_ ($count / $#urls)\n";
		$count++;
	}
	
	print STDERR "\n";
}

sub is_exist {
	my ($username) = @_;

	foreach(@user_list) {
		if($_ eq $username) {
			return 1;
		}
	}

	return 0;
}

書いてから気付いたんだけど、俺は普通にタグページを取得して、50users以上のエントリだけに絞って取得したんだけど、はてブURL引数閾値を設けることが出来るので無駄骨だった。

 |