Chiroru's Diary

日々の学びをちょこちょこメモしていきます

Linux Google画像検索APIなど

学習内容

  • Linuxゲリラ戦記(39~52)
  • 新しいLinuxの教科書(238~247)

※「Google画像検索API」については参考サイトのAPIが使えなくなっていたので流れだけ参考に

目次

URLエンコードとURLデコードとクエリ

アドレスには日本語を使うことができない。 何か日本語をアドレスに使いたいときはURLエンコードという処理をすることで、アドレス対応の文字に変換する。

クエリは、一定形式の文字でwebサイトに必要な情報を要求することができる。
このクエリでデータを渡すときにURLエンコードする。

$  echo りんご | nkf -wMQ | tr = %
# nkfコマンドは文字化けを防ぐ、trコマンドは文字を変換・削除する

tr の使用例

tr <文字列1> <文字列2>

# 文字列1を文字列2に置き換える

URLデコードは、エンコードされた文字を元に戻すこと。

$  echo '%E2%A3%~' | tr % = | nkf -WwmQ 

参考:40Linuxのコマンドから行うURLエンコード、URLデコード

curlコマンド

ファイルをサーバーへ転送したり、サーバーからデータを入手するコマンド。
(※このコマンド自体はapiを叩くためだけのものではない。)

形式は以下。

curl <オプション> <URL>

このcurlにオプションを加えて偽装することでデータを取りに行ける。 形式は以下。

curl -e <アドレス>

参考:curlコマンドでapiを叩く
参考:42.GoogleのAPIをチラ見する。curlコマンド

wgetコマンド

ダウンロードするコマンド。

$ wget <オプション> URL  
# URLのファイルをダウンロードする

リトライの制限

エラー以外で画像が取得できない場合に何度も再取得に挑戦してしまうので
そこに回数制限をかける設定。

$ wget -t <回数>

ネットワークタイムアウト

指定した時間以内にネットワークの接続がうまくいかない場合に
タイムアウトする設定。

$ wget -T <時間>

参考:【 wget 】コマンド――URLを指定してファイルをダウンロードする

while文の注意点

シェルスクリプト内で繰り返し処理のwhile文を使い、情報をファイルに書き込んでいこうとしても 情報は上書きされてしまうため、一番最後の情報しか残らない。

この解決案として「追加書き込み>>」を利用する。

参考:43.Google画像検索API。クエリを作って欲しい情報をゲット

参考:44.Google画像検索API。返ってきた結果を整理する。catコマンド。trコマンド。リダイレクト

リダイレクト「>」

コマンドの結果を指定のファイルに書き込む

sedコマンド

行の削除、表示などの機能もあるがメインとして「置換」で使われる。

$ sed s/置換前文字列/置換後文字列/gフラグ

本来フラグは省略可能であるが、その場合行頭から最初の文字列しか置換されない。
gフラグをつけることで「見つかった全ての文字列を置換」する。

置換後の文字列を空にする=置換前文字列の削除。

参考:新しいLinuxの教科書(238~247)

Google画像検索API(※APIは使えなくなってるので流れだけ)

情報の要求方法

「クエリ」を利用して、APIに情報を要求することができる。
『標準 URL 引数』は全ての検索APIに共通のクエリの形式。

画像検索を行いたい場合

Google画像検索APIのベースは以下。

http://ajax.googleapis.com/ajax/services/search/images

そこに、検索式指定&APIバージョン指定&セーフサーチフィルタリングの指定&サイズ指定 を加えると以下のようになる。

http://ajax.googleapis.com/ajax/services/search/images?q=検索キーワード&v=1.0&safe=off&imgsz=xxlarge

参考:43.Google画像検索API。クエリを作って欲しい情報をゲット

画像収集シェルスクリプトを作成

1.curlコマンドでGoogle APIから画像情報を取得。

エンコードした文字を使ってgoogleAPIへ投げるクエリを作成する。

q=[(URLエンコードされた)検索キーワード]
v=[バージョン番号]
hl=[国コード]

http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja

一度に返ってくる検索結果の数を指定する

rsz=small(4件の結果が返ってくる)
rsz=large(8件の結果が返ってくる)

http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large

検索結果のページ番号を指定する(正確には、APIから返ってくる結果なのでページと言う概念は無い) 『開始インデックス(開始先頭位置)』という

start=開始インデックス
セーフサーチフィルタリング無効にするsafe=off

http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large&start=0&safe=off

完成形↓

$ curl -e http://www.my-ajax-site.com \
        'http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large&start=0&safe=off'

2.出力結果をパイプでつなげtrコマンドで整理し、grepコマンドで「url」と出力されている行だけ取り出す

$ curl -e http://www.my-ajax-site.com \
        'http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large&start=0&safe=off' \
| tr , \\n | grep "url"

3.画像アドレス以外の情報を空文字に置換

その画像アドレスのみが書かれているものを、リダイレクト(書き込み)する。

文字の置換sedコマンド

sed -e 's/置換前の文字/置換後の文字/g'

なので今回は

sed -e 's/"url"://g' -e 's/"//g'

4.wgetを使用し、アドレスからファイルを取得する

$ wget -i ファイル名

$ curl -e http://www.my-ajax-site.com \
        'http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large&start=0&safe=off' \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' > ファイル名

クリエの順序について

クエリは、a=aaaの組み合わせが重要なため、 http://●●.com?a=aaa&b=bbb&c=cccのとき ?以降の順番はとくに関係無し。

→http://●●.com?b=bbb&c=ccc&a=aaaでもOK

シェルスクリプトに検索キーワードを入れる

$1 というキーワードを使って受け取る。

<手順>
1.シェルスクリプトに記載
2.実行権限の付与$ chmod u+x <ファイル名>
3.キーワードを入れる

#!/bin/sh

keyword=$1
curl -e http://www.my-ajax-site.com \
        'http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large&start=0&safe=off' \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' > AAA.txt
wget -i ahaha.txt
rm ahaha.txt

↓keywordをURLエンコード

#!/bin/sh

keyword=$1
keyword=`echo $keyword | nkf -wMQ | tr = %`
curl -e http://www.my-ajax-site.com \
        'http://ajax.googleapis.com/ajax/services/search/images?q=%E5%A3%81%E7%B4%99&v=1.0&hl=ja&rsz=large&start=0&safe=off' \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' > AAA.txt
wget -i ahaha.txt
rm ahaha.txt

↓実際のAPIアドレスに入れる

#!/bin/sh

keyword=$1
keyword=`echo $keyword | nkf -wMQ | tr = %`
curl -e http://www.my-ajax-site.com \
        http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' > AAA.txt
wget -i ahaha.txt
rm ahaha.txt

参考:47.シェルスクリプトに引数をプレゼント