吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2064|回复: 9
收起左侧

[Python 转载] 用Python实现类似IDM部分功能

  [复制链接]
话痨司机啊 发表于 2022-8-11 01:02
本帖最后由 话痨司机啊 于 2022-8-19 10:51 编辑

参考 @hecoter m3u8的一些源码,实现类似多线程IDM下载的功能,默认16个线程。

[Python] 纯文本查看 复制代码
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
from itertools import tee
from alive_progress import alive_bar

def pairwise(iterable):
    '''转换'''
    # pairwise('ABCDEFG') --> AB BC CD DE EF FG
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

def calc_divisional_range(res,threads_count):
    '''分区下载'''
    capacity = int(res.headers['Content-Length'])
    remainder = int(capacity%threads_count)
    singular = int((capacity - remainder)/threads_count)
    url_range = list(pairwise((range(0,[/b][b]capacity - remainder[/b][b],singular))))
    url_range[-1] = (url_range[-1][0],[/b][b]capacity -1[/b][b])
    return url_range

def range_download(url,save_name, s_pos, e_pos,proxies=None):
    '''下载函数'''
    headers = {"Range": f"bytes={s_pos}-{e_pos}"}
    res = requests.get(url, headers=headers, stream=True,proxies=proxies)
    with open(save_name, "rb+") as f:
        f.seek(s_pos)
        for chunk in res.iter_content(chunk_size=64*1024):
            if chunk:
                f.write(chunk)

def download(url,thread_count,save_name=None,proxies=None):
    '''多线程调用下载'''
    # url,thread_count = 'http://yue.cmvideo.cn:8080/depository_yqv/asset/zhengshi/5102/598/709/5102598709/media/5102598709_5010999563_56.mp4',16
    if save_name is None:
        save_name = url.split('/')[-1]
    print(save_name,'下载中……')
    res = requests.head(url,proxies=proxies)
    divisional_ranges = calc_divisional_range(res,thread_count)
    with open(save_name, "wb") as f:
        pass
    with ThreadPoolExecutor(max_workers=thread_count) as p,alive_bar(len(divisional_ranges)+1) as bar:
        futures = []
        for s_pos, e_pos in divisional_ranges:
            # print(s_pos, e_pos)
            futures.append(p.submit(range_download,url,save_name, s_pos, e_pos,proxies=proxies))
        # 等待所有任务执行完毕
        for f in as_completed(futures):
            if f.done():
                bar()
    print(save_name,'下载完成!')

if __name__ == '__main__':
    url = input('输入下载链接:')
    thread_count = 16
    download(url,thread_count)

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
bin_chb + 1 + 1 谢谢@Thanks!
43991258 + 1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

狂野粗汉子 发表于 2022-8-11 01:13
感谢分享!
吾更爱你 发表于 2022-8-11 07:50
请教下 有两类下载如何用python实现

1、m3u8直播链接 比如b站部分直播  用m3u8直播下载器能下载
2、非m3u8直播链接 如视频号 直接用idm就能下载
43991258 发表于 2022-8-11 08:05
 楼主| 话痨司机啊 发表于 2022-8-11 08:30
本帖最后由 话痨司机啊 于 2022-8-11 08:32 编辑
吾更爱你 发表于 2022-8-11 07:50
请教下 有两类下载如何用python实现

1、m3u8直播链接 比如b站部分直播  用m3u8直播下载器能下载

具体你可以请教 hecoter 这位大佬~,我这个只是下载MP4或者单文件的,主要跟解密函数做耦合。m3u8类型跟这个差不多,只是需要解析m3u8并合并多ts.还涉及m 3u8的解密等等。
ErXing 发表于 2022-8-11 08:37
感谢分享
bodongle1 发表于 2022-8-11 09:41
谢谢楼主分享
riyuexiaoyao 发表于 2022-8-11 09:43
感谢大佬分享
忧郁之子 发表于 2022-8-12 16:13
很不错,支持一下。
virsnow 发表于 2022-10-3 12:30
666,学到了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 05:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表