torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

Pythonでマルチプロセス(動画ダウンロード)

Python Python並行並列処理
2016年2月1日13:53
今回はPythonでマルチプロセスを使っています

https://torina.top/main/226/
こちらの動画ダウンロードは、ページから動画情報の取得(スクレイピング)とダウンロードを順番に行っていたため
一回一回動画ダウンロードが終わるまで待たなくていけませんでした
マルチプロセスを使いURLを先にいくつか入力できるようにします

今回はわかりやすく、動画のダウンロード用のプロセスを1つのみ作っています
from multiprocessing import Process, JoinableQueue
import urllib
import shutil
from bs4 import BeautifulSoup
import requests


def download(flv_queue):
    while True:
        flash = flv_queue.get()
        flv_url = flash.get("flv_url")
        flv_id = flash.get("id_video")
        print(flv_id, "ダウンロード開始")
        res = requests.get(flv_url, stream=True)
        with open(flv_id+".flv", "wb") as file:
            shutil.copyfileobj(res.raw, file)
        flv_queue.task_done()
        print(flv_id, "ダウンロード終了")


def parse(url, flv_queue):
    print(url, "flvファイル情報の取得")
    res = requests.get(url)
    soup = BeautifulSoup(res.text, "html5lib")
    # xvideosならば、これで動画情報を色々取得できる。動画サイトによってコードは変わる
    flash = {s[0]: urllib.parse.unquote(s[1]) for s in map(
        lambda x: x.split("="),
        soup.find("embed").get("flashvars").split("&"))}
    flv_queue.put(flash)
    print(url, "ファイル情報の取得完了")


if __name__ == "__main__":
    flv_queue = JoinableQueue()
    download_worker = Process(target=download, args=(flv_queue,), daemon=True)
    download_worker.start()
    while True:
        print("「exit」入力で終わり")
        input_url = str(input())
        if input_url == "exit":
            break
        parse(input_url, flv_queue)

    print("ダウンロードの完了を待っています")
    flv_queue.join()
    input("終了しました。何かキーを押すと終了します")