Linuxゲリラ戦記

"友達になってください"というクエリを投げました。レスポンスが返って来ません。コミュニケーション能力という名のネットワークの障害だと思います。でも、ネットワークが直っても、エラーコードが返ってくるだけな気もします。

アイキャッチ

45.Google画像検索API。返ってきた結果を解読しよう。

ナックス「ひやっはーっ!!愚かなイタリア人よ!!美女と共にスパゲッティの波で溺れ死ね!!」

デビー君「…………」

ナックス「──はい!私の一発ギャグでデビー君が大爆笑してくれた所で、今回はGoogle検索APIの結果の解説です」

デビー君「はーい」

ナックス「まずは前回作成したseiri.txtをもう一度見てみましょう」

ナックス「──と思ってnanoで開こうとしたら、パーミッションの読み取り許可が無くてちょっとビックリしました。皆さんは、もしそんなことがあったら29.ファイルのアクセス権限を変更しよう。chmodコマンドとか見ながら読み取り権限をつけてね」

ナックス「というわけで、中身はこんなのになってました」

{"responseData": {"results":[{"GsearchResultClass":"GimageSearch"
"width":"450"
"height":"651"
"imageId":"2Fd-Y5-ClsyueM:"
"tbWidth":"95"
"tbHeight":"138"
"unescapedUrl":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"url":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"visibleUrl":"www.hoax-slayer.com"
"title":"Strongest \u003cb\u003eDog\u003c/b\u003e In The World Photograph"
"titleNoFormatting":"Strongest Dog In The World Photograph"
"originalContextUrl":"http://www.hoax-slayer.com/strongest-dog.shtml"
"content":"Real \u003cb\u003edog\u003c/b\u003e - Description"
"contentNoFormatting":"Real dog - Description"
"tbUrl":"http://images.google.com/images?q\u003dtbn:2Fd-Y5-ClsyueM::www.hoax-slayer.com/images/worlds-strongest-dog.jpg"}
{"GsearchResultClass":"GimageSearch"
"width":"600"
"height":"530"
"imageId":"ENH8mUtG9B1SEM:"
"tbWidth":"135"
"tbHeight":"119"
"unescapedUrl":"http://www.harlemfur.com/images/Dog_Olive.jpg"
"url":"http://www.harlemfur.com/images/Dog_Olive.jpg"
"visibleUrl":"www.harlemfur.com"
"title":"\u003cb\u003eDogs\u003c/b\u003e Archives"
"titleNoFormatting":"Dogs Archives"
"originalContextUrl":"http://www.harlemfur.com/dogs/"
"content":"This note below is from a \u003cb\u003edog\u003c/b\u003e"
"contentNoFormatting":"This note below is from a dog"
"tbUrl":"http://images.google.com/images?q\u003dtbn:ENH8mUtG9B1SEM::www.harlemfur.com/images/Dog_Olive.jpg"}
{"GsearchResultClass":"GimageSearch"
"width":"400"
"height":"366"
"imageId":"Z9TvdKv9YWdDOM:"
"tbWidth":"124"
"tbHeight":"113"
"unescapedUrl":"http://www.petwise.co.za/content/dog-best-friend-1.jpg"
"url":"http://www.petwise.co.za/content/dog-best-friend-1.jpg"
"visibleUrl":"www.petwise.co.za"
"title":"petwise."
"titleNoFormatting":"petwise."
"originalContextUrl":"http://www.petwise.co.za/live/content.php?Item_ID\u003d1311"
"content":"Are \u003cb\u003edogs\u003c/b\u003e humankind\u0026#39;s best"
"contentNoFormatting":"Are dogs humankind\u0026#39;s best"
"tbUrl":"http://images.google.com/images?q\u003dtbn:Z9TvdKv9YWdDOM::www.petwise.co.za/content/dog-best-friend-1.jpg"}
{"GsearchResultClass":"GimageSearch"
"width":"390"
"height":"358"
"imageId":"Qzr608AiE4BrSM:"
"tbWidth":"123"
"tbHeight":"113"
"unescapedUrl":"http://www.gan.ca/images/hooks/dog.bmp"
"url":"http://www.gan.ca/images/hooks/dog.bmp"
"visibleUrl":"www.gan.ca"
"title":"Global Action Network: Animals: \u003cb\u003eDogs\u003c/b\u003e"
"titleNoFormatting":"Global Action Network: Animals: Dogs"
"originalContextUrl":"http://www.gan.ca/animals/dogs.en.html"
"content":"A \u003cb\u003edog\u003c/b\u003e"
"contentNoFormatting":"A dog"
"tbUrl":"http://images.google.com/images?q\u003dtbn:Qzr608AiE4BrSM::www.gan.ca/images/hooks/dog.bmp"}]
"cursor":{"pages":[{"start":"0"
"label":1}
{"start":"4"
"label":2}
{"start":"8"
"label":3}
{"start":"12"
"label":4}
{"start":"16"
"label":5}
{"start":"20"
"label":6}
{"start":"24"
"label":7}
{"start":"28"
"label":8}]
"estimatedResultCount":"177000000"
"currentPageIndex":0
"moreResultsUrl":"http://www.google.com/images?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003ddog"}}
 "responseDetails": null
 "responseStatus": 200}

ナックス「さて、皆さんの中には『これと微妙にデータが違う』っていう方もいるかと思われますが、そんなのは当然です。これはGoogle画像検索の結果です。検索結果なんてのは日々更新されているので、しょっちゅうデータが変わります」

ナックス「でも、今回はデータの見方の解説なので、データその物は違っていても大丈夫です」

ナックス「というわけでね。とりあえずクラス リファレンス - Google AJAX Search API - Google Codeを軽く見てみたんですよね。見方の解説が載ってないかなー、みたいなね。軽い期待を込めて」

ナックス「でも、おそらく載ってないんですよね」

デビー君「恐らく?」

ナックス「そうなんですよねー。説明がかすってる……?いや、これはjavascriptとしての説明……?うーん……?みたいなね。そんな微妙感」

ナックス「あと、今、めっちゃトイレ行きたいんですよね」

デビー君「いや、聞いてないし」

ナックス「まぁでもね。私の長年の経験と勘と、微妙にかすってる説明を組み合わせればちゃちゃっと解説できますよ、みたいなね」

デビー君「うわー。あやしい」

ナックス「めっちゃトイレに行きたいしね」

デビー君「じゃあ、とりあえずトイレいきなよ」

ナックス「いや、今トイレに行くと敗北を認めたことになるじゃないですか?」

デビー君「誰に?」

ナックス「ナックスという名の己れ自身に」

デビー君「いや、誰もそんなこと思わないから、トイレ行ってきなよ」

ナックス「えー。でも、今トイレ言ったら、みんな陰でこっそり『うわー。あいつ説明放り出してトイレ行きやがった』みたいな空気になるじゃないですか」

デビー君「ならないよ」

ナックス「えー。でも、そこはペンギン代表として、人間に舐められるのは──」

デビー君「あー!!もうどうでもいいよ!!じゃあトイレは後でいいから解説してよ!!」

ナックス「……あれ?もしかしてデビー君、キレてます?」

デビー君「そういうのいいから!!いらないから!!」

ナックス「はいはい、じゃあちゃちゃっと解説しましょう。まず、上の結果の最初の方」

{"responseData": {"results":[{"GsearchResultClass":"GimageSearch"
"width":"450"
"height":"651"
"imageId":"2Fd-Y5-ClsyueM:"
"tbWidth":"95"
"tbHeight":"138"
"unescapedUrl":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"url":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"visibleUrl":"www.hoax-slayer.com"
"title":"Strongest \u003cb\u003eDog\u003c/b\u003e In The World Photograph"
"titleNoFormatting":"Strongest Dog In The World Photograph"
"originalContextUrl":"http://www.hoax-slayer.com/strongest-dog.shtml"
"content":"Real \u003cb\u003edog\u003c/b\u003e - Description"
"contentNoFormatting":"Real dog - Description"
"tbUrl":"http://images.google.com/images?q\u003dtbn:2Fd-Y5-ClsyueM::www.hoax-slayer.com/images/worlds-strongest-dog.jpg"}
{"GsearchResultClass":"GimageSearch"
"width":"600"
"height":"530"
"imageId":"ENH8mUtG9B1SEM:"
"tbWidth":"135"
"tbHeight":"119"
"unescapedUrl":"http://www.harlemfur.com/images/Dog_Olive.jpg"
"url":"http://www.harlemfur.com/images/Dog_Olive.jpg"
"visibleUrl":"www.harlemfur.com"
"title":"\u003cb\u003eDogs\u003c/b\u003e Archives"
"titleNoFormatting":"Dogs Archives"
"originalContextUrl":"http://www.harlemfur.com/dogs/"
"content":"This note below is from a \u003cb\u003edog\u003c/b\u003e"
"contentNoFormatting":"This note below is from a dog"
"tbUrl":"http://images.google.com/images?q\u003dtbn:ENH8mUtG9B1SEM::www.harlemfur.com/images/Dog_Olive.jpg"}
{"GsearchResultClass":"GimageSearch"
"width":"400"
"height":"366"
"imageId":"Z9TvdKv9YWdDOM:"
"tbWidth":"124"
"tbHeight":"113"
"unescapedUrl":"http://www.petwise.co.za/content/dog-best-friend-1.jpg"
"url":"http://www.petwise.co.za/content/dog-best-friend-1.jpg"
"visibleUrl":"www.petwise.co.za"
"title":"petwise."
"titleNoFormatting":"petwise."
"originalContextUrl":"http://www.petwise.co.za/live/content.php?Item_ID\u003d1311"
"content":"Are \u003cb\u003edogs\u003c/b\u003e humankind\u0026#39;s best"
"contentNoFormatting":"Are dogs humankind\u0026#39;s best"
"tbUrl":"http://images.google.com/images?q\u003dtbn:Z9TvdKv9YWdDOM::www.petwise.co.za/content/dog-best-friend-1.jpg"}
{"GsearchResultClass":"GimageSearch"
"width":"390"
"height":"358"
"imageId":"Qzr608AiE4BrSM:"
"tbWidth":"123"
"tbHeight":"113"
"unescapedUrl":"http://www.gan.ca/images/hooks/dog.bmp"
"url":"http://www.gan.ca/images/hooks/dog.bmp"
"visibleUrl":"www.gan.ca"
"title":"Global Action Network: Animals: \u003cb\u003eDogs\u003c/b\u003e"
"titleNoFormatting":"Global Action Network: Animals: Dogs"
"originalContextUrl":"http://www.gan.ca/animals/dogs.en.html"
"content":"A \u003cb\u003edog\u003c/b\u003e"
"contentNoFormatting":"A dog"
"tbUrl":"http://images.google.com/images?q\u003dtbn:Qzr608AiE4BrSM::www.gan.ca/images/hooks/dog.bmp"}]

ナックス「これの{"GsearchResultClass" 〜 }が、検索結果で出てきたたくさんの画像の一つ一つの情報です。つまり、今取り出した箇所では4つの画像の情報が書かれている事になります」

デビー君「え?この文字だらけの中に画像の情報があるの?それも4つも?」

ナックス「そうです。上記を分かりやすくすると」

{"responseData": {"results":[
----- ここから一つ目の画像の情報 -----
{"GsearchResultClass":"GimageSearch"
"width":"450"
"height":"651"
"imageId":"2Fd-Y5-ClsyueM:"
"tbWidth":"95"
"tbHeight":"138"
"unescapedUrl":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"url":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"visibleUrl":"www.hoax-slayer.com"
"title":"Strongest \u003cb\u003eDog\u003c/b\u003e In The World Photograph"
"titleNoFormatting":"Strongest Dog In The World Photograph"
"originalContextUrl":"http://www.hoax-slayer.com/strongest-dog.shtml"
"content":"Real \u003cb\u003edog\u003c/b\u003e - Description"
"contentNoFormatting":"Real dog - Description"
"tbUrl":"http://images.google.com/images?q\u003dtbn:2Fd-Y5-ClsyueM::www.hoax-slayer.com/images/worlds-strongest-dog.jpg"}
----- 一つ目の画像の情報ここまで -----

----- ここから二つ目の画像の情報 -----
{"GsearchResultClass":"GimageSearch"
"width":"600"
"height":"530"
"imageId":"ENH8mUtG9B1SEM:"
"tbWidth":"135"
"tbHeight":"119"
"unescapedUrl":"http://www.harlemfur.com/images/Dog_Olive.jpg"
"url":"http://www.harlemfur.com/images/Dog_Olive.jpg"
"visibleUrl":"www.harlemfur.com"
"title":"\u003cb\u003eDogs\u003c/b\u003e Archives"
"titleNoFormatting":"Dogs Archives"
"originalContextUrl":"http://www.harlemfur.com/dogs/"
"content":"This note below is from a \u003cb\u003edog\u003c/b\u003e"
"contentNoFormatting":"This note below is from a dog"
"tbUrl":"http://images.google.com/images?q\u003dtbn:ENH8mUtG9B1SEM::www.harlemfur.com/images/Dog_Olive.jpg"}
-----二つ目の画像の情報ここまで -----

-----三つ目の画像の情報ここから -----
{"GsearchResultClass":"GimageSearch"
"width":"400"
"height":"366"
"imageId":"Z9TvdKv9YWdDOM:"
"tbWidth":"124"
"tbHeight":"113"
"unescapedUrl":"http://www.petwise.co.za/content/dog-best-friend-1.jpg"
"url":"http://www.petwise.co.za/content/dog-best-friend-1.jpg"
"visibleUrl":"www.petwise.co.za"
"title":"petwise."
"titleNoFormatting":"petwise."
"originalContextUrl":"http://www.petwise.co.za/live/content.php?Item_ID\u003d1311"
"content":"Are \u003cb\u003edogs\u003c/b\u003e humankind\u0026#39;s best"
"contentNoFormatting":"Are dogs humankind\u0026#39;s best"
"tbUrl":"http://images.google.com/images?q\u003dtbn:Z9TvdKv9YWdDOM::www.petwise.co.za/content/dog-best-friend-1.jpg"}
----- 三つ目の画像の情報ここまで -----

----- 四つ目の画像の情報ここから -----
{"GsearchResultClass":"GimageSearch"
"width":"390"
"height":"358"
"imageId":"Qzr608AiE4BrSM:"
"tbWidth":"123"
"tbHeight":"113"
"unescapedUrl":"http://www.gan.ca/images/hooks/dog.bmp"
"url":"http://www.gan.ca/images/hooks/dog.bmp"
"visibleUrl":"www.gan.ca"
"title":"Global Action Network: Animals: \u003cb\u003eDogs\u003c/b\u003e"
"titleNoFormatting":"Global Action Network: Animals: Dogs"
"originalContextUrl":"http://www.gan.ca/animals/dogs.en.html"
"content":"A \u003cb\u003edog\u003c/b\u003e"
"contentNoFormatting":"A dog"
"tbUrl":"http://images.google.com/images?q\u003dtbn:Qzr608AiE4BrSM::www.gan.ca/images/hooks/dog.bmp"}
----- 四つ目の画像の情報ここまで -----
]

デビー君「おお!!ちょっと分かる気がしてきた」

ナックス「そうですね。とりあえず一つ目の画像の情報を詳しく見ていきましょう」

{"GsearchResultClass":"GimageSearch"
"width":"450"
"height":"651"
"imageId":"2Fd-Y5-ClsyueM:"
"tbWidth":"95"
"tbHeight":"138"
"unescapedUrl":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"url":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"visibleUrl":"www.hoax-slayer.com"
"title":"Strongest \u003cb\u003eDog\u003c/b\u003e In The World Photograph"
"titleNoFormatting":"Strongest Dog In The World Photograph"
"originalContextUrl":"http://www.hoax-slayer.com/strongest-dog.shtml"
"content":"Real \u003cb\u003edog\u003c/b\u003e - Description"
"contentNoFormatting":"Real dog - Description"
"tbUrl":"http://images.google.com/images?q\u003dtbn:2Fd-Y5-ClsyueM::www.hoax-slayer.com/images/worlds-strongest-dog.jpg"}

ナックス「さて。この画像の情報。一行にひとつ情報が書かれていると考えてください。見方は」

"何の情報か":"情報その物"

ナックス「です。というわけで、上からざっと解説していきます」

"GsearchResultClass":"GimageSearch"

ナックス「"GsearchResultClass"は、英語というよりはプログラム的なことを知らないと何となく意味は理解出来ないと思います。うーん……訳すなら"検索結果情報"でしょうか。というわけで、こんな感じの意味です」

"何の検索結果の情報か?":"画像検索"

ナックス「みたいな感じですね」

ナックス「次の」

"width":"450"
"height":"651"

ナックス「は簡単です」

"画像の横サイズ":"450"
"画像の縦サイズ":"651"

ナックス「です。ちなみに、サイズの単位はpx(ピクセル)です」

"imageId":"2Fd-Y5-ClsyueM:"

ナックス「は、画像を識別するための一意のIDです。多分、まったく同じ画像を何度も検索結果に出してしまうのを防ぐ的な感じだと思います。まったく同じIDだった場合は、その二つの画像は同じ画像、ということです」

"画像ID":"2Fd-Y5-ClsyueM:"
"tbWidth":"95"
"tbHeight":"138"

ナックス「は、画像本体ではなく、サムネイル画像のサイズです」

デビー君「サムネイル画像って何?」

ナックス「えーっと、画像のデータというのは実は結構重くて、古いパソコンで大きな画像を見ようとした場合、パソコンがフリーズしてしまう事があったりします。そんな時の為に、元のサイズの画像を縮小した画像を用意しておき、大きな画像そのものを見なくても、小さな画像で画像を楽しむ、みたいなことをする、その縮小した画像の名前を『サムネイル画像』と言います」

"サムネイル画像の横サイズ":"95"
"サムネイル画像の縦サイズ":"138"

ナックス「単位は同じくピクセルです。サムネイル画像は、他にも例えばGoogle画像検索でも登場します。画像をGoogle画像検索で検索してみると、ずらっと小さな画像が表示されますね?で、その画像をクリックすると、初めて実物の大きな画像が表示される。小さな画像の方が『サムネイル画像』と呼ばれる物です」

"unescapedUrl":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"

ナックス「は、エスケープ処理されていない画像アドレスです」

"エスケープ処理されていないアドレス":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"

デビー君「え?アドレスにもエスケープ処理があるの?URLエンコードとかのこと?」

ナックス「多分そうです」

"url":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"

ナックス「こちらは、エスケープ処理された普通の画像アドレスです」

"アドレス":"http://www.hoax-slayer.com/images/worlds-strongest-dog.jpg"
"title":"Strongest \u003cb\u003eDog\u003c/b\u003e In The World Photograph"
"titleNoFormatting":"Strongest Dog In The World Photograph"

ナックス「こちらは、画像があるサイトのタイトルですね」

"タイトル":"Strongest \u003cb\u003eDog\u003c/b\u003e In The World Photograph"
"装飾されていないタイトル":"Strongest Dog In The World Photograph"

デビー君「"装飾されていないタイトル"ってどういう意味?」

ナックス「htmlのタグを除去しています……。えーっと例えば、ウェブサイトでは文字が太字になったり色がついていたりすると思います。そのような装飾をするためにウェブサイトでは『タグ』という文字を書いているのです。Googleではそういうウェブサイトから情報を機械で抜き取っているわけですが、その時にタグ文字もついてきてしまっているのです。そのタグを除去した、装飾なしの文書、と言う意味です」

ナックス「まぁ、使うとしたら"装飾されていないタイトル"だなー、ぐらいな感じの理解で特に困らないかと思います」

"originalContextUrl":"http://www.hoax-slayer.com/strongest-dog.shtml"

ナックス「これは、その画像が置いてあるサイトのアドレスです」

"画像が置いてあるサイトのアドレス":"http://www.hoax-slayer.com/strongest-dog.shtml"
"content":"Real \u003cb\u003edog\u003c/b\u003e - Description"
"contentNoFormatting":"Real dog - Description"

ナックス「これは、軽く調べて見たところ、その画像があるサイトの、軽い紹介文みたいです」

"文書":"Real \u003cb\u003edog\u003c/b\u003e - Description"
"装飾されていない文書":"Real dog - Description"

ナックス「そして最後が」

"tbUrl":"http://images.google.com/images?q\u003dtbn:2Fd-Y5-ClsyueM::www.hoax-slayer.com/images/worlds-strongest-dog.jpg"

ナックス「サムネイル画像のアドレスです」

"サムネイル画像のアドレス":"http://images.google.com/images?q\u003dtbn:2Fd-Y5-ClsyueM::www.hoax-slayer.com/images/worlds-strongest-dog.jpg"

ナックス「と、一つの画像につき、これらの情報がずらっとあるわけですよ」

デビー君「でも、意外と理解できそう」

ナックス「でしょ?」

ナックス「次は下の方の解説ですが──」

"cursor":{"pages":[{"start":"0"
"label":1}
{"start":"4"
"label":2}
{"start":"8"
"label":3}
{"start":"12"
"label":4}
{"start":"16"
"label":5}
{"start":"20"
"label":6}
{"start":"24"
"label":7}
{"start":"28"
"label":8}]
"estimatedResultCount":"177000000"
"currentPageIndex":0
"moreResultsUrl":"http://www.google.com/images?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003ddog"}}
 "responseDetails": null
 "responseStatus": 200}

ナックス「えーっとまず大事なのはここの部分」

"cursor":{"pages":[{"start":"0"
"label":1}
{"start":"4"
"label":2}
{"start":"8"
"label":3}
{"start":"12"
"label":4}
{"start":"16"
"label":5}
{"start":"20"
"label":6}
{"start":"24"
"label":7}
{"start":"28"
"label":8}]

ナックス「見方は」

{"start":"0"
"label":1}

ナックス「です。」

ナックス「これは、一回のクエリにつきいくら情報が返ってきたか的な……うーん……」

デビー君「おーっと。ナックスが説明に困っています!」

ナックス「まぁ、まずは」

"start":"0"

ナックス「にだけ注目してみますか」

ナックス「今、一回『画像のデータくれー』とAPIにクエリを投げると、4つの画像のデータが返ってきてます」

デビー君「ほうほう」

ナックス「二つ目の」

{"start":"4"
"label":2}

ナックス「を見ると、startに4がセットされていますね」

デビー君「うん」

ナックス「これは一つ目のクエリで0〜3番目の4つの画像。2つ目のクエリで4〜7番目の4つの画像の情報が手に入る、と考えてください」

ナックス「うーん……そうだな。labelを、Google画像検索の検索結果のページと考えると良いかもしれません。つまり、1ページ目には0番目から始まる4つの画像が」

{"start":"0"
"label":1}

ナックス「2ページ目には4番目から始まる4つの画像が」

{"start":"4"
"label":2}

ナックス「3ページ目には8番目から始まる4つの画像が」

{"start":"8"
"label":3}

ナックス「みたいなことを表しているのですが……」

デビー君「うーん、なんとなく分かる」

ナックス「良かったです。ちなみにクラス リファレンス - Google AJAX Search API - Google Codeによると、クエリによって一度に返ってくる検索結果を変えられるそうです」

rsz=smal

ナックス「と指定すると、4つ。デフォルトの状態ですね。そして──」

rsz=large

ナックス「と指定すると、一度に8つのデータが返ってくるそうです」

ナックス「さらに、クエリによって何ページ目のデータを得るかを指定できます」

start=4

ナックス「とすると、startが4のページ……つまり、2ページ目のデータが得られる様です」

デビー君「え?startじゃなくてlabelでページは指定出来ないの?」

ナックス「ね。出来そうなのですが、解説には書いておらず。まぁ、頑張ればstart指定でもwhile文で一気に全ページの画像を取得することは出来ますので、共に頑張りましょう」

"estimatedResultCount":"177000000"

ナックス「の意味は」

"検索結果のおおよその画像数":"177000000"

ナックス「です」

デビー君「……え?」

ナックス「はい?」

デビー君「177000000個の画像がヒットしたってこと?」

ナックス「そうです。最終目標のエロ画像に向けて夢が広がる数字ですね」

デビー君「すごいなグーグル……」

"currentPageIndex":0
"moreResultsUrl":"http://www.google.com/images?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003ddog"}}
 "responseDetails": null
 "responseStatus": 200}

ナックス「の解説はざっくりと……」

"現在のページ":0
"もっと多くの検索結果のアドレス":"http://www.google.com/images?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003ddog"}}
 "レスポンス詳細": null
 "レスポンスステータス": 200}

ナックス「ですかね。ここら辺からかなり根拠が曖昧になるので、軽く聞き流してくれると嬉しいのですが、現在のページは、文字通り現在のページ。一番最初の0ページです」

デビー君「な、なんだかしっくりこない。一番最初のページって普通、0ページじゃなくて1ページじゃない?」

ナックス「はい。気持ちは分かります。が、プログラミングの世界では一番最初の数字は0、というのがメジャーです。1で始まるプログラミング言語もあるとは聞いていますが、全然マイナーです。というわけで諦めて慣れてください」

ナックス「"もっと多くの検索結果のアドレス"は、えーっと」

ナックス「Google画像検索を使ったときに検索結果が大量にあった場合、300個くらい画像が表示された後に『残りの画像も表示するかい?』みたいなボタンが表示される形式になっています。で、多分そのボタンが押された後の検索結果を表示しているGoogle画像検索のアドレスじゃないかと思ったりするわけです。つまり、今回は『dogというキーワードで検索した場合』のもの。が、根拠なし!」

ナックス「"レスポンスステータス"は、問題が起きずに正常な結果が返ってきた場合に200というコードを返すそうです。逆に、200以外の数字だと何か問題が起きた、と言う意味です」

ナックス「そして"レスポンス詳細"。ここは、何かエラーが起きた際に詳しいエラー情報が出るらしいです(恐らく英語で)。ちなみに、正常な場合はnullが返ってくるそうです」

デビー君「ヌルってなに?」

ナックス「nullとは、"データが無いよ"という意味です。プログラミングの世界ではnullの存在は常識なので、覚えておいて損は無いです」

ナックス「こうして見ると、while文でstartを指定してページを変えながら、画像のアドレスをwgetすると、意外と簡単にエロ画像は集められそうですね。というわけで次回──エロ画像収集シェルスクリプト作成に着手!!(46.画像収集プログラムの基本的な考え方を理解する。)」

ナックス「そしてオイラはトイレに駆け込む!!(緊急)」

デビー君「いってらっしゃーい」

このエントリーをはてなブックマークに追加