【エロプログラミング講座#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
この記事が気に入ったらサポートをしてみませんか?