【Python~分享】爬取 m3u8 格式的视频文件,并将其中的 .ts 合并为 .mp4

注:由于我进行的并不是规范爬虫,每次爬都是有点心虚,所以下手对象也是一些不法网站QAQ,其中涉及敏感信息,所以就不给出网站URL,哈哈

而且当时是想爬全站,所以逻辑思路有些啰嗦,但后来感觉爬全站没意思,而且电脑容量放不下可能,所以就放弃了,所以这个代码,只能够处理单个页面的,目前
【(2019/2/6 11:09)更新备注:最近更新了谷歌,发现谷歌对于 selenium 给拦截了,所以 selenium 不能启动 Chrome 了,我还没有解决,最近在搭建 SSM 框架,忙~】

import requests
import bs4
from bs4 import BeautifulSoup
import os
import time
from selenium import webdriver
import re
import threading

index_html="http://www.***.com"
http_index="https://***.com"
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'}
dirPath="D:\\Tsdir\\"
tsListPath=r"D:\Tsdir\M3u8_List.txt"
tsList_Path=r"D:\Tsdir\tsList.txt"
tsList=[]
first_List_Url=[]
# def getFirstList():#获取所有一级导航菜单URL,并写入文件
#     try:
#         r=requests.get(r"http://www.***.com/",headers=header,timeout=20)
#         r.raise_for_status()
#         r.encoding=r.apparent_encoding
#         soup=BeautifulSoup(r.text,"html.parser")
#         first_list=soup.select("#menu-main-content a")
#         for each in first_list:
#             if each["href"]!="/":
#                 first_List_Url.append(index_html+each["href"])
#         print(first_List_Url)
#         path=dirPath+"FirstList.txt"
#         if not os.path.exists(path):
#             with open(path,"w") as f:
#                 for item in first_List_Url:
#                     f.write(item+"\n")
#     except:
#         print("获取一级菜单失败")
#getFirstList()

#EachHtmlOfEachVideoUrl=[]
# def getEachVideoHtml():#获取每一个页面的每一个视频页面的Url,并写入文件
#     r=requests.get(r"http://www.***.com/?m=vod-type-id-16.html",timeout=20,headers=header)
#     r.encoding=r.apparent_encoding
#     r.raise_for_status()
#     soup=BeautifulSoup(r.text,"html.parser")
#     listOf_a=soup.select(".videos li a")
#    # print(listOf_a)
#     for item in listOf_a:
#         EachHtmlOfEachVideoUrl.append(index_html+item["href"])
#     print(EachHtmlOfEachVideoUrl)
#     path=dirPath+"EachHtmlOfEachVideoUrl.txt"
#     if not os.path.exists(path):
#         with open(path,"a+") as f:
#             for i in EachHtmlOfEachVideoUrl:
#                 f.write(i+"\n")
#getEachVideoHtml()

EachVideoDir=dirPath+"firstOne\\"#每一个视频所存大量.ts文件的文件夹。包括:m3u8 协议
#VideoSrcs=[]
#http://www.***.com/?m=vod-play-id-19917-src-1-num-1.html

def getHtml_by_selenium(page_video_src):#获取每一个视频页面html,并提取iframe中的src,将src写入对应视频的文件夹的txt中
    try:
        browser = webdriver.Chrome()
        #browser.maximize_window()
        browser.get(page_video_src)
        iframe=browser.find_element_by_xpath("//td[@id='playleft']/iframe[2]")
        src=iframe.get_attribute("src")
        #VideoSrcs.append(src)#将此视频中的src加入到所有src数组中
        #追加写入文件
        if not os.path.exists(EachVideoDir):#创建每个视频的文件夹
            os.mkdir(EachVideoDir)
        path=EachVideoDir+"page_src.txt"
        if not os.path.exists(path):
            with open(path,"w") as f:#只需要写入一条就可以了
                f.write(src)
        browser.close()
    except:
        print("申请网站主页面失败")
#getHtml_by_selenium()

def getIframeSrc():
    # 获得script标签中的main内容,来制作一个连接,其对应的连接中存在m3u8的真正地址
    with open(EachVideoDir + "page_src.txt", "r") as f:
        url = f.read()
    try:
        r = requests.get(url, headers=header, timeout=20)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup = BeautifulSoup(r.text, "html.parser")
        script = soup("script", {"type": "text/javascript"})
        text = script[0].string
        m3u8 = re.compile('var main = ".*?"').findall(text)
        m3u8_Url = m3u8[0].split('"')
        True_m3u8 = http_index + m3u8_Url[1]
        print("获取m3u8后缀地址链接为--")
        print(True_m3u8)
        return True_m3u8
    except:
        print("申请iframe src失败")
    # print(True_m3u8)

# def getSuffix():
#     with open("D:\\Tsdir\\m.txt","r") as f:
#         Suffix=f.read()
#     return Suffix

def getFileM3u8(True_m3u8):
    # 访问并获得真正的m3u8 连接地址
    try:
        rm = requests.get(True_m3u8, headers=header, timeout=20)
        rm.raise_for_status()
        Prefix = True_m3u8.split("/")
        print("m3u8文件内容为--")
        print(rm.text)
        #print(Prefix)
        Suffix = rm.text.split("\n")[-1]
        together_url = Prefix[0] + "//" + Prefix[2] + "/" + Prefix[3] + "/" + Prefix[
            4] + "/" + Suffix  # 真正的包含大量.ts文件的m3u8连接地址
        print("m3u8真实内容链接地址--")
        print(together_url)
        # 将m3u8连接地址写入.txt文件
        if not os.path.exists(EachVideoDir):
            os.mkdir(EachVideoDir)
        path = EachVideoDir + "m3u8.txt"
        if not os.path.exists(path):
            with open(path, "w") as f:
                f.write(together_url)
        return together_url  # 返回m3u8地址
    except:
        #Suffix=getSuffix()
        print("申请m3u8文件失败")

def getTs(together_url):
    # 访问地址
    try:
        rr = requests.get(together_url, headers=header, timeout=20)
        rr.raise_for_status()
        iop = rr.text.split("\n")
        if not os.path.exists(EachVideoDir):
            os.mkdir(EachVideoDir)
        Path = EachVideoDir + "ts.txt"  # 写入ts.txt
        if not os.path.exists(Path):
            with open(Path, "w") as f:
                for eachitem in iop:
                    if "#EXT" in eachitem:
                        pass
                    else:
                        f.write(eachitem + "\n")
    except:
        print("申请ts列表文件失败")

def getM3u8():#获取真实的m3u8文件,并将其写入所对应的视频的文件的m3u8.txt中
    True_m3u8=getIframeSrc()
    together_url=getFileM3u8(True_m3u8)
    getTs(together_url)
    return together_url

def getTsExist():#获取ts文件的每一个小ts文件链接,发挥一个列表
    with open(EachVideoDir+"ts.txt","r") as f:
         x=f.read().split("\n")
    return x
#tss=getTsExist()#获取一个ts列表

def getTsVideo(m3,tss):
    little=m3.split("/")
    little=little[0]+"//"+little[2]+"/"+little[3]+"/"+little[4]+"/"+little[5]+"/"+little[6]+"/"
    eachvideots=[]
    for item in tss:
        eachvideots.append(little+str(item))
    return eachvideots
#m3 = getM3u8()
#eachvideos=getTsVideo(m3)#获取每个ts的真实完全连接
def writeTsToFile(*eachvideos):
    if not os.path.exists(EachVideoDir):
        os.mkdir(EachVideoDir)
    for eachitem in eachvideos:
        try:
            r=requests.get(eachitem,headers=header,timeout=20,stream=True)
            r.raise_for_status()
            #处理ts文件存储路径
            ss=eachitem.split("/")[-1]
            path=EachVideoDir+ss
            if not os.path.exists(path):
                with open(path,"wb") as f:
                    f.write(r.content)
        except:
            continue
#writeTsToFile()

def ThreadsDownload(eachvideos):
    lines=5
    print("开始下载,线程数为--{}".format(lines))
    lenOfV = len(eachvideos)
    eachPice=(int)(lenOfV/lines)
    vodeo=[]
    for index in range(lines-1):
        vodeo.append(eachvideos[index*eachPice:(index+1)*eachPice])
    vodeo.append(eachvideos[(lines-1)*eachPice:lenOfV])
    # 多线程下载
    threads = []
    for index in vodeo:
        thread=threading.Thread(target=writeTsToFile,args=(index))
        threads.append(thread)
        thread.setDaemon(True)
        thread.start()
    for item in threads:
        item.join()

if __name__ == '__main__':
    #Suffix=getSuffix()
    #http://www.***.com/?m=vod-play-id-20213-src-1-num-1.html
    """
    使用简介:
        变量 page_video_src 用来存放电影所在页面地址,上面注解即是例子
        爬取小视频存放在D盘Tsdir目录下,使用前需将文件夹清空
        爬取完毕后,使用cmd命令将视频合成一个视频
        copy /b "D:\Tsdir\firstOne\*.ts" "D:\Tsdir\firstOne\mv.mp4"
    """
    page_video_src=r'http://www.***.com/?m=vod-play-id-47871-src-1-num-1.html'

    getHtml_by_selenium(page_video_src)#获取iframe src
    m3 = getM3u8()
    tss=getTsExist()
    eachvideos = getTsVideo(m3,tss)
    ThreadsDownload(eachvideos)#多线程下载
    #writeTsToFile(eachvideos)#单线程下载
    print("下载完成")
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python虫是一种非常强大的工具,它可以被用于多种目的,其中包括视频信息和文件。如果需要视频_index.m3u8_ts.rar文件,以下是一些步骤和技巧: 1. 确定目标:首先需要确定要视频_index.m3u8_ts.rar文件的URL地址,可以在浏览器中打开开发者工具(如Chrome的“开发者工具”),在“网络”选项卡下查找请求的URL地址。 2. 使用Python虫:Python虫的主要模块包括requests、BeautifulSoup等,可以使用它们来获请求的URL地址,并将响应的数据解析为所需的文件。 3. 使用正则表达式:视频的_index.m3u8_ts.rar文件通常是一个较大的文件,其中包含多个链接URL地址。可以使用Python中的正则表达式来提所需的文件链接,并将它们存储为一个列表。 4. 下载文件:获文件链接后,可以使用Python的requests模块下载视频_index.m3u8_ts.rar文件到本地。 5. 文件处理:下载完成后,可以使用Python中的常用文件处理工具(如os、shutil等)进行文件重命名、移动或其他操作。 总的来说,Python虫是一种非常灵活和高效的工具,可以大大简化获和处理视频_index.m3u8_ts.rar文件的过程。但是需要注意的是,文件时需要遵守相关法律法规和网站协议,以免触犯法律或侵犯他人利益。 ### 回答2: 要使用Python视频_index.m3u8_ts.rar文件,需要以下几个步骤: 1. 确认网站和视频资源的URL:首先需要确认想要视频文件所在的网站和URL链接。可以使用Python中的requests库发起HTTP请求获网址的HTML源代码,并从中解析出视频链接的URL。 2. 根据视频链接的URL获文件:获视频链接的URL之后,需要使用Python中的requests库再次发起HTTP请求,获视频文件的二进制数据。一般情况下,在请求中需要设置请求头部信息和一些参数,以便获得正确的内容。 3. 下载和解压文件:在获视频文件数据之后,需要将其保存为本地的视频文件视频文件有可能是一个压缩包,如.rar或.zip文件,因此还需要使用Python中的解压缩库来进行解压操作。 4. 根据视频文件生成m3u8文件:在解压出视频文件的内容之后,需要使用Python编写脚本解析视频文件,并生成相应的m3u8文件。m3u8是一种视频资源格式,包含了可以分片下载的视频资源地址列表,可以使用播放器播放m3u8视频资源。 以上是视频_index.m3u8_ts.rar的一般流程,具体实现方法会因网站和视频资源的不同而有所差异,需要针对具体情况进行调整。同时,视频资源时需要尊重版权,遵守相关法律法规并遵守网站的规定,不进行盗版、侵权、篡改等行为。 ### 回答3: 首先,需要了解m3u8文件的基本概念。m3u8是指一种基于HTTP Live Streaming (HLS)协议的音视频播放列表格式,它是由苹果公司首先提出的。m3u8文件中包含了多个ts文件的链接地址,ts文件中则包含了音视频数据。因此,如果成功获了m3u8文件并解析出其中的ts文件链接地址,就可以成功抓指定的音视频数据了。 那么如何使用Python实现这个任务呢?以下是一些基本的步骤: 1. 网络请求:使用requests库或urllib库向网站发送请求,获网站源代码。 ``` python import requests url = "http://example.com/video_index.m3u8" response = requests.get(url) html = response.text ``` 2. 正则表达式匹配:从网站源代码中提.m3u8和ts文件链接地址。 ``` python import re pattern = "(http://.*?\.m3u8)" m3u8_url = re.findall(pattern, html)[0] pattern = "(http://.*?\.ts)" ts_urls = re.findall(pattern, html) ``` 3. 下载.m3u8文件:使用requests库下载.m3u8文件。 ``` python m3u8_response = requests.get(m3u8_url) m3u8_text = m3u8_response.text ``` 4. 提.ts文件链接:从.m3u8文件中提所有.ts文件的链接。 ``` python ts_urls = [] for line in m3u8_text.split("\n"): if line.endswith(".ts"): ts_url = line if not ts_url.startswith("http"): ts_url = m3u8_url.rsplit("/", 1)[0] + "/" + ts_url ts_urls.append(ts_url) ``` 5. 下载.ts文件:使用多线程或异步IO方式同时下载多个.ts文件。 ``` python import threading import urllib.request def download_ts(ts_url, output_path): urllib.request.urlretrieve(ts_url, output_path) threads = [] for i, ts_url in enumerate(ts_urls): thread = threading.Thread(target=download_ts, args=(ts_url, f"video_{i}.ts")) threads.append(thread) thread.start() for thread in threads: thread.join() ``` 6. 合并.ts文件:使用ffmpeg或moviepy库将多个.ts文件合并为一个完整的视频文件。 至此,我们便成功用Python实现了视频的抓合并。需要注意的是,具体实现可能会根据不同的网站有所变化,这里只是提供一个基本的思路。此外,网络虫本身是一项敏感而受限的技术,建议在遵守法律和道德规范的前提下使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值