Snippets

sironekotoro Googleトレンドを非公式APIから取得し、各日のランキングをとり、以前に出現してたらその日と順位も表示する

Created by sironekotoro
use strict;
use warnings;
use Data::Dumper;    # リファレンス覗き用

use JSON qw/decode_json/
    ;    # json形式のデータをPerlのデータ形式にする
use Encode qw/encode/
    ;    # マルチバイト文字列(日本語)表示する
use LWP::Simple qw/get/; # インターネット上のデータを取得する
use utf8;                # プログラム中に日本語を書く時に利用

# 参考
# Googleトレンドの急上昇キーワードをAPIで取得してみる
# https://wakabatimes.com/google%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89%E3%81%AE%E6%80%A5%E4%B8%8A%E6%98%87%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92api%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
#
# The Fastest JSON visualizer
# http://kimihiro-n.site44.com/json_dump/index.html

# Googleトレンドを取得する日付を配列に入れる
my @date = ('20181231');    # 開始日

# 1月18日までの日付(yyyymmdd形式)を組み立てて配列に入れる
for my $day ( 1 .. 18 ) {

    # sprintf関数で、$dayが1桁の時は左側に0が入る
    # 1 => 01 と言うようになる
    my $date = '201901' . sprintf( '%02d', $day );
    push @date, $date;
}

my %date_query;    # date をkeyとするデータ構造
my %query_date;    # query をkeyとするデータ構造

for my $date (@date) {

    # 日付をもとに、非公式APIのURLを1日ずつ組み立てる
    my $uri = 'https://trends.google.com/trends/api/dailytrends?geo=JP&ed='
        . $date;

    # APIを叩いてresponseを得る
    my $res = get($uri) or die;

    # 行頭にあるゴミを除去する
    # substr : 文字列の操作を行う関数
    $res = substr( $res, 6 );

    # json形式のデータをPerlのデータ構造に変換する
    my $json = decode_json($res);

    # クエリー(検索語)の配列を取得する
    my @trendingSearches
        = @{ $json->{default}->{trendingSearchesDays}->[0]->{trendingSearches}
        };

# クエリー(検索語)を取り出して、%date_query を組み立てていく
    while ( my ( $ranking, $body ) = each @trendingSearches ) {

        # 検索ワード
        my $query = $body->{title}->{query};

 # ランキングとクエリー(検索語)をハッシュに格納する
        my %entry = ( ranking => $ranking, query => $query );

# 格納したハッシュをリファレンスにして
# date_query->{日付} に追加していく
# (配列リファレンスに、ハッシュリファレンスを追加する)
        push @{ $date_query{$date} }, \%entry;

# クエリー(検索語)と日付をkey、ランキングをvalueとするデータ構造を作る
        $query_date{$query}{$date} = { ranking => $ranking };
    }
}

# そのクエリー(検索語)の登場回数を記録する
for my $query ( sort keys %query_date ) {

    # 登場回数の初期値:0
    my $count = 0;

# クエリー(検索語)のvalueである登場した日付を取得する
    for my $date ( sort { $a <=> $b } keys %{ $query_date{$query} } ) {

        # 登場回数を+1
        $count++;

# クエリー(検索語)の登場回数を日付ごとに count というkey に記録する
        $query_date{$query}{$date}->{count} = $count;

# クエリー(検索語)登場した日付を配列リファレンスにpushする
        push @{ $query_date{$query}{history} }, $date;

        # (冗長だけど・・・)
        # 配列リファレンスを配列に戻す。
        my @history = @{ $query_date{$query}{history} };

# 配列の要素の数が1より大きい場合には、過去に出現したと判断
        if ( scalar @history > 1 ) {

# 配列の添字を[−2]とすることで、末尾から2番目の要素
# (前回、クエリー(検索語)が出現した時の日付)を取得し、
# last_time というkeyに保存する
            $query_date{$query}{$date}{last_time} = $history[-2];
        }

    }
}

# $date_query からから日付順に処理
# sort を利用して、順番を固定する
for my $date ( sort { $a <=> $b } keys %date_query ) {

    # 見やすくするためのprint文
    print "\n";

    # 年月日をわかりやすくする
    my $year  = substr( $date, 0, 4 );
    my $month = substr( $date, 4, 2 );
    my $day   = substr( $date, 6, 2 );

    print encode( 'utf8', "-- ${year}年${month}月${day}日 --" ), "\n";

    # $date_query{日付} は配列リファレンス。
    # その日のクエリー(検索語)を順番に取り出す。
    for my $entry ( @{ $date_query{$date} } ) {

# ランキングの順位を2桁にするために sprintf を使う
# ランキングは0始まりなので、 +1 して人間が読みやすく変換する。
        my $ranking = sprintf( '%02d', $entry->{ranking} + 1 );

        # クエリー(検索語)
        my $query = $entry->{query};

# 前回出現した日付。ない場合には空文字 '' をセットする
        my $last_time = $query_date{$query}{$date}->{last_time} // '';

# 前回出現した日付がある場合、それを表示する文字列を作成する
        if ($last_time) {

            # 前回出現時のランキングを取得
            my $last_time_ranking = $query_date{$query}{$last_time}{ranking};

            # 人間に合わせて +1 する。
            $last_time_ranking += 1;

            # 年月日をわかりやすくする
            my $year  = substr( $last_time, 0, 4 );
            my $month = substr( $last_time, 4, 2 );
            my $day   = substr( $last_time, 6, 2 );

            # 文字列の組み立て
            $query = $query . "\t"
                . "[前回出現:${year}年${month}月${day}日 ${last_time_ranking}位]";
        }

 # マルチバイト文字列(日本語)を表示するのでencodeする
        my $encoded_str = encode( 'utf8', $query );

        # printfで整形しつつ表示する
        printf( "%02d %-20s \n", $ranking, $encoded_str ),;
    }
}

-- 2018年12月31日 --
01 紅白歌合戦 2018 
02 メイウェザー   
03 米津玄師         
04 紅白               
05 泉里香            
06 松任谷由実      
07 内村光良         
08 ニューイヤー駅伝 2019 
09 今井翼            
10 松田聖子         
11 格付けチェック 2019 
12 宮本浩次         
13 米津玄師紅白   
14 高橋メアリージュン 
15 初日の出         
16 大塚国際美術館 
17 ジャニーズ      
18 お雑煮            
19 ハッピーニューイヤー 
20 西野七瀬         

-- 2019年01月01日 --
01 箱根駅伝         
02 MHPS                 
03 マリウス         
04 2019年運勢        
05 TWICE                
06 モンスト ソロモン 
07 福袋               
08 井上尚弥         
09 初夢               
10 FGO                  
11 純烈               
12 ソロモン         
13 あけましておめでとう 
14 堂珍敦子         
15 一般参賀 2019    
16 福袋 2019          
17 インディード Cm 
18 イノシシ         
19 深田恭子         
20 紅閻魔            

-- 2019年01月02日 --
01 箱根駅伝速報   
02 東海大学         
03 高校サッカー   
04 宮沢りえ         
05 下町ロケット   
06 スポーツ王      
07 ラウドラ         
08 石原さとみ      
09 アップル         
10 内田理央         
11 東洋大学         
12 Amazon 初売り 2019 
13 浜田雅功         
14 紅白視聴率      
15 山川穂高         
16 大東文化大学   
17 大迫傑            
18 滝沢カレン      
19 大学ラグビー   
20 北陸新幹線      

-- 2019年01月03日 --
01 地震               
02 箱根駅伝 2019    
03 アナと雪の女王 
04 科捜研の女      
05 永野芽郁         
06 今田美桜         
07 ドル円            
08 荻野目洋子      
09 しぶんぎ座流星群 
10 菅田将暉         
11 ライスボウル   
12 バンドリ         
13 太宰府天満宮   
14 日テレ箱根駅伝 
15 為替               
16 九州               
17 両角速            
18 VS嵐                
19 高橋真麻         
20 後藤真希         

-- 2019年01月04日 --
01 アバンティーズエイジ 
02 風の谷のナウシカ 
03 梅宮アンナ      
04 岡崎紗絵         
05 ブギーポップは笑わない 
06 大泉洋            
07 生田絵梨花      
08 高校ラグビー   
09 韓国レーダー照射 
10 チコちゃん      
11 ヴェルダンディ 
12 前澤友作         
13 エイジ死亡      
14 いだてん         
15 玉川徹            
16 今泉佑唯         
17 斎藤佑樹         
18 レミゼラブルドラマ 
19 安住紳一郎      
20 YouTuber             

-- 2019年01月05日 --
01 高校サッカー   [前回出現:2019年01月02日 3位] 
02 日食               
03 JRA                  
04 七草粥            
05 錦織圭            
06 マグロ初競り   
07 逃走中            
08 坂本龍馬         
09 名探偵コナン   
10 春校バレーボール2019 
11 春高バレー 2019 
12 シンザン記念   
13 HERO                 
14 長嶋一茂         
15 高橋一生         
16 ヒーロー         
17 菊池雄星         
18 とろサーモン久保田 
19 大塚愛            
20 剛力彩芽         

-- 2019年01月06日 --
01 レミゼラブルドラマ    [前回出現:2019年01月04日 18位] 
02 永野芽郁 [前回出現:2019年01月03日 5位] 
03 いだてん [前回出現:2019年01月04日 14位] 
04 高橋メアリージュン    [前回出現:2018年12月31日 14位] 
05 菅田将暉 [前回出現:2019年01月03日 10位] 
06 ジェジュン      
07 前澤友作 [前回出現:2019年01月04日 12位] 
08 サザエさん      
09 高校ラグビー   [前回出現:2019年01月04日 8位] 
10 上白石萌歌      
11 アジアカップ 2019 
12 新千歳空港      
13 七草がゆ         
14 嘉納治五郎      
15 森川葵            
16 杉咲花            
17 秩父               
18 アジアカップ   
19 柳田悠岐         
20 春高バレー      

-- 2019年01月07日 --
01 七草粥  [前回出現:2019年01月05日 4位] 
02 長野久義         
03 翻訳               
04 トレース         
05 神谷浩史         
06 深田恭子 [前回出現:2019年01月01日 19位] 
07 日経平均         
08 どろろ            
09 はじめてのおつかい 
10 ゴールデングローブ賞 2019 
11 吉沢亮            
12 川栄李奈         
13 ゾゾタウン社長 
14 渡辺直美         
15 ソフトバンク株価 
16 本田翼            
17 片寄涼太         
18 ディーンフジオカ 
19 日経平均株価   
20 剛力彩芽 [前回出現:2019年01月05日 20位] 

-- 2019年01月08日 --
01 西野カナ         
02 吉田沙保里      
03 日本 対 トルクメニスタン 
04 地震   [前回出現:2019年01月03日 1位] 
05 黒碧天            
06 時効警察         
07 李書文            
08 高校ラグビー   [前回出現:2019年01月06日 9位] 
09 ゴーン            
10 中澤佑二         
11 矢沢心            
12 ダルビッシュ   
13 藤井聡太         
14 テラスハウス   
15 ぱすてるメモリーズ 
16 ルーニー         
17 GitHub               
18 マクレガー      

-- 2019年01月09日 --
01 山口真帆         
02 友井雄亮         
03 トルクメニスタン 
04 尾田栄一郎      
05 サッカー日本代表 
06 兼高かおる      
07 サッカーアジアカップ 
08 家売る女         
09 アジアカップ   [前回出現:2019年01月06日 18位] 
10 NGT                  
11 馬毛島            
12 志村けん         
13 ピーチジョン   
14 バーチャルさんは見ている 
15 りんご病         
16 玉川徹  [前回出現:2019年01月04日 15位] 
17 摂津正            
18 武田玲奈         

-- 2019年01月10日 --
01 純烈   [前回出現:2019年01月01日 11位] 
02 雨宮萌果         
03 日本 対 トルクメニスタン    [前回出現:2019年01月08日 3位] 
04 ワンピース      
05 スキャンダル専門弁護士 
06 盾の勇者の成り上がり 
07 楠ろあ            
08 福男               
09 星座               
10 刑事ゼロ         
11 宇賀なつみ      
12 京王観光         
13 川谷絵音         
14 森川葵  [前回出現:2019年01月06日 15位] 
15 松本人志         
16 竹下亘            
17 はあちゅう      
18 ディビジョン   

-- 2019年01月11日 --
01 耳をすませば   
02 純烈   [前回出現:2019年01月10日 1位] 
03 太野彩香         
04 戸松遥            
05 メゾンドポリス 
06 約束のネバーランド 
07 鏡開き            
08 高橋一生 [前回出現:2019年01月05日 15位] 
09 Shiho                
10 ヴァニラ         
11 ジョンベネ      
12 キャッツアイ   
13 五等分の花嫁   
14 武田真治         
15 えなこ            
16 東京オートサロン 2019 
17 吉田鋼太郎      
18 ガーリーエアフォース 
19 仮面ライダーギルス 
20 上白石萌音      

-- 2019年01月12日 --
01 天地総子         
02 須田亜香里      
03 ドメスティックな彼女 
04 Chara                
05 電気グルーヴ   
06 小嶋真子         
07 フルーツ宅配便 
08 テレビ番組      
09 青森山田         
10 東京天気         
11 LiLiCo               
12 滝藤賢一         
13 デートアライブ 

-- 2019年01月13日 --
01 オマーン 対 日本 
02 高校サッカー決勝 
03 中井りか         
04 成人式            
05 稀勢の里         
06 都道府県駅伝 2019 女子 
07 ハリースタイルズ 
08 河村隆一         
09 かぐや様は告らせたい 
10 全国女子駅伝   
11 グッドワイフ   
12 ヒカル            
13 オマーン         
14 荻野由佳         
15 日本代表         
16 坂口健太郎      
17 生駒里奈         
18 青森山田サッカー 
19 流通経済大学柏サッカー 
20 金蘭会            

-- 2019年01月14日 --
01 地震   [前回出現:2019年01月08日 4位] 
02 市川海老蔵      
03 バーミヤン      
04 アジアカップ 2019  [前回出現:2019年01月06日 11位] 
05 全豪オープン   
06 宮田聡子         
07 稀勢の里 引退  
08 川口春奈         
09 サッカー         
10 アジアカップ   [前回出現:2019年01月09日 9位] 
11 川栄李奈 [前回出現:2019年01月07日 12位] 
12 梅原猛            
13 長澤まさみ      
14 家政婦は見た   
15 荒野のコトブキ飛行隊 
16 平野レミ         
17 南野拓実         
18 成人の日         

-- 2019年01月15日 --
01 初めて恋をした日に読む話ドラマ 
02 稀勢の里 [前回出現:2019年01月13日 5位] 
03 スープラ         
04 横浜流星         
05 錦織圭  [前回出現:2019年01月05日 5位] 
06 阪神淡路大震災 
07 竹田恒和         
08 けものフレンズ2 
09 大坂なおみ      
10 木村拓哉         
11 アインシュタイン 
12 転生したらスライムだった件 15話 
13 レアード         
14 伊藤綾子         

-- 2019年01月16日 --
01 純烈   [前回出現:2019年01月11日 2位] 
02 Fear and Loathing in Las Vegas 
03 芥川賞            
04 スタバ            
05 宮根誠司         
06 工藤静香         
07 安達祐実         
08 サマソニ         
09 水川あさみ      
10 竹内結子         
11 ニューシャトル 
12 ローランド      
13 黒木華            
14 ちぃたん         
15 坂口健太郎    [前回出現:2019年01月13日 16位] 
16 指原莉乃         
17 初めて恋をした日に読む話漫画 
18 きせのさと      
19 田子の浦親方   
20 NANAMI               

-- 2019年01月17日 --
01 ゴチ新メンバー 2019 
02 バンクシー      
03 口永良部島      
04 日本 対 ウズベキスタン 
05 錦織圭  [前回出現:2019年01月15日 5位] 
06 シベール         
07 阪神淡路大震災  [前回出現:2019年01月15日 6位] 
08 モンスト 海坊主 
09 三浦大知         
10 剛力彩芽 [前回出現:2019年01月07日 20位] 
11 千鳥ノブ         
12 ウズベキスタン 
13 サザコーヒー   
14 中村倫也         
15 エースコンバット7 
16 サブウェイ      
17 大坂なおみ    [前回出現:2019年01月15日 9位] 
18 ハマオカモト   
19 モンスト 冴羽リョウ 
20 志田未来         

-- 2019年01月18日 --
01 佐野瑞樹         
02 センター試験 2019 
03 地震   [前回出現:2019年01月14日 1位] 
04 羽賀研二         
05 モンスト キャッツアイ 
06 センター試験   
07 僕の初恋を君に捧ぐドラマ 
08 サッカーアジアカップ   [前回出現:2019年01月09日 7位] 
09 マスカレード・ホテル 
10 バックストリートボーイズ 
11 トクサツガガガ 
12 サッカー日本代表 [前回出現:2019年01月09日 5位] 
13 キンタロー      
14 クロちゃん      
15 サッカー [前回出現:2019年01月14日 9位] 
16 ロペス            
17 三宅健            
18 刀剣乱舞映画   
19 シュミットダニエル 
20 塩谷司            

Comments (0)