「Web::Scraper」を含む日記 RSS

はてなキーワード: Web::Scraperとは

2010-11-21

増田ブックマークTop10*3 いや 3*10だったか...

http://b.hatena.ne.jp/t/... で拾えるのが一番なんだが、それが出来ないので拝借するこにした。

いつもブックマークを有難う。これからもよろしく。

あと、Web::ScraperとDBIx::Simpleも有難う。久々に手を動かしたけど、助かったよ。

2009-04-14

http://anond.hatelabo.jp/20080822142610

スーパー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


  
  

2009-01-20

そういえば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 で封じ込めという手もありそう。

2008-08-22

http://anond.hatelabo.jp/20080821224627

おー、使ってくれてる奇特な奴がいるとはうれしいねぇ。

感謝の気持ちを込めて実はアレから少しバージョンアップしてるのでそれを公開しますよ!

改善点は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} &amp;&amp; $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;
    }
}

言わずもかなコードカオスなのでよろしゅうたのんます。

2008-08-01

http://anond.hatelabo.jp/20080801154904

なんか呼ばれた気がしなくもない。

ここ1年程の、ほぼすべてのエントリナンバは提供できると思う。

ただ、削除されたエントリもそれなりに入ってるけど、入ってないものも多い。そんなデータ

たぶん10万件×14桁で1.5Mほどかな。圧縮すれば2割くらいになってくれるだろうか。

いる人いる?

しかし、日単位なら365リクエストでいけるから、とってきた方が早いかも。

shならwgetsedperlならWeb::Scrapergmならgm_xhrか。

rubypythonは知らない。

xpathgraphという手もあるな。総計値になるけど。差分や統計が取れたらもっと面白いのに。

はてなグラフインポートできないかな。

2008-04-23

4Uの画像が美しすぎてPerlプログラム組んでみた

4Uって知ってるかい?

http://4u.straightline.jp/

世界中の美女画像を皆でシェアするソーシャルイメージブックマークサービス

とのことさ。それはほんともう美しい画像が満載で毎日見てても飽きないわけさ。

そこでローカル画像を保存しようと思い、ちょっくら実装してみた。


#!/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;
    }
}

それPlaggerでで・・・」モウココウハザン!ドスッ!

貴様、うるせーんだよ。

今回俺としてはWeb::Scraper使いたかったので自力実装してみますた

使い方を試しながらだったので製作時間2時間くらいかかたお。次からはもっと短縮できそうだ。

まーがーっと書いた後に整理してないからコード自体はかなり汚ねぇのでご了承を。ふへ。

とりあえず4u.plを叩くとカレントディレクトリのimgフォルダに取得した画像を次々書き込んでいく。

ちゃんと次のページにも遷移しながらどんどんがんがん書き込んでいくのさ。

で、以前取得したことのある画像にぶつかるとそこでプログラム終了。

ちゅーかなんつってもWeb::Scraperってばスゲエよな。俺のクリオアがびんびん反応するぜ。え?クオリアだって?うっせぇ野暮なこと言うなよ。

プログラ増田のあなぐら

 
アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん