はてなキーワード: Web::Scraperとは
http://b.hatena.ne.jp/t/... で拾えるのが一番なんだが、それが出来ないので拝借するこにした。
いつもブックマークを有難う。これからもよろしく。
あと、Web::ScraperとDBIx::Simpleも有難う。久々に手を動かしたけど、助かったよ。
スーパーpre記法がアレなまま直ってないわけで。
姉妹サイト(?)ができていたわけで。
なにやらcookieを食べようとした形跡があるわけで。
#!/usr/local/bin/perl -w use strict; use warnings; use Web::Scraper; use URI; use Perl6::Say; use MIME::Type; use HTTP::Cookies; use LWP::UserAgent; use Path::Class; use Data::Dumper;sub p { print Data::Dumper::Dumper(@_) }; # cookie_jar
そういえばinheritなんてものがあるのを忘れてた。
// ==UserScript== // @name add style // @namespace http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/* // ==/UserScript== GM_addStyle( "font{color:inherit;font-size:inherit}"+ "u, s, strike{text-decoration:inherit}"+ "b{font-weight:inherit}"+ ".section{max-height:80em;overflow-y:auto}" );
firefoxオンリーだそうで http://anond.hatelabo.jp/20090120114819 ユーザースタイルシート的には
font{color:inherit;font-size:inherit} u, s, strike{text-decoration:inherit} b{font-weight:inherit} .section{max-height:80em;overflow-y:auto}
かな?
その他は http://anond.hatelabo.jp/20090120094216 の辺で。
それでストーカーするには Web::Scraperでその辺のタグの有無をチェックして DBIx::Simple で記録すればよいかな?
ついでに WWW::Mechanize::Plugin::Web::Scraper で封じ込めという手もありそう。
おー、使ってくれてる奇特な奴がいるとはうれしいねぇ。
感謝の気持ちを込めて実はアレから少しバージョンアップしてるのでそれを公開しますよ!
改善点は2点。
これを修正。これ微妙なんだよね。4u.pl動かしてる最中に画像が投稿されるとページングしたときに既に取得した画像にぶつかってしまって止まっちゃうんだよねー。
なので、最後に取得した画像にぶつかったらプログラム終了するように変更した。
元のURLの画像が削除されてしまって取得できなかった場合に、今までは.plainとかいうダミーデータが保存されてしまっていたが、それを4Uの画像を取得するように変更。
これで元画像が消えてても一応4Uから取得できるので取りこぼしが無くてヤッターって感じだねー。
でわでわコードは以下。
#!/usr/local/bin/perl -w use strict; use warnings; use Web::Scraper; use URI; use Perl6::Say; use MIME::Type; use LWP::UserAgent; use Path::Class; use Data::Dumper;sub p { print Data::Dumper::Dumper(@_) }; my $page = shift || 10000; unless ( $page =~ /^\d+$/ ) { die 'perl 4u.pl [page as int]'; } my @files = dir('./img/')->children; my $cache = {}; my $end_file = { mtime => 0 , file => '' }; for my $file (@files) { if ( $file->basename =~ /^(.+)\.(.+)$/ ) { $cache->{$1} = $2; } if ( $end_file->{mtime} < $file->stat->mtime ) { $end_file->{mtime} = $file->stat->mtime; $end_file->{file} = $file; } } for my $i (1..$page) { my $url = sprintf 'http://4u.straightline.jp/?page=%s' , $i; say "request url>".$url; my $tmp = scraper { process 'ul.entry-list>li>div.entry-body>div.entry-photo>a', 'link[]' => '@href'; process 'ul.entry-list>li>div.entry-footer>div.wrapper-entry-description>div.entry-description>p.entry-img-src', 'img[]' => 'TEXT'; result 'link','img'; }->scrape(URI->new($url)); my $links = $tmp->{link}; my $imgs = $tmp->{img}; if ( ref $links ne 'ARRAY' ) { say "end program."; exit; } for my $link (@$links) { $link =~ m{/([^/]+)$}; my $sesid = $1; if ( $end_file->{file} && $end_file->{file}->basename =~ /^$sesid\./ ) { say "file exsits end program >".$sesid; exit; } if ( $cache->{$sesid} ) { say "file exsits next >".$sesid; next; } sleep 1; my $image_url = shift @$imgs || next; $image_url = 'http://'.$image_url; say "get image url >".$image_url; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $image_url); my $res = $ua->request($req); my $content = $res->content; my $content_type = $res->headers->header('content-type'); my $ext = MIME::Type->new( type => $content_type )->subType || 'bin'; if ( $ext eq 'plain' ) { say "not found image >".$image_url; # 本家の画像が消えてたら4Uの奴を保存する。 my $image_url = 'http://www.straightline.jp/html/found/static/upload/l/l_'.$sesid.'.jpg'; say "get 4u image url >".$image_url; my $req = HTTP::Request->new(GET => $image_url); my $res = $ua->request($req); $content = $res->content; $ext = 'jpeg'; } my $write_path = './img/'.$sesid.'.'.$ext; open my $FH, '>', $write_path; binmode $FH; print $FH $content; close $FH; say "write image >".$write_path; } }
なんか呼ばれた気がしなくもない。
ここ1年程の、ほぼすべてのエントリナンバは提供できると思う。
ただ、削除されたエントリもそれなりに入ってるけど、入ってないものも多い。そんなデータ。
たぶん10万件×14桁で1.5Mほどかな。圧縮すれば2割くらいになってくれるだろうか。
いる人いる?
しかし、日単位なら365リクエストでいけるから、とってきた方が早いかも。
shならwgetとsed、perlならWeb::Scraper、gmならgm_xhrか。
xpathgraphという手もあるな。総計値になるけど。差分や統計が取れたらもっと面白いのに。
4Uって知ってるかい?
”世界中の美女画像を皆でシェアするソーシャルイメージブックマークサービス”
とのことさ。それはほんともう美しい画像が満載で毎日見てても飽きないわけさ。
そこでローカルに画像を保存しようと思い、ちょっくら実装してみた。
#!/usr/local/bin/perl -w use strict; use warnings; use Web::Scraper; use LWP::UserAgent; use Perl6::Say; use MIME::Type; use URI; use Data::Dumper; sub p { print Data::Dumper::Dumper(@_) }; my $page = shift || 1000; unless ( $page =~ /^\d+$/ ) { die 'perl 4u.pl [page as int]'; } for my $i (1..$page) { my $url = sprintf 'http://4u.straightline.jp/?page=%s' , $i; say "request url>".$url; my $tmp = scraper { process 'ul.entry-list>li>div.entry-body>div.entry-photo>a', 'link[]' => '@href'; process 'ul.entry-list>li>div.entry-footer>div.wrapper-entry-description>div.entry-description>p.entry-img-src', 'img[]' => 'TEXT'; result 'link','img'; }->scrape( URI->new($url) ); my $links = $tmp->{link}; my $imgs = $tmp->{img}; if ( ref $links ne 'ARRAY' ) { say "end program."; exit; } for my $link (@$links) { $link =~ m{/([^/]+)$}; my $sesid = $1; sleep 1; my $image_url = shift @$imgs || next; $image_url = 'http://'.$image_url; say "get image url >".$image_url; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $image_url); my $res = $ua->request($req); my $content = $res->content; my $content_type = $res->headers->header('content-type'); my $ext = MIME::Type->new( type => $content_type )->subType || 'bin'; my $write_path = './img/'.$sesid.'.'.$ext; if ( -f $write_path ) { say "file exsits end program >".$write_path; exit; } open my $FH, '>', $write_path; binmode $FH; print $FH $content; close $FH; say "write image >".$write_path; } }
貴様、うるせーんだよ。
今回俺としてはWeb::Scraper使いたかったので自力実装してみますた。
使い方を試しながらだったので製作時間2時間くらいかかたお。次からはもっと短縮できそうだ。
まーがーっと書いた後に整理してないからコード自体はかなり汚ねぇのでご了承を。ふへ。
とりあえず4u.plを叩くとカレントディレクトリのimgフォルダに取得した画像を次々書き込んでいく。
ちゃんと次のページにも遷移しながらどんどんがんがん書き込んでいくのさ。
で、以前取得したことのある画像にぶつかるとそこでプログラム終了。
ちゅーかなんつってもWeb::Scraperってばスゲエよな。俺のクリオアがびんびん反応するぜ。え?クオリアだって?うっせぇ野暮なこと言うなよ。