年ごとにわけてチャンネルの全動画のurlを取得する

前回作成したアプリはアップロード件数が多いと取得することができませんでした。そこでYouTubeにはチャンネル内の検索機能があること、検索するときに「after:2020-01-01 before:2020-06-30」とやれば動画がアップロードされた時期を限定して検索することができることを利用して、期間を区切って動画urlを取得します。1年単位であればそんなに大量の動画をアップすることができないので、なんとかなりそうです。

これは私のチャンネルをafter:2021-01-01 before:2021-08-31で検索したときのurlです。
https://www.youtube.com/channel/UCp5XB6e_VOKA0q6KENw-hlQ/search?query=after%3A2021-01-01%20before%3A2021-08-31

YouTubeは設立が2005年2月ですから
https://www.youtube.com/channel/XXXXXX/search?query=after%3A2005-01-01%20before%3A2005-12-31
https://www.youtube.com/channel/XXXXXX/search?query=after%3A2006-01-01%20before%3A2006-12-31
https://www.youtube.com/channel/XXXXXX/search?query=after%3A2007-01-01%20before%3A2007-12-31
とやっていけば全部取得できそうです。

チャンネルのurlには複数のタイプがある

ところがそんな簡単な問題ではないようです。チャンネルのUrlがhttps://www.youtube.com/channel/XXXXXX/ではなく別のタイプのものがあります。それでもチャンネルのUrlの最後に/search?query=after%3A2019-01-01%20before%3A2019-12-31をつければ検索結果は得られます。それではやっていきましょう。

調査対象としてテキストボックスに入力するのはチャンネルのurlです。このあとに/search?query=after%3A20XX-01-01%20before%3A20XX-12-31を追加して結果を調べさせます。

XPathで動画urlをゲット?

取得する要素を指定する場合はXPathを使います。HTMLを調べた結果、前回の記事同様、

でよいことがわかりました。

それと同時に前回の方法ではXPathを指定することで取得された要素から

前回との相違点について

とすればよかったのですが、今回はその方法ではリンクは取得できるのですが、アンカーテキストは取得できません。よくよくHTMLソースを調べてみると以下のようになっていました。でもこれならGetPropertyAsync(“textContent”)ではなく、GetPropertyAsync(“title”)とすれば動画タイトルは取得できますよね。

あとはコードを書くだけです。

コードを書く

前回のプログラムではForm1のコンストラクタのなかでヘッドレスブラウザを起動させていましたが、この処理は前回と完全に同じなので省略します。あと取得されたデータをExcelファイルとして保存するところも完全に同じなので詳しくは前回の記事を参照してください。

UIの変更

前回の記事と異なる部分を示します。といってもほとんど同じです。ひとつのチャンネルから情報を得るために複数の検索処理をしなければならないので、プログレスバーをもうひとつ追加しました。

以前のプログレスバーにはその年ごとの取得した要素から動画タイトルと動画urlを取得する処理がどれだけ完了したか、ふたつめのプログレスバーには2005年にYouTubeが発足してから今年までのうち、どれだけ情報を取得できたかを示しています。

時間がかかる処理はどれだけ処理が進んでいるのかをプログレスバーなどをつかって表示したほうが、使う側もどれくらい待てばいいかわかるので新設設計というものです。

変更点はちょっとだけ

それでは検索結果を取得するためのボタンを押したときの処理を示します。

変更点は少ししかありません。大きな変更といえば、チャンネルurlから検索結果を表示させるurlを取得している部分です。それ以外の変更はプログレスバーをふたつにしたのと取得されるのは動画のなかに再生リストが混在するのでそれを取り除く処理をしているだけです。