好友
阅读权限10
听众
最后登录1970-1-1
|
import requests
import threading
import time
head = {
#对于有反爬措施的网站,可以根据实际情况添加
}
def thread(url,filename):
thread_list = []
f = requests.get(url,headers = head)#此处请求头可以根据实际情况添加,如不添加请将header = head注释掉
file_size = int(f.headers['Content-Length'])
path = str(filename)
if file_size:
fp = open(path, 'wb')
fp.truncate(file_size)
print('视频大小:' + str(int(file_size / 1024 / 1024)) + "MB")
fp.close()
#获取视频文件大小
size = 10485760
all_thread = 1
if file_size > size:
all_thread = (file_size//size) + 1
if all_thread > 10:
all_thread = 10
#将视频按每10M为一份,分成若干线程,最多10个线程
starttime = time.time()
for i in range(all_thread):
# 获取每个线程开始时的文件位置
start = size * i
# 获取每个文件结束位置
if i > 0:#文件指针后移一位
start += 1
t = threading.Thread(target=download_master, name='th-' + str(i),
kwargs={'start': start, 'url': url, 'filename': path})
t.setDaemon(True)
thread_list.append(t)
for t in thread_list:
time.sleep(0.2)
t.start()
# 等待所有线程结束
for t in thread_list:
t.join()
endtime = time.time()
t_time(endtime,starttime)
def t_time(end,start):
c = int(end - start)
if c > 60:
print("总用时{}分{}秒".format(c//60,c%60))
else:
print("总用时0分%d秒"%c)
def download_master(start,url,filename):
th_name = threading.current_thread().getName()
print(th_name,'is begin...')
r = requests.get(url, headers=head, stream=True)
downsize = 0
with open(filename, 'r+b') as fp:
fp.seek(start)
var = fp.tell()
for chunk in r.iter_content(204800):
'''
流下载requests.get(url)默认是下载在内存中的,
下载完成才存到硬盘上,可以用Response.iter_content 来边下载边存硬盘
'''
if chunk:
fp.write(chunk)
downsize += len(chunk)
if __name__ =='__main__':
url = input('输入视频地址:')
#必须是视频源地址
path = input('输入视频保存地址及名称')
#示例:d:/test/test.mp4
thread(url,path)
|
免费评分
-
参与人数 1 | 吾爱币 +3 |
热心值 +1 |
收起
理由
|
苏紫方璇
| + 3 |
+ 1 |
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|