検索結果のURL先のテキストをすべて読み込む[Perl]
今まで作ったものをつなげただけです。
#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use HTML::TreeBuilder; use Jcode; # urlを指定する # my $url = 'http://www.yahoo.co.jp'; my $search_word = '静岡'; # UTF8 に変換 #$search_word = jcode($search_word,'euc')->utf8; # URLエンコードも忘れずに $search_word =~ s/(\W)/'%' . unpack('H2', $1)/eg; my $url = 'http://www.google.co.jp/search?hl=ja&q=' . $search_word . '&lr='; # IE8 my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; # LWPを使ってサイトにアクセスし、HTMLの内容を取得 my $ua = LWP::UserAgent->new('agent' => $user_agent); my $res = $ua->get($url); my $content = $res->content; # HTML::TreeBuilderで解析 my $tree = HTML::TreeBuilder->new; $tree->parse($content); # DOM操作 my @items = $tree->find('h3'); my @a; my @urls; for (@items){ print $_->as_text."\n"; @a=$_->find('a'); for ( @a ){ # print $_->attr('href')."\n"; my $url = $_->attr('href'); $url = urlget($url); print $url."\n"; push( @urls , $url )if chkUrl($url); } } # 一覧の詳細 @items = $tree->look_down('class', 'st'); print $_->as_text."\n" for @items;
Wikipediaはこのやり方では読み込めない仕組みになっています。
あと、グーグルの相対パスも読み込まないようにします。
2つサブルーチンを作って対応しました。
sub urlget{ my $url=shift; if ( $url=~ /\?url\=(.*)\&rct/ ){ return $1; } else{ return ""; } } sub chkUrl{ my $url=shift; if ( $url=~ /wikipedia\.org/ ){ $url=""; } return $url; }
そして、すべての検索結果URLを読み込みます。
ちょっとスパゲッティ的ですが、続けて読み込み処理をつけました。
#URLを1つずつ開く. for (@urls){ my $url=$_; print $url . " ...get\n"; my $res = $ua->get($url); my $content = $res->content; my $code = Jcode::getcode($content); if ( $code ne 'utf8' ){ $content = Jcode::convert( $res->content ,"utf8" , $code); } $tree->parse($content); my @items = $tree->find('html'); print $_->as_text."\n" for @items; }
これでうまく行ったか・・・?
と思いきや途中から激しく文字化けをしました。
具体的には
https://retrip.jp/articles/5381/
を読み込むとそうなってしまいます。
試しにトップページも試しましたが、同じでした。
HTMLそのものは文字化けしていないのですが、TreeBuilderで解析すると文字化けしてしまいます。
次回はそこを掘り下げていきます。
ディスカッション
コメント一覧
まだ、コメントがありません