はじめに
前回、超入門の「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トレンド。
これだ、といわけで超簡単スクリプトで「相撲」に興味のある人の検索クエリを取得してみました。
そこで次回はこれから因果関係という謎の迷宮システムへの第一歩に踏み込みます。
宿題
「相撲と結果は因果関係が成り立ちます。」
なんのこと?