見出し画像

【エロプログラミング講座#5】例の保存ランキングの動画を自動で保存する

前回の続きです。



エロプログラミング講座#5

10.データベースの基礎

前回で動画一覧のURLを取得するところまでできました。

あとは動画のダウンロードを行うと、自動的にその時点のランキング入り動画の保存ができるのですが、一つ留意すべきことがあります。

ランキングというのは毎日更新されますが、かと言って全ての動画が入れ替わるわけではありません。絶大な人気を誇る動画については、2日3日連続でランキング入りしていることも珍しくないです。

となると、すでに保存済みの動画を再度ダウンロードすることになってしまいますよね。これでは通信やデータの無駄です。もちろん、同名ファイルは上書き保存となるので、データの重複は起こりませんが、何度も書き込みをするのはディスクに負荷がかかります。特に、毎日動かすとなると心配ですね。

なので、今回はダウンロード済みの動画をデータベースに追加していき、ダウンロード済みのものに関してはダウンロードをスキップする機能を追加します。


データベースの設計については正規化など奥が深く、プログラミング初学者が並行して学ぶのはオススメしません。

今回は動画のIDだけ格納すれば十分なので、「ID」、「ファイル名」、「日付」の3カラムのデータベースを作成します。

また、データベースにはMySQLやMariaDB、SQLiteと様々なRDBMS(リレーショナルデータベース管理システム)が存在しています。これは、例えばYouTubeとニコニコ動画、TikTokのように様々な動画サイトが存在するのと同じことです。それぞれ特性はありますが、基本的にデータベースを管理するという機能は変わりません。

MySQLが一番有名なRDBMSですが、こちらはサーバを作成する必要があるため、ローカルでデータベースファイルを管理できるSQLiteを使用していきます。

from bs4 import BeautifulSoup
import requests
import lxml
import base64
import re

def do_download(url: str, headers: dict = None):
    response = requests.get(url, headers = headers)
    match = re.search(r'[^/]+\.(mp4)', url)
    file_name = match.group()
    with open(file_name, 'wb') as f:
        f.write(response.content)

def decode_base64(s: str) -> str:
    decoded = base64.b64decode(s)
    decoded_str = decoded.decode('utf-8')
    return decoded_str.strip()

url = "aHR0cHM6Ly93d3cudHdpZG91Z2EubmV0L3JhbmtpbmdfdC5waHAK"
url = decode_base64(url)

user_agent = 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0'
header = {
        "User-Agent": user_agent,
}
response = requests.get(url, headers=header)
soup = BeautifulSoup(response.text, 'lxml')

div_poster = soup.find_all('div', attrs={'class': 'poster'})
for div in div_poster:
    a = div.find('a')
    if a:
        do_download(a.get('href'))
    else:
        continue

ここから先は

12,928字 / 2画像
この記事のみ ¥ 200

この記事が気に入ったらサポートをしてみませんか?