PythonでGoogleAdwordsAPIを使って検索ボリュームを出してみた

こちらは[ウェブクルー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/webcrew)の22日目の記事です。
昨日は、@morotinさんの「[サイトをリッチにするjQueryライブラリの紹介](https://qiita.com/morotin/items/7338753c7dc6ca066acf)」でした。

## はじめに
社内向けに外部データを活用したツールを開発しようと思い、
その一機能としてGoogleAdwordsAPIを使って検索ボリュームを出す仕組みを作りました。
この記事では振り返りを兼ねて、実装に至るまでの流れをまとめます。

APIを使う事前準備としての設定手順は「[最初のAPI呼び出しを実行する | Google Developers](https://developers.google.com/adwords/api/docs/guides/first-api-call?hl=ja)」を確認していただければと思います。

## 検索ボリュームを取得する
先に結果としてのコードから

```python3

from googleads import adwords

PAGE_SIZE = 100
offset = 0

def main(client, keywords):

	targeting_idea_service = client.GetService('TargetingIdeaService', version='v201710')

	selector = {
		'searchParameters':[
			{
				'xsi_type':'RelatedToQuerySearchParameter',
				'queries':keywords
			},
			{
				'xsi_type': 'LanguageSearchParameter',
				'languages': [{'id': '1005'}]
			},
			{
				'xsi_type': 'NetworkSearchParameter',
				'networkSetting':{
					'targetGoogleSearch':True,
					'targetSearchNetwork':False,
					'targetContentNetwork':False,
					'targetPartnerSearchNetwork':False
				}
			}
		],
		'ideaType':'KEYWORD',
		'requestType':'STATS',
		'requestedAttributeTypes':[
			'TARGETED_MONTHLY_SEARCHES'
		],
		'paging':{
			'startIndex':str(offset),
			'numberResults':str(PAGE_SIZE)
		}
	}
	page = targeting_idea_service.get(selector)
	if 'entries' in page:
		for result in page['entries']:
			attributes = {}
			for attributes in result['data']:
				attributes[attributes['key']] = getattr(attributes['value'], 'value', 0)
				print(attributes['TARGETED_MONTHLY_SEARCHES'])
	else:
		print('No keywords volume were found.')

if __name__ == '__main__':

	adwords_client = adwords.AdWordsClient.LoadFromStorage()
	keywords = ['テスト', 'hoge']
	main(adwords_client, keywords)

```
上記のコードプログラムを実行すると、キーワード「テスト、hoge」の年間（月別）の検索ボリュームを取得することができます。
[キーワード候補の取得](https://developers.google.com/adwords/api/docs/samples/python/optimization?hl=ja#get-keyword-ideas)のPythonサンプルコードをもとに作成しましたので、大枠はそちらをご覧ください。

## AdWordsAPIサービスの呼び出し
```python3

	targeting_idea_service = client.GetService('TargetingIdeaService', version='v201710')

```
検索ボリューム取得につかうのは最適化サービスの「_TargetingIdeaService_」です。
APIのバージョンは現時点（2017年12月）では「v201710」が最新ですね。
詳しくは[サポート終了と廃止のスケジュール](https://developers.google.com/adwords/api/docs/sunset-dates)を確認していただければと思います。

## パラメータの設定

```python3

'searchParameters':[
            {
                'xsi_type':'RelatedToQuerySearchParameter',
                'queries':keywords
            },
            {
                'xsi_type': 'LanguageSearchParameter',
                'languages': [{'id': '1005'}]
            },
            {
                'xsi_type': 'NetworkSearchParameter',
                'networkSetting':{
                    'targetGoogleSearch':True,
                    'targetSearchNetwork':False,
                    'targetContentNetwork':False,
                    'targetPartnerSearchNetwork':False
                }
            }
        ]

```
_RelatedToQuerySearchParameter_
キーワードはリスト形式で渡してあげれば、複数でも値を返してくれます。
1キーワードずつ渡すとすぐにAPIの利用制限にひっかかり、時間を空けないとデータを取得することができないようになります。

_LanguageSearchParameter_
公式のサンプルコードでは「1000」が記述されていますが、日本語は「1005」です。
他の言語は[Code and Formats](https://developers.google.com/adwords/api/docs/appendix/languagecodes)のLanguages欄にあるCSVをダウンロードして確認してください。

_NetworkSearchParameter_
今回は検索ネットワーク専用のキーワードに対してということとして「_targetGoogleSearch_」のみTrueとしています。


```python3

'ideaType':'KEYWORD',
'requestType':'STATS',
'requestedAttributeTypes':['TARGETED_MONTHLY_SEARCHES'],
'paging':{
	'startIndex':str(offset),
	'numberResults':str(PAGE_SIZE)
}

```

サンプルコードに書いてあるキーワード候補の取得との変更点は
_requestType_と_requestedAttributeTypes_になります。
STATSとすることによって過去の統計情報を取得し、
_TARGETED_MONTHLY_SEARCHES_で月間検索ボリュームを取得することができます。

最後の結果出力に関してはサンプルコードとほぼ変わりません。
_attributes['TARGETED_MONTHLY_SEARCHES']_
指定するKEYを変更しているだけです。

## まとめ
今回は検索ボリュームを取得するところまでといった単発的な利用時のコードを書きました。
毎回プログラムたたいて出力する分は上記で問題ないでしょう。
Webアプリとして使う際に注意すべきなのは、APIのレート制限とyamlファイルの読み込みですね。

私はキーワードは１つずつしか渡せないと思っていた（サンプルコードに引っ張られて。。。）ので、最初はすぐに制限に引っかかっていました。使い方にもよるかと思いますが、私と同じ過ちは繰り返して欲しくないのでリスト形式で渡すことをおすすめします。

あとyamlファイルは、[最初のAPI呼び出しを実行する | Google Developers](https://developers.google.com/adwords/api/docs/guides/first-api-call?hl=ja)で出てくるのですが、同じディレクトリにあれば気にしなくても動くのですが、違う場所におく場合にはパスを指定してあげると動きます。

明日は、@yurayuramenさんです。よろしくお願いいたします。

## 参考文献


- [最初のAPI呼び出しを実行する | Google Developers](https://developers.google.com/adwords/api/docs/guides/first-api-call?hl=ja)
- [ターゲット候補を生成する | AdWords API | Google Developers](https://developers.google.com/adwords/api/docs/guides/targeting-idea-service?hl=ja)

## 最後に
ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

[開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)
[フロントエンドエンジニアの募集](http://www.webcrew.co.jp/recruit/creative.html)
[データベースエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000023)