タイトルそのままです。YOUTUBEのチャンネル単位で動画のタイトルとURL、チャンネルを指定して丸ごとGETします。こんなことをして何が楽しいのかって? 実際にYOUTUBEの動画の分析の依頼は結構あるからです。

まずはターゲットのチャンネルにアクセス、そして「動画」のタブをクリック。urlは以下のような形式になっています。

https://www.youtube.com/channel/XXXX/videos

ここに表示されるものを丸ごとゲットしてしまえばいいのです。

F12キーを押してインスペクターの部分をみてみると動画のタイトルと動画ページへのリンクはこの要素内に存在することがわかります。そこで右側のソースが選択されている部分を右クリックしてXPathを取得すると、

が取得されました。他の動画のタイトルとリンクもXPathはこれであることがわかります。

スクロールさせてすべて表示させる

動画はすべて表示されるわけではありません。検索結果を下にスクロールしておくとさらに古い動画が表示されます。実際にスクロールしないと情報を取得することができません。

ではどうするか? ここではPuppeteerSharpを使います。PuppeteerSharpで検索結果の上位30件を取得してみたにあるとおり、Seleniumを使ってもいいのですが、Selenium.Chrome.WebDriverはインストールされているGoogle Chromeのバージョンがあっていないとうまく動きません。だったらPuppeteerSharpを使ったほうがお手軽かもしれません。

といってもスクレイピング用のChromeがインストールされるため、初回の起動に時間がちょっとだけかかってしまう、実行ファイルがあるフォルダの容量が大きくなってしまうという欠点もあります。それでもPuppeteerSharpのほうが現在使用しているGoogle Chromeのバージョンアップの影響をうけないということでおすすめだと思うのです。

コードを書く

ではコードを書いていきましょう。

NuGetパッケージマネージャーをつかってPuppeteerSharpをインストールします。また結果をExcelファイルで保存したいのでClosedXMLもインストールします。

デザイナをつかってフォーム上にターゲットのurlを入力するためのテキストボックス、処理の進行状態を知るためのプログレスバー、取得開始をするためのボタン、処理が長引いた場合、途中でキャンセルするためのボタン、現段階で何件取得できているか表示させるラベルを配置します。

アプリケーションが開始されたらヘッドレスブラウザを起動します。このブラウザは見えないのですが、最初はどんな処理をしているのかが見えるようにしておいたほうがいいかもしれません。

結果はExcelファイルで保存する

実行ボタンが押されたときの処理を示します。urlがテキストボックスに入力されているかをチェックしたあと取得結果を保存するExcelファイルの保存場所を聞かれます。

保存先として適切な場所が指定されている場合はヘッドレスブラウザがそのUrlにアクセスして自作メソッドであるGetElementsWithScrollを呼び出します。このメソッドは自動的にスクロールしてページのデータを取得しようとします。

GetSaveExelFilePathメソッドはファイルを保存するためのダイアログを表示してユーザーに保存する場所を選択させます。

WheelAsyncメソッドでスクロールしながらElementHandleを取得する

GetElementsWithScrollメソッドはスクロールしながらデータを読み込み、そのなかにある要素を集めます。スクロールさせるためにはPuppeteerSharp.Page.Mouse.WheelAsyncメソッドを使えば簡単にできてしまいます。

基本的にすべての動画ページを集めたいのですが、スクロールすることでだんだんページの読み込み速度は下がります。また取得したデータが増えることでメモリの消費量も増えます。例外が発生したりページの読み込み速度が遅くなりすぎてループのなかで前回取得された件数と新しく取得された個数が同じ場合は全ページのデータを取得したとみなして(実はそうでないとしても)ループを抜けます。

集めたElementHandleからデータを抜き出す

GetElementsWithScrollメソッドを実行して要素を集めることができたら、ここから動画タイトルと動画urlを抜き出します。抜き出したデータを格納するDataクラスはGetDataFromElementsメソッドのあとに示します。

抜き出したデータを格納するDataクラスは以下のとおりです。タイトルと動画urlを格納するだけの簡単なものです。

結果をファイルとして保存する

Dataのリストが取得されたらこれを利用して動画タイトルと動画Urlが記載されたExcelファイルを作成します。

実際にやってみるとわかりますが、スクロールすることでだんだんページの読み込みに時間がかかるようになるため、動画を大量にアップしているチャンネルだと途中で処理がおわってしまいます。

HikakinTVでどれくらいの動画urlを集めることができるかやってみましたが、実際には1000件くらいしか集めることができません。スクロールしたあとの待機時間を長めに設定してみましたが、やはり途中で止まってしまいます。またメモリーもそんなに積んでいないPCだと処理を続行することはできなくなります。

ではどうするか? 実はチャンネル内検索をすることで期間を指定して動画の検索することができます。これを次回は使ってみることにします。夏休み最終日(サラリーマンには関係ないか)、頑張っていきましょう。