Python3——根據m3u8下載視頻(下)之requests


       下半場ING,好吧,本來准備明天寫的(拖延真快樂.gif),請然而,,,早上八點多跑公司加班(看書+學習)去,發現大門上掛着一把大鎖,我只想說門禁是拿來看的嘛,加啥破鎖o(╥﹏╥)o,嚴重打擊了好員工的加班熱情[○·`Д'·○],所以滾回來寫博客了,憂傷,寫了點代碼還踩了半天坑(偷懶惹的禍),憂傷10086 ...


         7.31號上午,也就是離職那天,機智的我突然想到,requests.get()下載文件實際是獲取到的二進制內容然后寫入到自己創建的文件中,以此來實現下載圖片,文檔,視頻和等等,既然如此,那我直接打開已有的視頻文件將新獲取的二進制內容添加到后面,不就可以更直接的解決ts流合並的問題了嘛,機智如我,立刻進行了嘗試,特意注意了文件打開和寫入時的編碼問題,果然搞定了,,,然后下午跑去簽離職協議,完美收工。

運行環境:windows和linux(注意修改下路徑),python36

代碼如下:

​
# !/user/bin/env python
# -*- coding: utf-8 -*-
# au: caopeiya
# 201808011
import os, shutil
import urllib.request, urllib.error, requests


# 打開並讀取網頁內容
def getUrlData(url):
    try:
        urlData = urllib.request.urlopen(url, timeout=20)  # .read().decode('utf-8', 'ignore')
        # urlData = requests.get(url, timeout=20)  # .read().decode('utf-8', 'ignore')
        return urlData
    except Exception as err:
        print(f'err getUrlData({url})\n', err)
        return -1


# 下載文件-requests
def getDown_reqursts(url, file_path):
    try:
        header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}
        response = requests.get(url, timeout=120, headers=header)
        with open(file_path, mode='ab+') as f:
            f.write(response.content)
        # 下載文件較大時,使用循環下載
        # with open(file_path, mode='wb') as f:
        #     for content in response.iter_content(1024):
        #         f.write(content)
        print("down successful!")
    except Exception as e:
        print(e)


def getVideo_requests(url_m3u8, path, videoName):
    print('begin run ~~\n')
    urlData = getUrlData(url_m3u8)
    tempName_video = os.path.join(path, f'{videoName}.ts')  # f'{}' 相當於'{}'.format() 或 '%s'%videoName
    open(tempName_video, "wb").close()  # 清空(順帶創建)tempName_video文件,防止中途停止,繼續下載重復寫入
    # print(urlData)
    for line in urlData:
        # 解碼decode("utf-8"),由於是直接使用了所抓取的鏈接內容,所以需要按行解碼,如果提前解碼則不能使用直接進行for循環,會報錯
        url_ts = str(line.decode("utf-8")).strip()  # 重要:strip(),用來清除字符串前后存在的空格符和換行符
        if not '.ts' in url_ts:
            continue
        else:
            if not url_ts.startswith('http'):  # 判斷字符串是否以'http'開頭,如果不是則說明url鏈接不完整,需要拼接
                # 拼接ts流視頻的url
                url_ts = url_m3u8.replace(url_m3u8.split('/')[-1], url_ts)
        print(url_ts)
        getDown_reqursts(url=url_ts, file_path=tempName_video)  # 下載視頻流
    filename = os.path.join(path, f'{videoName}.mp4')
    shutil.move(tempName_video, filename)
    print(f'Great, {videoName}.mp4 finish down!')


if __name__ == '__main__':
    url_m3u8 = 'http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/index.m3u8'
    path = r'D:\\'
    videoName = url_m3u8.split('/')[-2]
    getVideo_requests(url_m3u8, path, videoName)
    # getDown_reqursts('http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/147.ts', f'D:/videos/84.ts')

​

  

要注意以下幾點:

                     1.用於解碼(“utf-8”)進行解碼,由於循環獲取的每一行t都是是ASCII編碼,必須解碼為utf-8才能變為可識別的字符串;

                       2.用.strip()去除每一行的空格符和換行符,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM