10秒目をつむったら…

皆様いつもお世話になっております。

今日はperlでLWP::UserAgentを使って、google検索結果を得ようとしたところで、岩に躓いて肘の骨に皹が入った点で質問させていただきます。

googleで「asd」と検索するとURLは
http://www.google.co.jp/#q=asd
となりますが、#ってのは、ページ内遷移などを主目的とした、クライアント、ブラウザ側がご自由に使ってくださいのパラメータの記述開始マークではないのですか?
まあ、これに従ったとして、
http://www.google.co.jp/#q=asd
を、perlのLWP::UserAgentを使って、
----
my $ua = LWP::UserAgent->new;
$ソース = $ua->get("http://www.google.co.jp/#q=asd"); # googleのトップページの検索結果が返る
----
と投げてみましたところ、Google ☆ト ッ プ ペ ー ジ☆ のソースが返ってくるのです。
Yahoo!ではasdと検索すると?がついて「http://search.yahoo.co.jp/search?p=asd」となるし、perlで同じ文字列をリクエストするとちゃんと検索結果が返ってくるので、googleの仕様がおかしいのではないか?というのが、私の推測群の現在の最有力候補であります。
----
my $ua = LWP::UserAgent->new;
$ソース = $ua->get("http://search.yahoo.co.jp/search?p=asd"); # asdの検索結果が返る
----

ちなみにですが、googleを?を使って
http://www.google.co.jp/?q=asd
と、ブラウザURL欄に入力しEnterを押すと、Googleトップページがテキストボックスに「asd」と入力された状態で表示されます。

この現象を説明していただける方がいらっしゃいましたら、どうかよろしくお願い致します。m(_ _)m

-- 環境情報
ブラウザ IE10
OS Windows7
--

A 回答 (4件)

Googleは、Web検索を外部プログラマが利用できるよう、Google Web APIを公開しています。


このAPIは制限があり、一日1000クエリまで、検索結果もGoogleの検索サイトと少し異なるようです。

この問題を回避するため、Google検索にクエリを投げてHTMLを解析しようとすることがありますが、(Googleの)ライセンス違反の恐れが高いですし(他人のコンテンツをキャッシュしてビジネスしてるのに)、検索結果のHTML自体が頻繁に内容が変わって解析できなくなってしまうことがあります。

本音と建前が出てしまいますが、冒頭が回答になります。
    • good
    • 0
この回答へのお礼

hirotn様、再びありがとうございます。
なるほど、クエリーを投げるためのAPIがあり、一日1000回までなんですね。
#を?にしてしまうと自由に検索結果を取得できてAPIを利用する意味がない=>Googleのビジネスが成立しない、商品(コンテンツまたはそれをキャッシュしたもの)の提供者としての"世界の管理人たち"に対してGoogleがライセンス違反?したということになりかねないという解釈でよいしょうか。
勉強になりました。ありがとうございましたm(_ _)m
結局プログラムにはYahoo!の検索結果を用いましたが、機会があればGoogleAPIに手を出そうと思います!

お礼日時:2013/06/08 01:34

#q=xxxxxxxx は、jQueryからみかと。



以下URLが該当かと。
http://www.kaasan.info/archives/564

これを参考にソースを見てみると、こんな記述があって、知識不足なのでよくわかりませんが匂います。
location.hash.match("[#&]((q|fp)=|tbs=simg|tbs=sbi)")

とすると、URLを生成するだけではだめできちんとイベントが起きていないと、#q=xxxxxx表記による検索は実行されないと考えられます。?を使って記述するのではダメでしょうか?
    • good
    • 0
この回答へのお礼

hirotn様、ご回答ありがとうございます。
頂いた情報をもとに調べた結果、#以降をアンカーと呼ぶこと、javascriptでlocation.hashによってアンカーを取得できることを初めて知りました。
googleで検索キーワードを入力している最中に結果が随時表示される((1)おそらく頻出キーワードに限って(2)yahooにはこの機能はない)ところを見ると、おそらくhirotnさんの推測されるとおりjQueryか何かでajaxを使ってサーバーとやりとりをしていますね・・・

?を使った表記では、
ブラウザ:テキストボックスにキーワードが入力されたトップページが表示される
Perl:トップページのソースが返る
といった結果ですので、googleに関してはプログラム(javascriptを解析できないようなシンプルなもの)で検索結果を取得するのは無理か、骨が折れるものになるか、GoogleがAPIを出しているかも?ということでしょうな。。

とても勉強になりました。ありがとうございます。

お礼日時:2013/06/06 23:10

URI::Escapeは利用可能ですか?



http://search.cpan.org/dist/URI/URI/Escape.pm
http://homepage3.nifty.com/hippo2000/perltips/UR …

use URI::Escape;
$safe = uri_escape("10% is enough\n");
$verysafe = uri_escape("foo", "\0-\377");
$str = uri_unescape($safe);
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
日本語ならescapeするつもりです。
今回google検索結果のurlとそのurl中パラメータが#で区切られていてしかもそのURLでHTTPリクエストを投げるとトップページのソースが返るので悩んでいます。
エンコ・デコに関しては大丈夫です。

お礼日時:2013/06/06 22:40

Perlの#は、どういう意味でしたか?


$ソース = $ua->get("http://www.google.co.jp/#q=asd"); # googleのトップページの検索結果が返る
は、
$ソース = $ua->get("http://www.google.co.jp/
では??

>googleで「asd」と検索するとURLは
http://www.google.co.jp/#q=asd
となりますが、

 なりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
#はコメントアウトの 場 合 があります。
コメントアウト扱いになってたらまずエラーが出てますよね。

#は例外として""中の#と$後の#はコメントアウト扱いさません。

あと文末の「なりません」の意味がわかりません。

なんかすみません。何かご存知でしたらよろしくお願いいたします。

お礼日時:2013/06/06 22:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!