python 图片、文件 通过 request header 多线程下载

2023-11-12

写爬虫过程中发现图片下载比较慢,遂使用多线程下载来提速

import threading
import requests


class MulThreadDownload(threading.Thread):
    def __init__(self, url, startpos, endpos, temp_dict, headers, proxies):
        super(MulThreadDownload, self).__init__()
        self.url = url
        self.startpos = startpos
        self.endpos = endpos
        self.temp_dict = temp_dict
        self.headers = headers
        self.proxies = proxies

    def download(self, proxies):
        headers = {"Range": "bytes=%s-%s" % (self.startpos, self.endpos)}
        if self.headers:
            self.headers['Range'] = "bytes=%s-%s" % (self.startpos, self.endpos)
            headers = self.headers

        for i in range(10):
            # 切换代理形式,增加成功率
            if i in [2, 5]:
                proxies = {'http': 'http:{}'.format(proxies.get("https")[6:])}
            if i in [3, 7]:
                proxies = {'http': proxies.get("https")}
            try:
                res = requests.get(self.url, headers=headers, proxies=proxies, timeout=3)
                if res.content:
                    self.temp_dict[self.startpos]=res.content
                    break
                else:
                    continue
            except Exception as e:
                print(f'{self.url} down load error {str(e)}')
                continue


    def run(self):
        self.download(self.proxies)


def download_img_multi_thread(url, headers, proxies):
    # 获取文件的大小和文件名
    filesize = 0
    if headers:
        filesize = int(requests.head(url, headers=headers, proxies=proxies).headers.get('Content-Length'))
    if not headers:
        filesize = int(requests.head(url, proxies=proxies).headers.get('Content-Length'))
    if filesize:
        # 线程数
        threadnum = 5
        # 信号量,同时只允许5个线程运行
        # threading.BoundedSemaphore(threadnum)
        # 默认5线程现在,也可以通过传参的方式设置线程数
        step = filesize // threadnum
        mtd_list = []
        start = 0
        end = -1
        # 如果文件大小为11字节,那就是获取文件0-10的位置的数据。如果end = 10,说明数据已经获取完了。
        temp_dict = dict()
        while end < filesize - 1:
            start = end + 1
            end = start + step - 1
            if end > filesize - 1:
                end = filesize - 1
            if filesize - 1 - end < step:
                end = filesize - 1
            t = MulThreadDownload(url, start, end, temp_dict, headers, proxies)
            t.start()
            mtd_list.append(t)

        for i in mtd_list:
            i.join()
        # 所有线程都下完,组合所有字节到一起
        temp_dict = sorted(temp_dict.items(), key=lambda x: x[0])
        temp_b = b''
        for i in temp_dict:
            temp_b = temp_b+i[1]
        if len(temp_b) == filesize:  # 校验文件大小
            return temp_b
        else:
            print(f'file download failed temp_b {len(temp_b)} filesize {filesize}')
    return None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 图片、文件 通过 request header 多线程下载 的相关文章

随机推荐

  • 【极简前端知识】后端程序员需要了解的html基础知识

    文章目录 前言 一 html概述和基本结构 二 html基本标签 三 超链接 媒体元素 列表 四 表单标签 前言 作为一名优秀的后端程序员 不仅要掌握后端相关知识 前端程序员的知识也要有一定的了解 可以帮助我们更加系统 完整的了解整个项目
  • 低到高OSI7层网络结构名称。

    1 物理层 Physical Layer OSI参考模型的最底层或第一层 如规定使用电缆和接头的类型 传送信号的电压等 在这一层 数据还没有被组织 仅作为原始的位流或电气电压处理 单位是bit 这一层的理解相对来说比较容易 2 数据链路层
  • 软件自动化实现的原理

    1 软件自动化实现的原理和方法 直接对代码进行静态和动态分析 测试过程的捕获和回放 测试脚本技术 自动比较技术 虚拟用户技术和测试管理技术 2 自动化实现过程 动态测试主要通过特定的程序来模拟软件的操作过程或操作行为 然后对软件所做出的反应
  • Flutter 插件数据回调

    在编写Flutter插件时 涉及到结果回调 进度回调的时候 可以选择使用PlatformChannel BlockCallback或FlutterEventChannel 下面简单说一下他们的使用场景 1 PlatformChannel P
  • 数据链路层协议

    一 数据链路层概述 1 数据链路层的功能 1 链路管理 负责数据链路的建立 维持和释放 主要用于面向连接的服务 2 帧同步 接收方确定收到的比特流中一帧的开始位置和结束位置 3 差错控制 用于使接收方确定接收到的数据就由发送方发送的数据 4
  • 程序员升级打怪之路

    程序员升级打怪之路 新手阶段 中级阶段 高级阶段 写这篇文章的目的是为了让自己在迷茫的时候 看看 自己有哪些不足之处 最重要的是在目前这个时间2020年11月3日 我还是处在中级阶段 新手阶段 那么 入门的新手 要达到一个什么水平才能找到工
  • 学习率的选择

    学会画图去看学习率是否符合 梯度下降算法收敛所需要的迭代次数根据模型的不同而不同 我们不能提前预知 我们可以绘制迭代次数和代价函数的值的图表来观测算法在何时趋于收敛 自动测试方法 也有一些自动测试是否收敛的方法 例如将代价函数的变化值与某个
  • Datart使用说明

    Datart使用说明 Datart安装记录 Refer 安装问题 前端源码编译 java 程序包datart data provider calcite parser impl不存在 启动基础步骤 Datart安装记录 Refer 最近在学
  • 只需2步,轻松解决高校“双非”网站问题

    什么是高校 双非 信息系统问题 高校 双非 信息系统 网站 问题是指 大部分高校网站都是教育网公网地址 互联网可以直接访问 但是 有些高校网站存在下面两种情况 第一种 学校拥有一个教育网地址A 在公网上又有一个非法域名 也对应学校的公网地址
  • SpringBoot报错Unable to start embedded container; nested exception is java.lang.NoSuchMethodError

    SpringBoot启动报错如下 Unable to start embedded container nested exception is java lang NoSuchMethodError org apache tomcat ut
  • CloudCompare和PCL体素滤波:优化点云数据处理

    CloudCompare和PCL体素滤波 优化点云数据处理 介绍 点云数据处理在计算机视觉和机器人领域扮演着重要角色 然而 原始的点云数据可能包含噪声 离群点和冗余信息 这可能对后续的分析和应用造成负面影响 为了解决这些问题 我们可以使用体
  • [BJDCTF2020]Mark loves cat(解决githack无法下载源码&&githack无法获取文件)

    写在前面 考察知识点 1 git泄露 点击这里下载 选择安装路径后 在该文件夹下路径输入cmd 在命令行中输入 python Githack py 127 0 0 1 git 你的网址后面有 git就行 2 变量覆盖 这里有一题比较简单的变
  • 2022数模国赛C题思路详解-古代玻璃制品的成分分析与鉴别

    完整作品 含代码 文献 数据集 分类答案 正在为您运送作品详情 题目定位 数据分析题 数据量少 维度较多 参考往年题目 2021年国赛B题 一 题目背景分析 这几段主要是交代题目的背景 讲解了古代玻璃制品的特征 解释了其化学成分含量的差异性
  • 手动配置树莓派wifi联网连接热点手机热点

    手动配置树莓派wifi联网连接热点 修改wifi配置文件 运行命令 sudo nano etc wpa supplicant wpa supplicant conf 在文件中添加无线网配置信息 ctrl interface DIR var
  • 使用 Clang Tools —— ClangFormat

    ClangFormat 1 独立的工具 2 Vim 集成 3 Emacs 集成 4 BBEdit 集成 5 CLion 集成 6 Visual Studio 集成 7 用于补丁重新格式化的脚本 Script for patch reform
  • JavaScript中获取对象属性的不同方法

    JavaScript中获取对象属性的不同方法 文章目录 JavaScript中获取对象属性的不同方法 一 点记法 二 方括号记法 三 Object keys 方法 四 Object values 方法 五 Object entries 方法
  • uniapp路由传多个参数_VUE全局路由前置守卫:路由拦截登录校验

    点击右上方红色按钮关注 web秀 让你真正秀起来 前言 在任何一个平台中 如果需要增加用户黏度 除了用户需要的基本内容外 用户登录注册提交信息也是非常重要的一环 可以了解用户基本信息 用户喜欢等 抛出前后端混合开发外 vue可以轻松的实现路
  • Hyperf中RabbitMQ的使用

    1 简单的使用可以参照官方文档的AMQP组件 https hyperf wiki 2 1 zh cn amqp 2 安装过程参照 https www linuxprobe com install rabbitmq on centos 7 h
  • Qt实现点击按钮弹出(关闭)窗口,点击窗口外其他位置关闭窗口

    Qt实现点击按钮弹出 关闭 窗口 点击窗口外其他位置关闭窗口 方法一 在窗口实现类的构造函数中添加如下代码 this gt setWindowFlags Qt Popup 参数Qt Popup 表示 当点击窗口以外就关闭窗口 方法二 直接在
  • python 图片、文件 通过 request header 多线程下载

    写爬虫过程中发现图片下载比较慢 遂使用多线程下载来提速 import threading import requests class MulThreadDownload threading Thread def init self url