【Python】asyncio協(xié)程異步批量下載視頻

#!/usr/bin/env python3
# coding: utf-8

import os, time
import pathlib
import aiohttp
import asyncio
from urllib import parse

def to_video_name(url):
    '''
    根據(jù)URL創(chuàng)建存儲目錄并生成視頻文件名
    '''
    to_string = parse.urlparse(url)
    # 存儲目錄,使用絕對路徑误辑,例如/root/video
    video_dir = os.getcwd() + os.path.dirname(to_string.path)
    # 創(chuàng)建目錄,目錄不存在則創(chuàng)建,即使目錄已存在也不會拋出異常
    pathlib.Path(video_dir).mkdir(parents=True, exist_ok=True)
    # 文件名津畸,使用絕對路徑蕉陋,例如/root/video/to1.mp4
    video_name = video_dir + "/" + os.path.basename(to_string.path)
    return video_name
    
async def fetch(session, url):
    r = None
    ct = 0
    
    # 請求頭部
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.1.4753.73 Safari/527.56 Edg/102.1.4753.73",
        "Accept-Encoding": "identity"
    }
    # 請求URL雹舀,例如http://www.example.com/video/to1.mp4
    url = url
    # 失敗重試次數(shù)
    retry = 5
    
    # 傳入完整的URL,然后根據(jù)URL生成視頻文件名
    video_name = to_video_name(url)

    while ct < retry:
        try:
            async with session.get(url=url, headers=headers) as r:
                if r.status == 200:
                    #start_time = time.time()
                    with open(video_name, 'wb') as fp:
                        async for chunk in r.content.iter_chunked(4194304):
                            fp.write(chunk)
                    #end_time = time.time()
                    #print(end_time-start_time)
                    return r
        except Exception as e:
            pass
        ct += 1
    return r
            
async def main(url_list):
    # url_list是URL列表
    start_time = time.time()
    timeout = aiohttp.ClientTimeout(connect=5)
    conn = aiohttp.TCPConnector(ssl=False, limit=10)
    async with aiohttp.ClientSession(timeout=timeout, connector=conn, raise_for_status=True) as session:
        tasks = [asyncio.create_task(fetch(session, url)) for url in url_list]
        results = await asyncio.gather(*tasks)
        [print(result.status, result.url) for result in results]
    end_time = time.time()
    print("Total time:", end_time-start_time)

if __name__ == "__main__":
    import sys
    url_file = sys.argv[1]
    with open(url_file, "r") as fp:
        url_list = [url.strip("\n") for url in fp.readlines()]
    asyncio.run(main(url_list))
root@ubuntu:/tmp/py# cat url_list.txt 
http://192.168.3.120/video/01a.mkv
http://192.168.3.120/video/02a.mkv
http://192.168.3.120/video/03a.mkv
root@ubuntu:/tmp/py# 
root@ubuntu:/tmp/py# ./down2video.py url_list.txt 
200 http://192.168.3.120/video/01a.mkv
200 http://192.168.3.120/video/02a.mkv
200 http://192.168.3.120/video/03a.mkv
Total time: 0.17106056213378906
root@ubuntu:/tmp/py# 
root@ubuntu:/tmp/py# tree 
.
├── down2video.py
├── url_list.txt
└── video
    ├── 01a.mkv
    ├── 02a.mkv
    └── 03a.mkv

1 directory, 5 files
root@ubuntu:/tmp/py# 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末院尔,一起剝皮案震驚了整個濱河市蜻展,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邀摆,老刑警劉巖纵顾,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栋盹,居然都是意外死亡施逾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門例获,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汉额,“玉大人,你說我怎么就攤上這事躏敢∶品撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵件余,是天一觀的道長讥脐。 經(jīng)常有香客問我,道長啼器,這世上最難降的妖魔是什么旬渠? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮端壳,結(jié)果婚禮上告丢,老公的妹妹穿的比我還像新娘。我一直安慰自己损谦,他們只是感情好岖免,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著照捡,像睡著了一般颅湘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栗精,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天闯参,我揣著相機與錄音,去河邊找鬼悲立。 笑死鹿寨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薪夕。 我是一名探鬼主播脚草,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼原献!你這毒婦竟也來了玩讳?” 一聲冷哼從身側(cè)響起涩蜘,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熏纯,沒想到半個月后同诫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡樟澜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年误窖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秩贰。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡霹俺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毒费,到底是詐尸還是另有隱情丙唧,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布觅玻,位于F島的核電站想际,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溪厘。R本人自食惡果不足惜胡本,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畸悬。 院中可真熱鬧侧甫,春花似錦、人聲如沸蹋宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冷冗。三九已至守屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贾惦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工敦捧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留须板,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓兢卵,卻偏偏與公主長得像习瑰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秽荤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容