LANG SELRCT

コードを書く場所についてはこちら

2017年12月12日火曜日

Custom Search APIで欲しい情報を抽出する

Custom Search APIをたたいて取得した検索結果を
スプレッドシートに書き出す例です


検索結果の最初の10件の title link snippet を抽出してシートに書き出します


書き出した結果


やってみる


Google Custom Search APIで検索結果を取得するで取得したように

https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CSE_ID&q=検索ワード

↑にAPI_KEY, CSE_IDを入れて
検索ワードを「栄養素」とすると以下のような結果が返って来ます

{
 "kind": "customsearch#search",
 "url": {
  "type": "application/json",
  "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
 },
 "queries": {
  "request": [
   {
    "title": "Google Custom Search - 栄養素",
    "totalResults": "1540000",
    "searchTerms": "栄養素",
    "count": 10,
    "startIndex": 1,
    "inputEncoding": "utf8",
    "outputEncoding": "utf8",
    "safe": "off",
    "cx": "CSE_ID"
   }
  ],
  "nextPage": [
   {
    "title": "Google Custom Search - 栄養素",
    "totalResults": "1540000",
    "searchTerms": "栄養素",
    "count": 10,
    "startIndex": 11,
    "inputEncoding": "utf8",
    "outputEncoding": "utf8",
    "safe": "off",
    "cx": "CSE_ID"
   }
  ]
 },
 "context": {
  "title": "Google"
 },
 "searchInformation": {
  "searchTime": 0.273824,
  "formattedSearchTime": "0.27",
  "totalResults": "1540000",
  "formattedTotalResults": "1,540,000"
 },
 "items": [
  {
   "kind": "customsearch#result",
   "title": "栄養素 - Wikipedia",
   "htmlTitle": "\u003cb\u003e栄養素\u003c/b\u003e - Wikipedia",
   "link": "https://ja.wikipedia.org/wiki/%E6%A0%84%E9%A4%8A%E7%B4%A0",
   "displayLink": "ja.wikipedia.org",
   "snippet": "栄養素(えいようそ、nutrient)とは、. (栄養学等)栄養のために摂取する物質を要素\nとして指す言葉。蛋白質、脂肪、炭水化物の三大栄養素のほかに、無機質、ビタミンなど\nを指す。 (生物学等)栄養のために摂取される物質。 生物学等では、「栄養素」と言うと、\n生物が代謝する目的で外界から吸収する物質のことを指している。栄養素は生体内で\n代謝され、生体内物質の原料やエネルギーを産生するのに利用されるとされる。 栄養学\n等では、上記の(生化学等での栄養素の他に)健康を維持するための食事由来の成分を\n含め ...",
   "htmlSnippet": "\u003cb\u003e栄養素\u003c/b\u003e(えいようそ、nutrient)とは、. (栄養学等)栄養のために摂取する物質を要素\u003cbr\u003e\nとして指す言葉。蛋白質、脂肪、炭水化物の三大\u003cb\u003e栄養素\u003c/b\u003eのほかに、無機質、ビタミンなど\u003cbr\u003e\nを指す。 (生物学等)栄養のために摂取される物質。 生物学等では、「\u003cb\u003e栄養素\u003c/b\u003e」と言うと、\u003cbr\u003e\n生物が代謝する目的で外界から吸収する物質のことを指している。\u003cb\u003e栄養素\u003c/b\u003eは生体内で\u003cbr\u003e\n代謝され、生体内物質の原料やエネルギーを産生するのに利用されるとされる。 栄養学\u003cbr\u003e\n等では、上記の(生化学等での\u003cb\u003e栄養素\u003c/b\u003eの他に)健康を維持するための食事由来の成分を\u003cbr\u003e\n含め ...",
   "cacheId": "3Ut4C2sD0UAJ",
   "formattedUrl": "https://ja.wikipedia.org/wiki/栄養素",
   "htmlFormattedUrl": "https://ja.wikipedia.org/wiki/\u003cb\u003e栄養素\u003c/b\u003e",
   "pagemap": {
    "metatags": [
     {
      "referrer": "origin-when-cross-origin"
     }
    ]
   }
  },
...2件目以降省略


この中の items に検索結果の最初の10件が入っているので
今回はそれらの title と link と snippet を抽出して
シートに書き出すコードの例を書きました


コード.gs
var API_KEY = "取得したAPI KEY";
var CSE_ID = "取得したCSE ID";
var BASE_URL = "https://www.googleapis.com/customsearch/v1?key=";
var PARAM1 = "&cx=";
var PARAM2 = "&q=";

function get_data() {
  var query = "栄養素";
  var url = BASE_URL + API_KEY + PARAM1 + CSE_ID + PARAM2 + query;
  var fetch = UrlFetchApp.fetch(url).getContentText();
  var obj = JSON.parse(fetch);
  var items = obj["items"];
  var array = [];
  for (var i = 0; i < items.length; i++) {
    var title = items[i]["title"];
    var link = items[i]["link"];
    var snippet = items[i]["snippet"];
    array.push([title, link, snippet])
  }
  set_values(array);
}

function set_values(array){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sh.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}
意訳
API_KEYを設定する
CSE_IDを設定する
BASE_URLは"https://www.googleapis.com/customsearch/v1?key="
PARAM1は"&cx="
PARAM2は "&q="

この処理は以下を実行する
検索キーワードを決める(例では栄養素)
urlにBASE_URL + API_KEY + PARAM1 + CSE_ID + PARAM2 + queryを入れて
結果を取得する
JSON 文字列をオブジェクトに変換して
itemsを取得する
結果を入れるarrayという入れ物を用意する
itemsの数だけ以下を繰り返す
titleを取得して
linkを取得して
snippetを取得して
arrayに入れて

set_valuesに渡す


この処理は以下を実行する
開いているシートを取得して
データの入っている最終行を取得して
その次の行を入力を開始する行に設定して
入力を開始する列を設定する(例では1列目を指定)
入力する行数はarrayの長さから取得して
入力する列数はarrayの中の1行内のデータ数を取得して
入力を開始する行, 入力を開始する列, 入力する行数, 入力する列数で範囲を指定して
arrayのデータを入力する