Help us understand the problem. What is going on with this article?

Googleトレンドを使いこなそう その2

More than 1 year has passed since last update.

はじめに

前回、超入門の「Googleトレンド」の使い方をやりました。
その2では、google-trends-apiをインストールして、特定のキーワードでGoogleトレンドの検索クエリvalueを取得してみたいと思います。
GoogleトレンドのAPIの結果はJSON形式で返却されます。
「まず、やってみよう!」です。

前提

  • OS : Windows7以上
  • PoweShellのターミナルで実行
  • VSCodeでコード編集
  • node.js環境構築済み
  • npmインストール済み

google-trends-apiのインストール

とりあえず、google-trends-apiをローカルにインストールします。
こんな感じでインストールできれば、OKです。

npm i  google-trends-api --save
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\~\Google> npm i google-trends-api
+ google-trends-api@4.9.0
added 100 packages from 100 contributors and audited 344 packages in 37.337s
found 1 high severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details


   ╭───────────────────────────────────────────────────────────────╮
   │                                                               │
   │      New major version of npm available! 5.6.0 -> 6.9.0       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v6.9.0   │
   │               Run npm install -g npm to update!               │
   │                                                               │
   ╰───────────────────────────────────────────────────────────────╯

段階的サンプルコードの1

検索ワードを「相撲」にしてみました。
検索条件をobjをとします。
relatedQueriesで関連キーワードを取得できます。
GooglトレンドがJSONで何を返すのか、まず調べてみます。
ソースファイル名を「sample1.js」で保存します。

項目 変数 説明
検索ワード serachword "相撲"
検索条件(obj) keyword serachword 検索ワードを設定
startTime "2019-01-01" 検索範囲の開始日
endTime "2019-10-01" 検索範囲の終了日
geo "JP" 検索地区を日本
hl "ja" 言語を日本語

<sample1.js>

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    console.log(json);
}).catch(err => {
    console.error(err);
});

<実行結果>

PS C:\Users\~\Google Trends> node sample1.js
{ default: { rankedList: [ [Object], [Object] ] } }

返却値として、defaultとその下位にrankedListがあることがわかります。

段階的サンプルコードの2

console.logの出力をjsonからjson.defaultに変えてみます。

<sample2.js>

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    console.log(json.default);
}).catch(err => {
    console.error(err);
});

<実行結果>

PS C:\Users\~\Google Trends> node sample2.js
{ rankedList: [ { rankedKeyword: [Array] }, { rankedKeyword: [Array] } ] }

rankedListの下位はrankedkeywordが配列(Array)で返却されるこがわかります。
二つのrankedkeywordが返却されるので、rankedList要素数が2となります。
つまり、json.default.rankedList.length=2ということがわかります。

npmのgoogle-trends-apidのrelatedQueriesの説明は下記となっています。

  • Top(人気) - 最も人気のある検索クエリ。 スコア付けは、100の値が最も一般的に検索されるクエリ、50が半分の頻度で検索されるクエリ、および0の値が最も一般的なクエリの1%未満の頻度で検索されるクエリです。
  • Rising(上昇中) - 最後の期間以降に検索頻度が最も増加したクエリ。 「ブレイクアウト」とマークされた結果は、おそらくこれらのクエリが新しく、以前の検索が(あったとしても)ほとんどなかったために、著しく増加しました。

答えを先に教えると、json.default.rankedList[0]はTopの値が設定されています。
json.default.rankedList[1]の値には、Risingの値が設定されます。

段階的サンプルコードの3

console.logの出力をjson.default.rankedList[0].rankedKeywordに変えて、Topを取得します。

<sample3.js>

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    console.log(json.default.rankedList[0].rankedKeyword);
}).catch(err => {
    console.error(err);
});

<実行結果>

PS C:\Users\~\Google Trends> node sample3.js
[ { query: '相撲 結果',
    value: 100,
    formattedValue: '100',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 場所',
    value: 27,
    formattedValue: '27',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A0%B4%E6%89%80&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 協会',
    value: 25,
    formattedValue: '25',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%8D%94%E4%BC%9A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 の 結果',
    value: 20,
    formattedValue: '20',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E3%81%AE+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 部屋',
    value: 18,
    formattedValue: '18',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E9%83%A8%E5%B1%8B&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 の 相撲',
    value: 17,
    formattedValue: '17',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E3%81%AE+%E7%9B%B8%E6%92%B2&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 速報',
    value: 16,
    formattedValue: '16',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E9%80%9F%E5%A0%B1&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 相撲 結果',
    value: 15,
    formattedValue: '15',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E7%9B%B8%E6%92%B2+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '日本 相撲 協会',
    value: 14,
    formattedValue: '14',
    hasData: true,
    link: '/trends/explore?q=%E6%97%A5%E6%9C%AC+%E7%9B%B8%E6%92%B2+%E5%8D%94%E4%BC%9A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 の 相撲 結果',
    value: 13,
    formattedValue: '13',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E3%81%AE+%E7%9B%B8%E6%92%B2+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '大相撲',
    value: 13,
    formattedValue: '13',
    hasData: true,
    link: '/trends/explore?q=%E5%A4%A7%E7%9B%B8%E6%92%B2&date=2019-01-1+2019-10-1&geo=JP' },
  { query: 'トランプ',
    value: 13,
    formattedValue: '13',
    hasData: true,
    link: '/trends/explore?q=%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97&date=2019-01-1+2019-10-1&geo=JP' },
  { query: 'トランプ 相撲',
    value: 12,
    formattedValue: '12',
    hasData: true,
    link: '/trends/explore?q=%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97+%E7%9B%B8%E6%92%B2&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 の 相撲 の 結果',
    value: 12,
    formattedValue: '12',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E3%81%AE+%E7%9B%B8%E6%92%B2+%E3%81%AE+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 取り',
    value: 11,
    formattedValue: '11',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%8F%96%E3%82%8A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 力士',
    value: 11,
    formattedValue: '11',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%8A%9B%E5%A3%AB&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 番付',
    value: 11,
    formattedValue: '11',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E7%95%AA%E4%BB%98&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 チケット',
    value: 10,
    formattedValue: '10',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E3%83%81%E3%82%B1%E3%83%83%E3%83%88&date=2019-01-1+2019-10-1&geo=JP' },
  { query: 'お 相撲 さん',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E3%81%8A+%E7%9B%B8%E6%92%B2+%E3%81%95%E3%82%93&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 夏 場所',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A4%8F+%E5%A0%B4%E6%89%80&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 大会',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A4%A7%E4%BC%9A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '火 ノ 丸 相撲 ネタバレ',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%81%AB+%E3%83%8E+%E4%B8%B8+%E7%9B%B8%E6%92%B2+%E3%83%8D%E3%82%BF%E3%83%90%E3%83%AC&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 大阪',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A4%A7%E9%98%AA&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 懸賞',
    value: 7,
    formattedValue: '7',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E6%87%B8%E8%B3%9E&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 ニュース',
    value: 7,
    formattedValue: '7',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&date=2019-01-1+2019-10-1&geo=JP' } ]

以下の要素を持つJSONが返却されます。

要素 説明
query クエリ 検索クエリの中身
value 0~100 1%~100%の検索クエリスコア
formattedValue '0'~'100' valueをシングルコーティションで括った
hasData true クエリの関連付け有無
link アドレス クエリのリンク先アドレス

段階的サンプルコードの4

取出したいのは、検索クエリvalueです。
Topからこの2要素を取出してみます。

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    for (let i = 0; i < json.default.rankedList[0].rankedKeyword.length; i++) {
        console.log(json.default.rankedList[0].rankedKeyword[i].query 
                    + "," + json.default.rankedList[0].rankedKeyword[i].value);
    } 
}).catch(err => {
    console.error(err);
});

<実行結果>

PS C:\Users\~\Google Trends> node sample4.js
相撲 結果,100
相撲 場所,29
相撲 協会,26
相撲 の 結果,22
相撲 部屋,20
相撲 速報,18
今日 の 相撲,17
大相撲,16
日本 相撲 協会,15
相撲 結果 今日,14
相撲 今日 の 結果,14
トランプ 相撲,14
相撲 トランプ,13
今日 の 相撲 の 結果,13
相撲 力士,12
トランプ,12
相撲 チケット,11
相撲 取り,11
相撲 動画,11
相撲 番付,10
相撲 優勝,9
相撲 夏 場所,9
お 相撲 さん,9
相撲 大会,9
相撲 ニュース,8

検索クエリの結果を見ると、「今日 の 相撲」と形態素解析がされているようです。
検索値として想定されるのは、「今日の相撲」ではないでしょうか?
とりあえず目標の検索クエリvalueを取得できました。
出力結果をコピーしてスプレッドシートに貼付けて色々と分析できそうです。

まとめ

ビックデータをどのように解析するのか?
という命題にふとこの頃突き当りました。
何か便利なツールはないか?
あったじゃないか、毎日使っている、それも億の世界中の人々がせっせと脇目もふらず、検索しまっくているサイトGoogleが提供しているGoogleトレンド
これだ、といわけで超簡単スクリプトで「相撲」に興味のある人の検索クエリを取得してみました。
そこで次回はこれから因果関係という謎の迷宮システムへの第一歩に踏み込みます。

宿題
「相撲と結果は因果関係が成り立ちます。」
なんのこと?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした