爬取ts類型視頻文件並且合並成mp4文件


# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/12/21 上午8:51
# @Author : SR
# @Email : srcoder@1163.com
# @File : spider.py
# @Software: PyCharm

import os

import requests

from multiprocessing.pool import ThreadPool


class SpiderMovieFromChenYu:
    def __init__(self, save_ts_path, save_movie_path, fail_ts_list=[], ):

        self.save_ts_path = save_ts_path
        self.save_movie_path = save_movie_path
        self.fail_ts_list = fail_ts_list

        self.headers = {
            'Referer': 'http://www.chenyutv.com/',

            'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
        }

    def mkdir_directory(self):
        if not os.path.exists(self.save_ts_path):
            os.mkdir(self.save_ts_path)
        if not os.path.exists(self.save_movie_path):
            os.mkdir(self.save_movie_path)

    def get_ts(self, number, flag=False):

        play_url = 'https://sina.com-h-sina.com/20180815/9998_f9aa34bf/1000k/hls/c0cdc4673f4%03d.ts' % number

        ts_number = play_url.split('/')[-1]  # 獲取ts編號

        if ts_number not in os.listdir(self.save_ts_path):  # 判斷該ts是否已經下載

            try:
                session = requests.session()
                response = session.get(play_url, headers=self.headers, timeout=60)  # 進行數據請求

                if response.status_code == 200:

                    with open(os.path.join(self.save_ts_path, ts_number), 'wb') as f:  # 讀取文件
                        f.write(response.content)  # 寫入數據
                        f.close()
                        if flag:  # 判斷失敗的ts再一次下載是否成功 
                            self.fail_ts_list.remove(number)  # 如果成功從失敗列表移除
            except Exception as e:

                #  判斷失敗的ts文件序號是否已經存在在失敗的列表下
                if number not in self.fail_ts_list:
                    #  不存在添加到ts列表中
                    self.fail_ts_list.append(number)

    def check_ts(self):
        print("開始檢查:")
        print(self.fail_ts_list)
        while self.fail_ts_list:  # 通過判斷列表是否有值進行數據循環
            for number in self.fail_ts_list:  # 獲取單個的ts文件序號
                self.get_ts(number, True)  # 數據下載
                print("%s:下載完畢" % number)
                print(self.fail_ts_list)
        print("ts 文件下載完成!")
        self.get_video()  # 下載成功之后將數據轉換成mp4文件

    def get_video(self):

        ts_list = os.listdir(self.save_ts_path)  # 獲取所有的ts文件
        ts_list.sort()  # 將ts文件進行排序
        ts_lists = [ts for ts in ts_list]

        for ts in ts_lists:
            with open(os.path.join(self.save_ts_path, ts), 'rb') as f1:
                with open(os.path.join(self.save_movie_path, '明日的我與昨日你的約會.mp4'), 'ab') as f2:
                    f2.write(f1.read())
                    print("%s:寫入完成" % ts)


if __name__ == '__main__':
    min_number = int(input('請輸入ts的起始數字>>:').strip())
    max_number = int(input('請輸入ts的結尾數字>>:').strip()) + 1
    save_ts_path = input('請輸入ts保存文件路徑>>:').strip()
    save_movie_path = input('請輸入視頻保存文件路徑>>:').strip()

    spider = SpiderMovieFromChenYu(save_ts_path, save_movie_path)
    spider.mkdir_directory()
    pool = ThreadPool(100)
    pool.map(spider.get_ts, range(min_number, max_number))
    pool.close()
    pool.join()

    spider.get_ts()


免責聲明!

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



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