LoginSignup
0
1

More than 1 year has passed since last update.

Pythonで大量にあるYouTubeの動画をランダムにアクセスしてみた

Last updated at Posted at 2021-05-30

初めての投稿です。

YouTubeの仕様

YouTubeの動画のURLは以下のようなものである。
https://www.youtube.com/watch?v=XqZsoesa55w
ちなみにこの動画は2021年3月現在で最も再生されているYouTube動画の
Pinkfong! Kids' Songs & Stories チャンネルの
Baby Shark Dance | #babyshark Most Viewed Video | Animal Songs | PINKFONG Songs for Children」である。1

YouTubeの動画を見分けるものはURLの/watch?v=のあとの最後の11桁である。
XqZsoesa55w

この11桁は通称IDと呼ばれ、以下の文字からランダムに11桁が選ばれる。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

これは、大文字、小文字のすべてのアルファベット、数字、そして-_を足したもので、これで64(= 2^6)個になるので都合が良いとされる。

つまり、この中からランダムに11文字選び、そのIDでできたURLでYouTubeにランダムにアクセスすればランダムに動画が見れるのではないか!?と思った。

コード

youtube.py
from urllib import request, parse, error
import json
import random

chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
chars_list = [char for char in chars]
id_len = 11

while True:
    video_id = ''.join(random.choices(chars_list, k = id_len))

    params = {'format': 'json', 'url': 'https://www.youtube.com/watch?v=' + video_id}
    url = 'https://www.youtube.com/oembed'
    query_string = parse.urlencode(params)
    url = url + '?' + query_string

    try:
        with request.urlopen(url) as response:
            response_text = response.read()
            data = json.loads(response_text.decode())
            print('URL: {}\nTitle: {}'.format(params['url'], data['title']))
        break
    except error.HTTPError:
        continue

参考サイト:
Get title from YouTube videos - Stack Overflow
Pythonでリストからランダムに要素を選択するchoice, sample, choices | note.nkmk.me

解説

すべての文字のstr型をつくり、そこから内包表記でlistにする。

5-6行目
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
chars_list = [char for char in chars]

charsListから11文字を重複ありで選び、できたlistを繋げて一つのstrにする。

10行目
    video_id = ''.join(random.choices(chars_list, k = id_len))

YouTubeのタイトルなどをJSONにして表示してくれるサイトのためURL作り。

12-15行目
    params = {'format': 'json', 'url': 'https://www.youtube.com/watch?v=' + video_id}
    url = 'https://www.youtube.com/oembed'
    query_string = parse.urlencode(params)
    url = url + '?' + query_string

動画が存在したらURLとタイトルをprint()。存在していなかったらurllib.error.HTTPErrorを吐くので、continueして次の動画を探す。

17-24行目
    try:
        with request.urlopen(url) as response:
            response_text = response.read()
            data = json.loads(response_text.decode())
            print('URL: {}\nTitle: {}'.format(params['url'], data['title']))
        break
    except error.HTTPError:
        continue

実用性

公式には公表されていないが、2020年現在、YouTubeには261億の動画が存在すると言われている。2
先程の方法で11桁のIDを生成すると、
64 ^ 11 = 73,786,976,294,838,206,464
つまり7400垓ほどの動画URLを生成することができる計算になる。

先程のプログラムは私の環境下では1000個の動画URLを探すのに116.5528198秒かかった。
ここから、
64^11 / 26100000000 * (116.5528198/1000) = 329504986.6543735305806048730728
つまり1つの動画に当たるのに平均で3.3億秒ほどかかる計算となる。

これはつまり、
329504986.6543735305806048730728 / 60 / 60 / 24 / 365.25 = 10.441382952264225751660610219814
と、10年5ヶ月ほどとなる。

10年強ほどプログラムを回し続けることができる方は試してみてはいかがでしょうか。
ちなみに私はまだ見つけられていません。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1