pytubeを使ってYouTubeの検索結果に視聴回数と評価を表示させる

pytubeを使ってYouTubeの検索結果に視聴回数と評価を表示させる データ分析

YouTubeの検索は、使い勝手が悪いと思いませんか?
個人的には、YouTubeの検索には不満だらけです。

よって、自分で望むように作ります。
Pythonを使ってYouTubeの検索結果を改善していきます。

この記事では、その方法を解説します。
内容的には、YouTube分析にも活用できるはずです。

本記事の内容

  • YouTube検索のダメなところ
  • YouTubeの検索を改良するために必要なモノ
  • 【動作確認】YouTubeの検索を改良するコード

それでは、上記に沿って解説していきます。

YouTube検索のダメなところ

以下は、「スペアリブ」で検索した結果です。
フィルタには、何も設定していません。

大きく2つの不満があります。

  • 評価が表示されていない
  • 並び順が意味不明

それぞれを下記で説明します。

評価が表示されていない

評価とは、「averageRating」という値のことです。
ただし、averageRatingは一覧だけではなく動画画面にも表示されてはいません。

基本的には、ユーザーが目にすることはありません。
ユーザーに見えるのは、次のような表示だけです。

しかし、見ようと思えば見ることができます。
Chromeなら、「ページのソースを表示」でhtmlソースを表示させます。

上記のようにjsonデータとして、ソースには出力されています。
averageRatingの計算式は不明ですが、傾向はわかります。

高評価率の高い場合は、averageRatingが5に近い数字です。
逆に、低評価率が高い場合は、averageRatingが1に近い数字です。

よって、動画の質を決めるにはaverageRatingが役に立つと言えます。
この数字が、検索結果に出てくれば参考になります。

並び順が意味不明

おそらく、YouTube的には最適だと判断しているのでしょう。
しかし、ある程度明確な基準が欲しいところです。

一応「関連度順」ということですけどね。
そこで、フィルタにある「並び替え」の出番となります。

ただ、これがまた使えません。
例えば、「評価」で並び替えます。

検索ワードは「スペアリブ」のままです。
この条件での上位5件の視聴回数などの情報が、以下。

視聴回数公開日goodbad
242021/08/2830
6172020/11/02140
6722021/02/25130
572021/01/1040
5612021/07/23100

これもまた、よくわからない並び順です。
「good ÷ 視聴回数」の降順という訳でもありません。

やはり、意味不明です。

まとめ

YouTube検索のダメなところを説明してきました。
そうは言っても、Googleのやっていることなので最適なのは確かでしょう。

最適とは、YouTubeやGoogleにとって最適と言えるかもしれません。
ユーザーのサイト滞在時間が伸びれば、伸びるほど良い結果と言えます。

そう考えると、YouTubeでは意図的に検索が不便になっているのかもしれません。
いろいろな動画を寄り道すること自体に意味があるということです。

そもそも検索エンジンではなく、娯楽を与えることからYouTubeはスタートしていますからね。
でも、個人的にはもっと効率的に検索したいです。

次では、そのために必要なモノを説明します。

YouTubeの検索を改良するために必要なモノ

Pythonを利用することは、大前提です。
OSは、特に問いません。

Pythonのバージョンは、次のライブラリに依存します。
次のライブラリを用いて、YouTubeの検索を改良するからです。

  • pytube
  • pandas
  • tabulate
  • Arrow

基本的には、次のPython公式開発サイクルに準じていれば問題ありません。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年10月4日2026年10月

Python 3.6は、2021年の年末でサポート期限が切れます。
Python 3.10は、まだ未対応のライブラリが存在する可能性もあります。

したがって、Python 3.7、3.8、3.9なら大丈夫と言えます。
では、ライブラリに関して下記で触れておきます。

pytube

YouTubeからデータを取得する際に、利用するライブラリとなります。
pytubeに関しては、次の記事で解説しています。

インストールは、次のコマンドで終わらせておきます。

pip install pytube

pandas

pandasは、データ解析を支援する機能を提供するライブラリです。
Pythonを使っていれば、必ず目にするライブラリと言えます。

今回は、データを並び替えるために用いています。
インストールは、次のコマンドとなります。

pip install pandas

tabulate

コンソールで結果を綺麗に見せるために利用します。
tabulateに関しては、次の記事でまとめています。

インストールは、次のコマンドとなります。

pip install tabulate

Arrow

日付、時間などをPythonで用いる場合は、Arrowが便利です。
動画公開日を表示する際に、利用しています。

「2週間前」などのわかりやすい表示のためです。
Arrowについては、次の記事で説明しています。

インストールは、次のコマンドで行います。

pip install arrow

まとめ

OSは、問いません。
クロスプラットフォーム対応というヤツです。

Python 3.7、3.8、3.9を利用しましょう。
そして、下記のライブラリをインストールします。

  • pytube
  • pandas
  • tabulate
  • Arrow

以上、YouTubeの検索を改良するために必要なモノを説明しました。
次は、実際にYouTubeの検索を改良するコードを説明します。

【動作確認】YouTubeの検索を改良するコード

YouTubeの検索を改良するのが、次のコードとなります。
必要なモノさえ揃っていれば、そのまま動くはずです。

from pytube import Search
import pandas as pd
from tabulate import tabulate
import arrow

# 検索ワード
KEYWORD = 'スペアリブ'

# 検索結果を格納する配列
d_ary = []

# YouTubeで検索
s = Search(KEYWORD)


# YouTube Objectを辞書型に変換
def pytube_to_dict(obj):
    dict_d = {}

    # 公開日時の表示加工
    p_d = arrow.get(str(obj.publish_date), 'YYYY-MM-DD HH:mm:ss')
    publish_date_humanize = p_d.humanize(locale='ja-jp')

    dict_d["rating"] = obj.rating
    dict_d["views"] = obj.views
    dict_d["publish_date"] = publish_date_humanize
    dict_d["title"] = obj.title
    # dict_d["author"] = obj.author
    # dict_d["description"] = obj.description
    # dict_d["channel_url"] = obj.channel_url
    # dict_d["thumbnail_url"] = obj.thumbnail_url

    return dict_d


# 最初のページ
result = s.results

# 次ページ
s.get_next_results()
result = s.results

# 次ページ
s.get_next_results()
result = s.results

# 配列に辞書型のデータを追加
for r in result:
    d = pytube_to_dict(r)
    d_ary.append(d)

# 辞書型配列をデータフレームに変換
df = pd.DataFrame(d_ary)

# 指定したキーでソート(viewsの降順)
df_s = df.sort_values(['rating'], ascending=[False])

# 表形式で結果表示
print(tabulate(df_s, headers="keys", showindex="never"))

上記を実行した結果は、以下。
今回は、ratingをキーにして集めた検索結果を降順に並び替えています。

上記結果は、全59件(3ページ分)の一部です。
では、ポイントを絞って説明します。

ここには、検索したいワードを設定します。

# 検索ワード 
KEYWORD = 'スペアリブ'

pytubeによって取得したデータは、YouTube Object形式のデータです。
この形式のデータについては、次のページに詳細説明があります。

pytube公式のドキュメント
https://pytube.io/en/latest/api.html#youtube-object

YouTube Object形式のままでは、使い勝手が悪いです。
そこで辞書型のデータに置き換えています。
その過程で日付データを、人間がわかりやすい表示に変換しています。

    # 公開日時の表示加工 
    p_d = arrow.get(str(obj.publish_date), 'YYYY-MM-DD HH:mm:ss') 
    publish_date_humanize = p_d.humanize(locale='ja-jp')

最もややこしいのは、以下の部分となるでしょう。

# 最初のページ
result = s.results

# 次ページ
s.get_next_results()
result = s.results

# 次ページ
s.get_next_results()
result = s.results

今回は、3ページ分だけ検索結果(デフォルトの関連度順)を取得しています。
改ページするのが、次のコードとなります。

# 次ページ 
s.get_next_results() 
result = s.results

サンプルコードでは、上記コードが2回出てきます。
よって、2回改ページしたということになります。

もっとデータを取得したい場合は、この改ページ処理をその分だけ増やせばよいでしょう。
並び順もそうですが、このコードをもとにドンドンと各人で使いやすいようにカスタマイズしてください。

個人的には、この結果を受けて更に改良したい部分が出てきました。
アカウント毎のチャンネル登録者の数も一覧に表示したいという内容です。

チャンネル登録者の多いチャンネルの動画なら、評価は高くなりがちの可能性があります。
要するに、ファン・信者が多いということですね。

でも、そのような人気チャンネルなら、アンチも多い可能性があります。
そのあたりがどう評価や再生数に関係してくるのかも、分析してみたいです。

以上、【動作確認】YouTubeの検索を改良するコードについて説明しました。

タイトルとURLをコピーしました