TwitterのJSONからURLを頻度順に抜き出すスクリプト

目的

収集したTwitterの投稿データに含まれるURLの出現頻度とそれらの順位を知りたかった。 statuses/*_timelineやsearch/tweetsのエンドポイントで取得したデータを想定とする。

スクリプト

find . -name "*.json" | xargs cat \ 
 | jq -r '.entities | if .urls == null then empty else .urls[].expanded_url end' \
 | awk '{c[$0]++}END{for(i in c)print c[i], i}' \
 | sort -k1 -n -r | head -n5

1行目は単純に*.jsonを検索して次に渡して、2行目はjqを使ってurlのvalueを取得、3行目はurlのカウント、4行目は頻度順にソートしてトップ5を表示。 media以下のURLを対象とするには、「.urls」と「.urls」の部分を「.media」と「.media」に置き換えればOK。

前提

  • jqがインストールされている
  • 1ポストが1ファイルとなったhoge.jsonが入力

Twitterの投稿データに含まれるURLの扱い

Twitterの投稿データに含まれるURLに関するデータはおおよそ以下の通りとなる。「media」はTwitter標準のメディア投稿機能(画像とか動画とか)を利用した場合に専用のスキーマに格納されるらしい?(参考: Entities — Twitter Developers

  • entities
    • media

      • media_url
      • media_url_https
      • url
      • display_url
      • expanded_url
    • urls

      • url
      • display_url
      • expanded_url

media_urlとmedia_url_httpsは画像ファイルが配置されているパスだが、今回はメディア表示ページのパスを使うことにしたので除外、 また、display_urlはクライアントでの表示用に「...」で省略された形式(http://hoge.com/fuga...)であるので除外。

urlはTwitterの標準機能の短縮URL「t.co」で短縮されたデータで、expanded_urlはその短縮URLが展開された形式なので、今回の用途にはexpanded_urlを抽出すれば良さそうという結論に至った。(展開されるのはあくまでも「t.co」で、外部の短縮URLサービスを利用したURLは展開されない)