fbpx

AWSのLambdaでサジェストキーワードを取得する関数を作ってみた

弊社では記事作成を行う際にGoogleの検索結果に出てくるサジェストキーワードを利用しています。サジェストキーワードは外部のツールを使って取得することもできますが社内のシステムと繋ぎ込みを行いたかったのでAWSのLambdaを使って自前でGoogleのサジェストキーワードを取得する関数を作成してみました。

結論から言うとある程度のサジェストキーワードを網羅することができたのですが完璧に網羅するまでには至っていません。またどのくらい取得するとGoogleのAPIの制限がかかってしまうかは分かっていません。

前提編

実現したい機能のイメージ

  • 特定のキーワードを入力するとそれに対応するサジェストキーワードを出力してくれる
  • SON形式でデータの受け渡しを行う
  • できるだけ多くのサジェストキーワードを網羅する

開発環境

  • AWS Lambda
  • Python3.6

実行編

Ver 1.1 (とりあえずサジェストキーワードを取得する)

まずはサジェストキーワードをそのまま取得してみることにしました。やってみた結果は以下の通りです。

できたこと
キーワードに対応したキーワードが出てくる

問題点
取れるサジェストキーワードが少なすぎる

コード内容

import json
import requests
import re

#GoogleのAPIのURL
url = "http://www.google.com/complete/search"

#GoogleのAPIを叩く関数
def get_suggest(word,language="ja"):
    payload = {"hl":language,"q":word,"output":"toolbar"}
    data = requests.get(url, params=payload)
    xml = data.text
    pattern = r'<suggestion\sdata="(.*?)"/>'
    suggest_word_list = re.findall(pattern,xml)
    return suggest_word_list

#サジェストキーワードを取得する関数
def make_suggest(word):
    suggest_list = {}
    #キーワードを元にしたサジェスト
    main_suggest_list = get_suggest(word) 
    suggest_list[word] = main_suggest_list 
    return suggest_list

#Lamndaの関数の本体
def lambda_handler(event, context):
    result = make_suggest(event["word"])
    return {
        'statusCode': 200,
        #ここでensure_ascii=Falseを入れないと日本語のを入れた時に文字化けする
        'body': json.dumps(result,ensure_ascii=False)
    }

入力

{
  "word": "旅行"
}

出力結果

{
  "statusCode": 200,
  "body": "{\"旅行\": [\"旅行\", \"旅行 持ち物\", \"旅行会社\", \"旅行サイト\", \"旅行代理店\", \"旅行業務取扱管理者\", \"旅行会社 池袋\", \"旅行 英語\", \"旅行おすすめ\", \"旅行バッグ\"]}"
}

バージョン1を作ってわかったこはGoogleのAPIを叩いても9-10個のサジェストキーワードしか取得できないということです。
これだけだと記事の作成に活用するのは難しそうです。これを踏まえて出てきたキーワードを元にしてキーワードを取得する機能をつけ加えたのがバージョン1.2です。

Ver 1.2 (一段階深くサジェストキーワードを取得する)

できたこと
キーワードに対応した上位のサジェストキーワードとそれらを元にした一段階深いサジェストキーワードが取得できる

問題点
まだサジェストキーワードを網羅しきれていない

コードの変更点

#make_suggest関数内に以下を追加

#サジェストをキーワードにした一階層深いサジェスト
for suggest_keyword in main_suggest_list:
    suggest_list[suggest_keyword] = get_suggest(suggest_keyword)

出力結果

{
  "statusCode": 200,
  "body": "{\"旅行\": [\"旅行\", \"旅行会社\", \"旅行 持ち物\", \"旅行サイト\", \"旅行代理店\", \"旅行業務取扱管理者\", \"旅行 英語\", \"旅行おすすめ\", \"旅行バッグ\", \"旅行人山荘\"], \"旅行会社\": [\"旅行会社\", \"旅行会社 倒産\", \"旅行会社 一覧\", \"旅行会社 求人\", \"旅行会社 コロナ\", \"旅行会社ランキング\", \"旅行会社 英語\", \"旅行会社 株価\", \"旅行会社 就職\", \"旅行会社 新宿\"], \"旅行 持ち物\": [\"旅行 持ち物\", \"旅行 持ち物 女子\", \"旅行 持ち物 男\", \"旅行 持ち物 一泊\", \"旅行 持ち物 子供\", \"旅行 持ち物 チェックリスト\", \"旅行 持ち物 おしゃれ\", \"旅行 持ち物 子連れ\", \"旅行 持ち物 女子 1泊\", \"旅行 持ち物 赤ちゃん\"], \"旅行サイト\": [\"旅行サイト\", \"旅行サイト 比較\", \"旅行サイト 安い\", \"旅行サイト おすすめ\", \"旅行サイト goto\", \"旅行サイト クーポン\", \"旅行サイト 一休\", \"旅行サイト じゃらん\", \"旅行サイト 新幹線\", \"旅行サイト 一覧\"], \"旅行代理店\": [\"旅行代理店\", \"旅行代理店 ランキング\", \"旅行代理店とは\", \"旅行代理店 一覧\", \"旅行代理店 新宿\", \"旅行代理店 池袋\", \"旅行代理店 goto\", \"旅行代理店 英語\", \"旅行代理店 渋谷\", \"旅行代理店 倒産\"], \"旅行業務取扱管理者\": [\"旅行業務取扱管理者\", \"旅行業務取扱管理者 試験\", \"旅行業務取扱管理者 合格率\", \"旅行業務取扱管理者 2020\", \"旅行業務取扱管理者 独学\", \"旅行業務取扱管理者 過去問\", \"旅行業務取扱管理者 難易度\", \"旅行業務取扱管理者 仕事\", \"旅行業務取扱管理者定期研修\", \"旅行業務取扱管理者 テキスト\"], \"旅行 英語\": [\"旅行 英語\", \"旅行 英語 名詞\", \"旅行 英語 勉強\", \"旅行 英語 フレーズ\", \"旅行 英語 動詞\", \"旅行 英語 単語\", \"旅行 英語 アプリ\", \"旅行 英語 例文\", \"旅行 英語 本\", \"旅行 英語 略\"], \"旅行おすすめ\": [\"旅行おすすめ\", \"旅行おすすめ 関東\", \"旅行おすすめスポット\", \"旅行おすすめ 冬\", \"旅行おすすめ海外\", \"旅行おすすめサイト\", \"旅行おすすめ 秋\", \"旅行おすすめ カップル\", \"旅行おすすめ国内 冬\", \"旅行おすすめ 温泉\"], \"旅行バッグ\": [\"旅行バッグ\", \"旅行バッグ レディース\", \"旅行バッグ ブランド\", \"旅行バッグ かわいい\", \"旅行バッグ メンズ\", \"旅行バッグ レディース 2泊\", \"旅行バッグ2泊\", \"旅行バッグ 軽い ナイロン\", \"旅行バッグ おしゃれ\", \"旅行バッグ ハイブランド レディース\"], \"旅行人山荘\": [\"旅行人山荘\", \"旅行人山荘 社長\", \"旅行人山荘 湯の花 通販\", \"旅行人山荘 ブログ\", \"旅行人山荘 日帰り\", \"旅行人山荘 アクセス\", \"旅行人山荘 口コミ\", \"旅行人山荘 休館\", \"旅行人山荘 予約\", \"旅行人山荘 じゃらん\"]}"
}

少しニッチなロングテールのサジェストキーワードも拾えるようになりました。バージョン1.2を作ってみてわかったことはサジェストキーワードの数は増えるもののバージョン1.1で取得していたキーワードを元に取り出しているので、1.1で取れていたキーワードに関連するものしか取り出せないということです。つまり狭く深いキーワードしか取得できていないので、キーワードの幅は広がっていません。幅の問題を解決すべく取れるキーワードの幅が広がるように改良したのが1.3です。

Ver1.3(キーワード+ひらがな1文字を入れた際のキーワードも取得)

できたこと
Ver 1.2に加え「旅行 あ」「旅行 い」のように入力した場合のサジェストキーワードが取得できる

コードの変更点

#make_suggest関数内に以下を追加

#ひらがなリスト(テスト用にあいうえおになっていますが50音全部取得したい場合は50全部入れましょう)
li_hiragana =list("あいうえお") 
#50音全部いれる場合は以下を代わりに使ってください
#li_hiragana = list("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんゔがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ")

#キーワード+ひらがな
    for hiragana in li_hiragana:
        suggest_list[word+" "+hiragana] = get_suggest(word+" "+hiragana)

出力結果

{
  "statusCode": 200,
  "body": "{\"旅行\": [\"旅行\", \"旅行会社\", \"旅行 持ち物\", \"旅行サイト\", \"旅行代理店\", \"旅行業務取扱管理者\", \"旅行業法\", \"旅行 英語\", \"旅行おすすめ\", \"旅行バッグ\"], \"旅行会社\": [\"旅行会社\", \"旅行会社 倒産\", \"旅行会社 一覧\", \"旅行会社 コロナ\", \"旅行会社 求人\", \"旅行会社 大手\", \"旅行会社 英語\", \"旅行会社 株価\", \"旅行会社 六本木\", \"旅行会社 就職\"], \"旅行 持ち物\": [\"旅行 持ち物\", \"旅行 持ち物 女子\", \"旅行 持ち物 男\", \"旅行 持ち物 一泊\", \"旅行 持ち物 子供\", \"旅行 持ち物 チェックリスト\", \"旅行 持ち物 おしゃれ\", \"旅行 持ち物 子連れ\", \"旅行 持ち物 女子 1泊\", \"旅行 持ち物 赤ちゃん\"], \"旅行サイト\": [\"旅行サイト\", \"旅行サイト 比較\", \"旅行サイト 安い\", \"旅行サイト おすすめ\", \"旅行サイト goto\", \"旅行サイト クーポン\", \"旅行サイト 一休\", \"旅行サイト アフィリエイト\", \"旅行サイト じゃらん\", \"旅行サイト 新幹線\"], \"旅行代理店\": [\"旅行代理店\", \"旅行代理店 ランキング\", \"旅行代理店 一覧\", \"旅行代理店とは\", \"旅行代理店 六本木\", \"旅行代理店 goto\", \"旅行代理店 新宿\", \"旅行代理店 新橋\", \"旅行代理店 東京駅\", \"旅行代理店 田町\"], \"旅行業務取扱管理者\": [\"旅行業務取扱管理者\", \"旅行業務取扱管理者 試験\", \"旅行業務取扱管理者 合格率\", \"旅行業務取扱管理者 2020\", \"旅行業務取扱管理者 独学\", \"旅行業務取扱管理者定期研修\", \"旅行業務取扱管理者証\", \"旅行業務取扱管理者 過去問\", \"旅行業務取扱管理者 難易度\", \"旅行業務取扱管理者 仕事\"], \"旅行業法\": [\"旅行業法\", \"旅行業法施行規則\", \"旅行業法 約款\", \"旅行業法施行要領\", \"旅行業法 解説\", \"旅行業法施行令\", \"旅行業法 違反\", \"旅行業法第2条\", \"旅行業法 改正\", \"旅行業法 英語\"], \"旅行 英語\": [\"旅行 英語\", \"旅行 英語 名詞\", \"旅行 英語 勉強\", \"旅行 英語 フレーズ\", \"旅行 英語 動詞\", \"旅行 英語 単語\", \"旅行 英語 アプリ\", \"旅行 英語 例文\", \"旅行 英語 本\", \"旅行 英語 略\"], \"旅行おすすめ\": [\"旅行おすすめ\", \"旅行おすすめ 関東\", \"旅行おすすめスポット\", \"旅行おすすめ 冬\", \"旅行おすすめ海外\", \"旅行おすすめサイト\", \"旅行おすすめ 秋\", \"旅行おすすめ カップル\", \"旅行おすすめ国内 冬\", \"旅行おすすめ 温泉\"], \"旅行バッグ\": [\"旅行バッグ\", \"旅行バッグ レディース\", \"旅行バッグ ブランド\", \"旅行バッグ かわいい\", \"旅行バッグ メンズ\", \"旅行バッグ レディース 2泊\", \"旅行バッグ2泊\", \"旅行バッグ 軽い ナイロン\", \"旅行バッグ おしゃれ\", \"旅行バッグ ハイブランド レディース\"], \"旅行 あ\": [\"旅行 アプリ\", \"旅行 アイコン\", \"旅行 穴場\", \"旅行 秋\", \"旅行 アンケート\", \"旅行 アフィリエイト\", \"旅行 圧縮袋\", \"旅行 熱海\", \"旅行 圧縮バッグ\", \"旅行 後払い\"], \"旅行 い\": [\"旅行 イラスト\", \"旅行 インフルエンサー\", \"旅行 いらすとや\", \"旅行 意味\", \"旅行 一休\", \"旅行 一人\", \"旅行 it\", \"旅行 一泊二日\", \"旅行 いつから\", \"旅行 伊豆\"], \"旅行 う\": [\"旅行 雨\", \"旅行 wifi レンタル 国内\", \"旅行 wifi\", \"旅行 usj\", \"旅行 海\", \"旅行 雨 最悪\", \"旅行 雨 靴\", \"旅行 雨 台無し\", \"旅行 wiki\", \"旅行 占い\"], \"旅行 え\": [\"旅行 英語\", \"旅行 エクスペディア\", \"旅行 映画\", \"旅行 英会話\", \"旅行 絵文字\", \"旅行 エッセイ\", \"旅行 延長コード\", \"旅行 エコバッグ\", \"旅行 絵\", \"旅行 英単語\"], \"旅行 お\": [\"旅行おすすめ\", \"旅行 おすすめ 国内\", \"旅行 温泉\", \"旅行 沖縄\", \"旅行 大阪\", \"旅行 温泉 関東\", \"旅行 おすすめ 友達\", \"旅行 お得\", \"旅行 温泉 カップル\", \"旅行 同じ服\"]}"
}

結果が長くなるので今回は「あいうえお」までのサジェストしか取得していませんが、もちろん残りの50音やアルファベットを入れた結果を取得することも可能です。完璧ではありませんが、ある程度キーワードが出てくるようになったので今回はこれで一旦完成とします。本記事では詳細を省きますが、こちらの関数をフロントエンドと連携させればサジェスト取得ツールを作成することも可能です。

結論と今後の課題

ある程度サジェストを網羅する関数を作成することができました。今後は以下のようなこともできるようにできたらと考えています。

  • 出てきたキーワードの優先順位や重み付けの判定
  • キーワードごとの検索回数も取得できるようにする

資料ダウンロード申し込み

Scroll to Top