書籍検索 Google Books APIs 使ってみる + PHPでスクレイピング

3 min read読了の目安(約2800字

amazonの書籍検索が…

気がついたら使えなくなっていたので、Google Books APIs を使用し”書籍名”からイメージ画像などを取得するスクレイピングをしてみる。楽天の書籍APIも使ってみたがラノベ、なろう関係などはあんまりヒットしないみたい(笑)。

APIアクセス回数制限がある模様

Google Books APIのアクセス可能回数は1,000回/日です申請により緩和しれくれるそうなので事前に申請しておく(1,000回以上のアクセス課金は、いくらなのか?不明…)

アクセスサンプル

https://www.googleapis.com/books/v1/volumes?q=青の

こんな感じでブラウザから叩いてみる。とGoogleさんは「青の」の完全一致ではなく、気を利かしてくれているのか「青の」を含む書籍を取得してくるみたいです。公式ページをみると完全一致のパラメタはなさそうなので注意が必要みたい。
また結果については、デフォルト10件ヒットするみたいね。

なのでレスポンスの転送容量も考慮し1件の検索結果となるように調整してみる。

https://www.googleapis.com/books/v1/volumes?country=JP&maxResults=1&orderBy=relevance&q=オーバーロード

APIキーの指定は?

折角APIキーを取得したので指定してみます。Googleのガイドをみるとクライアント側でAPIキーを使用するとセキュリティ上あれや、これや。って書いてあるのと(クライアント側では OAuth使う)、今回はサーバサイドでのスクレイピングなので、GETメソッドに書いてみる。

https://www.googleapis.com/books/v1/volumes?country=JP&maxResults=1&orderBy=relevance&q=オーバーロード&key=作成したAPIキー

phpによるスクレイピング

こんな感じでURLを生成して

function MakeUrl($Keyword) {
  $baseurl               = 'https://www.googleapis.com/books/v1/volumes';
  $params                = array();
  $params['key']         = '作成したAPIキー';
  $params['maxResults']  = 1;
  $params['orderBy']     = 'relevance';
  $params['country']     = 'JP';
  $params['q']           = $Keyword;

  // パラメータの順序を昇順に並び替え
  ksort($params);

  // canonical string を作成
  $canonical_string = '';
  foreach ($params as $k => $v) {
    $canonical_string .= '&'.urlencode_rfc3986($k).'='.urlencode_rfc3986($v);
  }
  $canonical_string = substr($canonical_string, 1);

  // URL を作成
  $url = $baseurl.'?'.$canonical_string;

  return $url;
}

これ実行した結果をパースする。
欲しいのは、書籍の画像と書籍サンプルのURLとした場合とすると

function cURL_GetSite($url) {
  $MediumImage = '';
  $retArray = new stdClass();

  // 指定されたURL情報の取得
  $ch = curl_init( $url );
  curl_setopt($ch, CURLOPT_HEADER, FALSE);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
  $result = curl_exec($ch);
  curl_close($ch);

  // JSON情報パース
  $json = mb_convert_encoding($result, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

  // 画像URL, 検索ページの取得
  $retArray->thumbnail = '';
  $retArray->previewLink = '';
  $retArray->ResultXML = $result;

  $obj = json_decode($json, true);
  $obj2 = $obj["items"][0];

  $retArray->thumbnail = $obj2["volumeInfo"]["imageLinks"]["thumbnail"];
  $retArray->previewLink = $obj2["volumeInfo"]["previewLink"];

  return $retArray;
}

簡単な使い方としては

$make_url = MakeUrl('オーバーロード');    // スクレイピングURL作成
$resultArray = cURL_GetSite($make_url);   // 問い合わせ
echo $resultArray->thumbnail;
echo $resultArray->previewLink;

結果は、SQLite にでも格納しておくとかすれいいよね。
割と簡単にできた。とりあえず個人で使う分にはいい感じ。