爬取m3u8格式文件并下载ts文件转换为MP4文件

现在网上电影在线观看基本都是m3u8格式,或者经过js加密后的m3u8格式,一般来说爬m3u8文件,先刷新电影找到以m3u8结尾的文件,然后双击就将该文件下载下来,然后用记事本打开m3u8文件找到以ts文件结尾的路径并和该网站域名进行拼接,将拼接后的地址放到浏览器中会提示下载该ts文件。这时候恭喜你成功一大半了,之后就想办法把m3u8文件里的ts文件循环下载下来然后合成一个mp4文件就可以了

插入代码
import threading
import requests
from queue import Queue
import time
import os    
def get_url(m3u8,wangzhangurl):
    if not os.path.exists("download"):#创建要下载文件的文件夹
        os.mkdir("download")
    with open(m3u8, 'r', encoding='utf-8') as pf:
        content = pf.readlines()#读取m3u8文件
        for i in content:
            url_half = i.strip()
            if  url_half.endswith("ts"):#对该文件进行处理并拼接完成的url,该url文件可以获得ts文件,每个m3u8文件和电影网站域名的拼接方式都不一样,需要自己尝试拼接
                url_evey = wangzhangurl + url_half
                #将文件放入队列
                response_q.put(url_evey)
class Consumer(threading.Thread):
    def __init__(self, j):
        #1.继承父类init:
        super().__init__()
        self.j= j      
    def run(self):
        ##线程不能只干一个任务就退出,需要不断取任务:
        while True:
            ##停止条件:消费者任务队列为空
            if response_q.empty():
                break
            try:#运用多线程爬ts文件
                url_full = response_q.get(block=False)
                name=str(url_full)[-20::]
                print(f'======{self.j}执行任务===')
                self.get_movie(url_full,name)
                print(f'======{self.j}任务完成===')
            except:
                pass
    # 二、解析函数:
    def get_movie(self,urlfull, name):#爬取ts文件并保存
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
        response = requests.get(url=urlfull, headers=headers).content
        with open("download\%s" % name, "wb") as pf:
                pf.write(response)
def merge_ts():#定义ts合成转换MP4函数
#获取当前文件夹地址并合并下载文件夹地址
    file_path=os.getcwd()+"\download"
    file_list = os.listdir(file_path)
    file_list.sort()¥#对下载的ts文件进行排序
   #编写合并转化命令
    shell_strs = 'copy /b ' + file_path + "\*.ts " + file_path + "\我的老婆是大佬.mp4"
   #运行该命令
    os.system(shell_strs)
response_q = Queue()##消费者队列
#m3u8文件的路径
m3u8=r"C:\Users\Administrator\Desktop\新建文件夹\index.m3u8"
#和m3u8文件里拼接成整个ts文件的网站的地址
wangzhangurl=r"https://56.com-ok-bilibili.com/20190926/31754_e5277946/1000k/hls/"
if __name__ == '__main__':
    get_url(m3u8, wangzhangurl)
    start_time = time.time()
    consumer_name = ['c1', 'c2', 'c3','c4','c5','c6','c7']
    c_tread = []
    ##多线程
    for j in consumer_name:
        c_crawl = Consumer(j)
        c_crawl.start()
        c_tread.append(c_crawl)
    ##多线程阻塞主线程
    for treadi in c_tread:
        treadi.join()
    end_time = time.time()
    merge_ts()
    print(f'===========任务耗时{end_time-start_time}==========')





你可能感兴趣的:(学习)