数年前、Rの勉強を兼ねてどう書く?orgに色々とコードを投稿していたのをこっちに纏めることにしました。
今までは参照したい時に直接見に行っていたのですが、いつからか言語別ページもユーザー別ページもエラーになってしまうので困ったなーと思っていたのです。こっちに写しておけば検索もしやすいし使いすいしね。
意外とたくさん投稿していたらしく、手動でやりきれなかったのでスクリプトにしてみました。コメント欄の扱いがちょっと難しくて、とりあえずHTML::FormatTextでざっくりと整形しています。
自分のコードはともかく、お題部分も丸々コピーしてしまったので、もしかしたら問題があるかもしれません。問題であれば消します。
use strict; use warnings; use URI; use URI::http; use Web::Scraper; use HTML::FormatText; use utf8; binmode STDOUT, ":utf8"; binmode STDERR, ":utf8"; my $topic_uri = "http://ja.doukaku.org/topic/"; print STDERR "scraping $topic_uri\n"; my $topics = scraper{ process 'ul.topic_list li', 'list[]' => scraper{ process 'a', 'uri' => '@href'; process 'a', 'title' => 'TEXT'; }; result 'list'; }->scrape(URI->new($topic_uri)); ### $topics sleep 1; my $N = @$topics; my $i = 0; foreach my $t (@$topics){ print STDERR sprintf("%02d/%02d scraping %s : %s\n", ++$i, $N, $t->{uri}, $t->{title}); my $already_found = 0; my $comments = scraper{ process 'div.comment', 'c[]' => scraper{ process 'a', 'name[]' => 'TEXT'; process 'div.comment_body', 'cmt[]' => sub { HTML::FormatText->new(leftmargin => 1)->format($_); }; # set leftmargin=1 to avoid hatena-style syntax process 'td.code', 'code' => ['TEXT', sub { s/\x0D\x0A|\x0D|\x0A/\n/g; $_ }]; # cf. http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify }; result 'c'; }->scrape(new URI($t->{uri} . 'lang/r/')); ### $comments foreach my $c (@$comments){ ### $c if($c->{name}->[0] eq 'kkobayashi'){ if($already_found == 0){ print "\n\n*[R][doukaku.org]どう書く?org : $t->{title}\n"; print "original page : $t->{uri}\n"; print ">>\n"; print join("\n", @{$comments->[0]->{cmt}}); print "<<\n"; print ">||\n" . $comments->[0]->{code} . "||<\n" if exists $comments->[0]->{code}; $already_found = 1; } my $cmtn = substr($c->{name}->[1], 1); # chop the first '#'; print "\n\n**$c->{name}->[1]\n"; print "original page : http://ja.doukaku.org/comment/$cmtn/\n"; print ">>\n"; print join("\n", @{$c->{cmt}}); print "<<\n"; print ">|r|\n" . $c->{code} . "||<\n"; } } sleep 1; }