- 締切済み
PerlでGOOGLEの検索結果を書き出す
単語をGOOGLEで検索すると、ソースでは以下のように表示されます。 <!doctype html><head><meta http-equiv="X-UA-Compatible" content="IE=8"><meta http-equiv=content-type content="text/html; charset=UTF-8"><title>シュウマイ - Google 検索</title><script>window.google={kEI:"oZQ7TdTAAcLMcNDKlYUH",kEXPI:"17259,20782,28186,28233,28290",kCSI:{e:"17259,20782,28186,28233,28290",ei:"oZQ7TdTAAcLMcNDKlYUH",expi:"17259,20782,28186,28233,28290"},ml:function(){},kHL:"ja",time:function(){return(new Date).getTime()},log:function(c,d, 以下略 この長い文章をテキストファイルに書き込みたいと思っています。 できればCGIフォームを使用して、そこに入力された言葉で検索、検索した結果のソースをtxtファイルに保存したいのですが、どなたか教えていただけないでしょうか。 言語はPerlです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kuroizell
- ベストアンサー率55% (95/170)
さくらはHTML::TreeBuilderとかも入ってないですか? 私ならHTML解析を独自に頑張るより、さくらでCPANを使えるように頑張ります。 詳しくは「さくら CPAN」でググって下さい。
- kuroizell
- ベストアンサー率55% (95/170)
とりあえずチラ見した限り、my $res = $ua->request( $req );で取った$resが、 その後何もされないまま終わってるように見えますが。 以下がコピペで動きます(Windows用にエンコードしてます)ので、試して下さい。 use Encode; use WWW::Mechanize; my $engine = 'http://www.google.com/search?q='; my $word = 'シュウマイ'; # CGIならmy $word = $q->param('search_word')にでも。 my $mech = WWW::Mechanize->new(); $mech->get( $engine . $word ); my @links = $mech->find_all_links( class => 'l' ); foreach my $link ( @links ) { print encode('cp932', $link->text), "\n"; }
補足
ありがとうございます。ローカルではきちんと作動しましたが、さくらサーバではWWW::Mechanizeがインストールされていないようで出来ませんでした。 LWP::UseAgentを使って同じようにやることはできないのでしょうか。 たびたびお願いします。
- kuroizell
- ベストアンサー率55% (95/170)
検索しましたか? http://okwave.jp/qa/q5951803.html それともファイルへの書き込み方が必要なのでしょうか?
補足
WWW::Mechanizeというものについては知りませんでした。 以前、以下のようなソースを書いたのですが、名詞をGOOGLEに渡して、検索結果の中から特定の一単語を返すというものなのですが、上手く動作しません。このソースの問題点について教えていただけますでしょうか。 #!/usr/local/bin/perl package search; use LWP::UserAgent; use HTTP::Request; use Jcode; require 'usemecapi.pl'; sub main() { my ( $word ) = @_; $word = Jcode->new( $word )->utf8;#ここついか my $url = &MakeUrl( $word ); my $ua = LWP::UserAgent->new( agent => 'user agent' ); my $req = HTTP::Request->new( 'GET' => $url ); my $res = $ua->request( $req ); &GetText( Jcode->new( join( '', @data ), "utf8")->eucjp );#euc-jp->eucjp } sub GetText( $ ) { my ( $html ) = @_; $html = Jcode->new( $html )->utf8;#ここついか my @ret; foreach( split( /<br>/, $html ) ) { if( $_ =~ /<div class="s">([\s\S]*)/g ) { my $str = $1; open(OUT,"> googlefile.txt"); print OUT "$_"; close(OUT); #この3行追加↑↑ $str = Jcode->new( $str )->utf8;#ここついか my @data = &mecapi::main( $str ); @data = Jcode->new( @data )->eucjp;#ここついか foreach( @data ) { if( ${ $_ }{ 'speech' } eq '名詞' ) { push( @ret, ${ $_ }{ 'word' } ); } } last; } } return @ret; } sub MakeUrl( $ ) { my ( @words ) = @_; @words = Jcode->new( @words )->utf8;#ここもついか my $url = 'http://www.google.co.jp/search';#/searchを取る $url .= '?'; my @data; push( @data, 'hl=ja&source=hp&biw=913&bih=510' ); my $word = join( ' ', @words ); $word = Jcode->new( $word )->utf8;#ここもついか $word =~ s/ /+/g; $word =~ s/(\W)/'%' . unpack('H2', $1)/eg; push( @data, '&q=' . $word . '&um=1&ie=UTF-8&source=og&sa=N&tab=wi' ); $url .= join( '&', @data ); $url = Jcode->new( $url )->utf8;#ここもついか return $url; } 1;
- kuroizell
- ベストアンサー率55% (95/170)
WWW::Mechanizeで $mech->get( "http://www.google.com/search?q=" . $search_word ); my @links = $mech->find_all_links( class => 'l' );
補足
因みに、Perlは基本的な文法は勉強したのみで初心者です。 せっかく、回答いただいても理解できないので補足していただけると助かるのですが。 まことに恐縮ですが、宜しくお願いします。
お礼
手動でpmを設置しましたが、やはり上手く動かないためLWP::UserAgentで一つずつ作っていくことにしました。いろいろ教えていただきありがとうございました。
補足
TreeBuilderも入ってないようです。私はライトプランなのでsshが使えないためソフトをインストールすることができません。 当面、最初のやり方で頑張るしかなさそうです。