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

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:

pass1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 下载的简单介绍。希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值