Python 网络爬虫 多线程下载 m3u8视频文件

40 篇文章 0 订阅
3 篇文章 0 订阅

Python 网络爬虫 多线程下载 m3u8视频文件


你们都懂的,m3u8 事实上是一个视频列表文件,类似于直播流。不太好下载。里面是包含了全部视频碎片的地址。 我们可以将这些视频小文件下下来,合并后就成一个完整的视频。

下面是 down.py 的代码,略粗糙,权当大家一起学习研究了。
当然现在有很多可以下 m3u8的,发出这个,只是学习python之用。

from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.error import HTTPError
import requests
import chardet
import sys
import pymysql
import random
import time
import os
import _thread


		

def savefile(fname,fcontent):
	with open("video4/"+fname,"wb") as f:
		f.write(fcontent)
	return 1


def getnewname(tmp):
	if tmp<=9:
		strtmp="v_00{0}.ts".format(tmp)
	
	elif tmp<=99 and tmp>9:
		strtmp="v_0{0}.ts".format(tmp)
	else:
		strtmp="v_{0}.ts".format(tmp)
	return strtmp

def getrooturl(result):
	data=result.split('\n')
	ds=data[-3].split('.ts')[0]
	maxlen=int(ds.split('v_')[1])
	rooturl=mainurl.split('v3.m3u8')[0]
	
	return maxlen,rooturl

def  downthread(tname,id,init,max,root):
	
	eachmax=int((max-init)/30)+1
	
	
	if id==1:
		startpos=init
		endpos=init+eachmax
	else:
		startpos=init+(id-1)*eachmax
		endpos=startpos+eachmax
	print(tname," 正在尝试 ",startpos,endpos)
	
	i=startpos
	
	if endpos>max:
		endpos=max 
		
	while i<=endpos:
		tmp=i
		tmpstr=getnewname(tmp)
		i=i+1
		newurl=root+tmpstr 
		
		fpath="video4/{0}".format(tmpstr)
		if os.path.exists(fpath):
			print(tmpstr,' 文件已经下载,忽略 ',)
			continue
		else:
			new=requests.get(newurl)
			newok=savefile(tmpstr,new.content)

			print(tname,'正在下载文件',tmpstr)
	
	print(tname,' 工作已完成 ')
	return i
		


if __name__=="__main__":
	url=[
		'https:\/\/www.demosite.com\/20190708\/2\/1562567835\/v3\/v3.m3u8' 
	]
	#上面这个地址是m3u8地址。将其替换为真实地址即可
	
	mainurl=url[0]
	
	mainurl=mainurl.replace('\\','')
	
	r=requests.get(mainurl)
	result=r.content.decode('gbk')
	#保存到本地
	isok=savefile('t1.txt',r.content)
	maxlen,rooturl=getrooturl(result)
	print("总共需要下载的文件总数为:",maxlen)
	init=0
	maxt=31

	
	nr=range(1,maxt)
	
	#同步创建30个线程试一下
	for item in nr:
		mname="线程{0}".format(item)
		try:
		   _thread.start_new_thread(downthread, (mname,item,init,maxlen,rooturl) )
		except:
		   print("出错了,无法启动线程")
	 
	print("工作完成了吗?")
	while 1:
	   pass

		


		
Python 多线程 M3U8 下载可以通过 `threading` 模块来实现。M3U8 是一种多媒体文件索引格式,用于切割和播放音视频流。使用多线程可以实现同时下载多个片段,提高下载速度。 首先,我们需要导入所需的模块: ```python import requests import threading ``` 接下来,我们可以定义一个下载函数,用于下载 M3U8 文件中的片段。在下载过程中,我们可以将每个片段保存到本地文件,然后再合并成完整的音视频文件。 ```python def download(url, filename): response = requests.get(url) with open(filename, 'wb') as file: file.write(response.content) ``` 然后,我们可以编写一个函数,用于解析 M3U8 文件,并获取其中的片段 URL。 ```python def parse_m3u8(m3u8_url): response = requests.get(m3u8_url) lines = response.text.split('\n') urls = [] for line in lines: if line.startswith('#EXTINF'): url = lines[lines.index(line) + 1] urls.append(url) return urls ``` 最后,我们可以使用多线程进行片段下载。我们可以创建多个线程,每个线程负责下载一个片段。 ```python def main(m3u8_url): urls = parse_m3u8(m3u8_url) threads = [] for i, url in enumerate(urls): filename = f'fragment_{i}.ts' thread = threading.Thread(target=download, args=(url, filename)) threads.append(thread) thread.start() for thread in threads: thread.join() print('文件下载完成!') ``` 调用 `main` 函数,并传入 M3U8 文件 URL 作为参数,即可开始多线程下载。 需要注意的是,多线程下载可能会带来一些问题,如网络不稳定、服务器限制等。因此,在实际使用时,我们可能需要对下载逻辑进行优化,以避免潜在的问题。 以上就是用 Python 实现多线程 M3U8 下载的简单介绍。希望对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3cts

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值