Google Trendsの情報をPythonで取得したい。pytrendsの紹介

2020.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部@札幌の佐藤です。

Google Trendsの情報を取得したいなということがあり、ライブラリを調べていたところ、pytrends というライブラリを見つけましたので触ってみました。
当機能はGoogle非公式APIとなりますので、Google側の仕様変更によって使用できない機能などがありますのでご注意ください。

GitHubの内容を見る限り、googleに対して直接リクエストを投げて情報を取得しているようです。
そのため取得期間が長い場合、googleからエラーが返却されることがありますので注意が必要です。
また、一部日本では動かない箇所があるため、これからなライブラリかなと思います。

情報の返却にPandasライブラリを利用しているため、Lambda Layersなどで使用したい場合は当ライブラリに加えてPandasライブラリが必要になります。


pytrendsで取得できるもの

当機能は以下の機能が使用可能です。※括弧はGitHub上の記載

  • 人気度の動向の取得(Interest Over Time)
  • 小区域別のインタレストの取得(Interest by Region)
  • 関連トピックの取得(Related Topics)
  • 関連キーワードの取得(Related Queries)
  • 最近の急上昇の取得(Trending Searches)
  • 年度別の急上昇ランキングの取得(Top Charts)
  • 検索サジェストの取得(Suggestions)
  • カテゴリの内容の取得(Categories)


人気度の動向の取得

Google Trendsを使用したい人は、ここをメインに使用していくと思います。

下記実装でgoogleに接続、検索キーワードを含めた情報をgoogle側にリクエストします。 結果をpandasに取り込んで返します。

from pytrends.request import TrendReq

# googleに接続
pytrend = TrendReq(hl='ja-jp',tz=540)

# キーワードの設定 5キーワード以上は内部エラーになる
kw_list = ['アイカツ']
# googleにリクエストする。
pytrend.build_payload(kw_list=kw_list, timeframe='2020-11-28T15 2020-11-29T15', geo="JP")
# Pandasで内容をまとめる
pytrend.interest_over_time()

googleへの接続

注意はパラメータの tz です。
これはぱっと見分からないところになりますが、tz=540 はUTCからの時差を分単位にしたものになります。(日本は時差9時間×60分=540)
そして時差によってはマイナスになることがありますのが、当機能ではマイナスは不要です。 GitHubにもありますが、google側の仕様のようです。

For example US CST is '360' (note NOT -360, Google uses timezone this way...)

また、上記にも書きましたが取得期間が長い場合、googleからエラーが返却されるため、パラメータにproxies などを設定することで対応していきます。

googleにリクエスト

https://trends.google.com/trends/api/explore のsuffixの設定をパラメータ上で実施していくことになります。
キーワードの設定は5ワードまでです。5ワード以上はGoogle returned a response with code 400. が返却されます。
また、キーワードは「'アイカツ プラネット'」のようにスペースで区切ることが可能です。

取得する期間ですが、Google Trendsと同じ条件で調査することが可能です。
ただしUTCのため、別途考慮が必要となります。

また、Google Trends上で開始日~終了日を1日間に設定すると正しく出力されないのですが、上記の実装のようにT15 で時間を設定してあげると1日間の結果を返してくれます。
ただしこの場合は、日付単位ではなく時間単位集約されないのが注意です。(上記の画像のような形になります) また、時間単位での取得は過去7日分しかできず、それ以降を指定するとGoogle returned a response with code 400. になります。


pytrend.build_payload(kw_list=kw_list, timeframe='2020-11-25 2020-11-29', geo="JP") のような形だと、日付単位で集計されます。 その代わり1日単位で出力はできないようです。


いろいろ試しましたが、Google Trendsの手動実行した結果と同じ形にするにはgeo="JP"は必須になります。
このパラメータを設定しない場合、日本以外も条件に入っているためか若干ずれます。

過去データを時間単位で取得

上で書いたとおり、時間単位での取得は過去7日分しかできませんが、以下の実装であれば過去7日以前も取得することが可能です。

pytrend.get_historical_interest(kw_list, year_start=2018, month_start=1, day_start=1, hour_start=0, year_end=2020, month_end=11, day_end=30, hour_end=0, cat=0, geo='', gprop='', sleep=60)

内部の処理としては、build_payload関数をループしているにすぎないため、複数リクエストを投げてサーバに負荷をかけてしまうためsleepパラメータを0に設定するのはNGです。
またその場合は、An unknown error related to remote content was detected (500)のエラーが返却されます。


小区域別のインタレストの取得

Google Trendsを手動実行した場合の中央部に存在する地域別の人気度を取得する処理になります。

# googleに接続
pytrend = TrendReq(hl='ja-jp',tz=540)

# キーワードの設定 5キーワード以上は内部エラーになる
kw_list = ['アイカツ']
# googleにリクエストする。
pytrend.build_payload(kw_list=kw_list, timeframe='2020-11-28T15 2020-11-29T15', geo="JP")
# 小区域別のインタレストの取得
pytrend.interest_by_region(resolution='COUNTRY', inc_low_vol=True, inc_geo_code=True)



※キャプチャーは一部のみです。

この関数については内部処理的にUS以外の考慮がされておらず、日本では都道府県別しか出力することができません。
そのため、市区町村単位で取得したいというケースはこのライブラリでは難しいです。

関連トピックの取得

# googleに接続
pytrend = TrendReq(hl='ja-jp',tz=540)

# キーワードの設定 5キーワード以上は内部エラーになる
kw_list = ['アイカツ']
# googleにリクエストする。
pytrend.build_payload(kw_list=kw_list, timeframe='2020-11-28T15 2020-11-29T15', geo="JP")
# 関連トピックの取得
topics[kw_list[0]]['rising']


辞書型で返却されるのでparseしています。
Google Trendsを手動実行した場合の下部に表示されるほかに検索されているトピックの一覧です。
Google Trendsの仕様と同じように、使用できるのは検索ワードがひとつのときのみです。


関連キーワードの取得

# googleに接続
pytrend = TrendReq(hl='ja-jp',tz=540)

# キーワードの設定 5キーワード以上は内部エラーになる
kw_list = ['アイカツ']
# googleにリクエストする。
pytrend.build_payload(kw_list=kw_list, timeframe='2020-11-28T15 2020-11-29T15', geo="JP")
# 関連キーワードの取得
topics = pytrend.related_queries()
# topとrisingがあるのでそれぞれparse
topics[kw_list[0]]['rising']
topics[kw_list[0]]['top']

rising結果

top結果

辞書型で返却されるのでparseしています。
Google Trendsを手動実行した場合の下部に表示されるほかに検索されているキーワードの一覧です。
複数キーワードの場合それぞれの要素で取得します。


最近の急上昇の取得

Google Trendsのトップ画面にある最近の急上昇の取得です。
内部的にはhttps://trends.google.com/trends/hottrends/visualize/internal/data で表示される辞書のparseした結果です。

pytrend = TrendReq(hl='ja-jp',tz=540)
# pnには国名を設定
pytrend.trending_searches(pn='japan')


年度別の急上昇ランキングの取得

Google Trendsのトップ画面にある「Year in Search: 検索で振り返る」の取得です。

pytrend = TrendReq(hl='ja-jp',tz=540)
date='2019'
pytrend.top_charts(date, hl='ja-jp', tz=540, geo='JP')

国を指定するとその国の過去の急上昇ランキングを取得します。
注意としては、前年までのデータしか取得できない点と、複数年取得できない点になります。


検索サジェストの取得

pytrend = TrendReq(hl='ja-jp',tz=540)
pytrend.suggestions('アイカツ')

ワードで検索した場合のサジェストを取得できます。
複数ワードをsuggestionsの引数に渡すことができません。


カテゴリの内容の取得

pytrend = TrendReq(hl='ja-jp',tz=540)
pytrend.categories()

カテゴリ一覧を取得します。これの利用用途はよくわかりません。


さいごに

GitHubの内容も見ながらどんな処理かチェックしていたので、大体どのようなことをしているのかが理解できたかなという感じです。 これを利用してGoogle Trendsの情報を取得していきたいと思います。