Linuxゲリラ戦記

画像収集無理むりむりむりかたつむり。

73.画像収集あきらめた

ナックス「こんにちは。今日は『あきらめた』話です」

デビー君「あきらめた話!?」

ナックス「私が画像収集スクリプト作成の解説用に作成したサイトへそブルー - 画像検索サイトですが、Bing Image Search APIを使用して作成しています。」

ナックス「ですが、このAPIは無料で使うのに制限があって、一ヶ月につき1000回しか検索できません」

デビー君「へー」

ナックス「で、現状へそブルーで画像検索できるのが一ヶ月につき、3、4日!!」

デビー君「!!」

ナックス「画像収集スクリプトの解説をする前に、そもそも画像検索サイトとして使えない……!!」

ナックス「たぶん『自力で画像収集スクリプトを作成した人が使用している』のと、『普通に画像検索サイトとして使用している人』がいると思うんだよね。で、すぐに月1000回の検索制限にひっかかって検索できなくなる、と」

デビー君「へー」

ナックス「ちなみに、今グーグルで『へそブルー』っていう検索キーワードで検索すると、検索結果で『パンチラ』っていうワードが表示されています」

デビー君「闇が深い……!」

ナックス「少し前までは『スクール水着』っていうワードが表示されていました」

デビー君「闇が深い……!」

ナックス「本当はグーグル画像検索が使用できなくなった分をこっちでカバーしようと思ったのにできない……」

ナックス「人生はままならない……」

デビー君「『人』生?ナックスって人なの?」

ナックス「……ペン生はままならない……」

デビー君「『ペン』生?ナックスってペンギンなの?普通、ペンギンは喋らないし、ツノも生えていないよ?」

ナックス「私は何者だ!?」

デビー君「知らないよ!!」

ナックス「というわけで、これ以上画像収集に固執しても、ちっとも解説が進まないので、すっぱり諦めます」

デビー君「残念」

ナックス「ただし、以前のGoogle APIの画像収集スクリプト作成の42番から52番のすべてのページに補足を追加し、学習に問題が無いようにしました。Google APIの学習が、API使用できなくて、飛ばしたわ、っていう人はもう一回見てみてね。」

ナックス「また、へそブルー - 画像検索サイトに関しては、あなたが自分で頑張ってへそブルーを使用して画像収集スクリプトを作成してよいものとします」

デビー君「え、いいの?」

ナックス「いいよ。ただし、一定期間内に、一定の回数以上画像検索を使用すると、Bing APIの利用制限に引っかかるので、趣味で画像収集スクリプトを作成して使用するのにとどめて、あんまり第三者に提供するような本格的なプログラムを作るのはやめてね。また、へそブルーのソースコードを公開したので(へそブルー-画像検索サイトのソースコード)、PHP言語が使用できる人は、へそブルーを使うのではなく、直にBing APIを使用することにも挑戦してみてね」

ナックス「というわけで、次回からはプログラミング言語のひとつ、C言語をしようと思う(74.今日からC言語。gccというコンパイラをインストールしよう)」

デビー君「しーげんご?」

補足

自力で画像収集プログラムを作成するヒント

2018/1/14現在、当時と異なるAPIを使用して画像検索を実現しているため、へそブルーのアドレスの形式が変更されています。例えば「ネコ」という検索キーワードで検索した場合、1ページ目のアドレスは「http://www.heso.blue/?text=%E3%83%8D%E3%82%B3&max_id=1」のように、max_idには常に1が設定されますが、2ページ目以降は「http://www.heso.blue/?text=%E3%83%8D%E3%82%B3&max_id=952394065558958079」のように、max_idに謎の数字が設定され、しかもこの数字は一定ではありません。

というわけで、画像収集プログラムの作り方のヒントを話そう

まずは、検索結果1ページ目の画像を全て収集するプログラムを作成してみてください。例えば

$ wget http://www.heso.blue/?text=[URLエンコードされた検索キーワード]&max_id=1

のようにすれば、1ページ目の情報を取得できます。このページの画像を収集するにはは68.Vimによるファイル内検索で解説したようにimgタグで指定した各画像パスに対してwgetを使用します。例えば、wgetで取得したファイル内の

<li><a href="https://twitter.com/snowatary/status/952362417106792448/photo/1"><img src="http://pbs.twimg.com/media/DTd4KO2UQAA_UTu.jpg"></a></li>

となっているような箇所のhttp://pbs.twimg.com/media/DTd4KO2UQAA_UTu.jpgに対してwgetを実行します。

$ wget http://pbs.twimg.com/media/DTd4KO2UQAA_UTu.jpg

それを全てのimgタグに対して行うことで1ページ目の全ての画像が取得できます。作り方に関しては、以前GoogleのAPIを使用して画像収集スクリプトを作成したものを参考にしてください。また、全然異なる自分流の作り方をしても構いません。

2ページ目以降の画像を収集する前にひとつ注意点があります。現在、へそブルーではTwitter APIを使用しているのですが、結構永遠に次のページにいけます。「よっしゃ、じゃあたくさん画像を収集できるぞ!」と思うかもしれませんが、一定期間内にAPIを使用できる回数が決まっています。へそブルーでは、一ページ画像検索結果を表示するたびに、一回Twitter APIを使用します(一回 wget http://www.heso.blue/?〜 を実行するたびに一度APIが実行されます)。へそブルーのサイトは、あなた以外の人も画像収集プログラムの作成に使用します。そのため、あなたが永遠に画像を収集するプログラムを作成した場合にすぐにAPIを使用できる回数の上限に達して、画像が検索できなくなり、皆から「へいへいへーい」と思われます。そのため画像収集プログラムで取得して良いページは一度画像収集スクリプトを実行した場合、最高で25ページ目までの情報を取得するということにしましょう。

つまり、あなたは25ページ目で画像収集を終了するようプログラムを作成しなければなりません。そこだけ注意してください。

さて、最初の1ページ目

$ wget http://www.heso.blue/?text=[URLエンコードされた検索キーワード]&max_id=1

で取得したファイルの中身の下の方を確認してみてください。

<li><a href="http://www.heso.blue/?text=[URLエンコードされた検索キーワード]&max_id=952392204051361791">次のページ</a></li>

という表示があると思います。これが次のページへのアドレスです。つまり、2ページ目を取得したい場合は、この情報を参考に

$ wget http://www.heso.blue/?text=[URLエンコードされた検索キーワード]&max_id=952392204051361791

とすることで次のページの情報を取得できます。これを繰り返せば、次々と次のページの情報を取得できます。ただし、先程も言いましたが、作成した画像収集スクリプトで取得するのは一度に最高25ページとしてください。

よし!以上のヒントできっと作れる!ガンバ!

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