首页 > 编程语言 >Python requests.Session 协程 下载文件

Python requests.Session 协程 下载文件

时间:2023-02-06 18:34:09浏览次数:56  
标签:session 协程 Python self list url Session dir pool

Python requests.Session 协程 下载文件

 

# coding: utf-8

from gevent import monkey

monkey.patch_all()
from gevent.pool import Pool
import gevent
import requests
import os, sys
import time
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class Downloader:
    def __init__(self, pool_size, retry=3):
        self.pool = Pool(pool_size)
        self.session = self._get_http_session(pool_size, pool_size, retry)
        self.retry = retry  # 重试次数
        self.dir = ''
        self.failed = []
        self.url_total = 0
        self.completed_count = 0

    def _get_http_session(self, pool_connections, pool_maxsize, max_retries):
        session = requests.Session()
        adapter = requests.adapters.HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize,
                                                max_retries=max_retries)
        session.mount('http://', adapter)
        session.mount('https://', adapter)
        return session

    def run(self, url_list, dir=''):
        self.dir = dir
        if self.dir and not os.path.isdir(self.dir):
            os.makedirs(self.dir)

        self.url_total = len(url_list)
        self.completed_count = 0
        print ('total ts count:', self.url_total)
        g1 = gevent.spawn(self._check_finish)
        self._download(url_list)
        g1.join()

    def _download(self, url_list):
        self.pool.map(self._worker, url_list)
        if self.failed:
            url_list = self.failed
            self.failed = []
            self._download(url_list)

    def _worker(self, url):

        retry = self.retry
        while retry:
            try:
                file_name = url.split('/')[-1].split('?')[0]
                file_path = os.path.join(self.dir, file_name)
                if not os.path.exists(file_path):
                    r = self.session.get(url, timeout=20, verify=False)
                    if r.ok:
                        print ('download:', file_name)
                        with open(file_path, 'wb') as f:
                            f.write(r.content)
                    else:
                        # print('fail:', file_name)
                        raise RuntimeError('download fail')
                else:
                    print('exist:', file_name)
                return
            except:
                retry -= 1
        print ('[FAIL]%s' % url)
        self.failed.append(url)
        self.completed_count += 1

    def _check_finish(self):

        while self.completed_count >= self.url_total:
            time.sleep(0.01)


if __name__ == '__main__':
    downloader = Downloader(50)  # 协程个数

    url_list = ['https://pics1.baidu.com/feed/b999a9014c086e0610f3d6bf8bf4d6ff08d1cbf7.jpeg',
                'https://pics7.baidu.com/feed/d53f8794a4c27d1ef06a7b6195290065dfc438ca.jpeg']
    downloader.run(url_list, './dst_dir')

 

标签:session,协程,Python,self,list,url,Session,dir,pool
From: https://www.cnblogs.com/zhaoyingjie/p/17096377.html

相关文章

  • python3如何构建文本向量
    importreimportcollectionswords='''钟声响起归家的讯号在他生命里仿佛带点唏嘘黑色肌肤给他的意义是一生奉献肤色斗争中年月把拥有变做失去......
  • python同时替换多个字符串方法
    importrewords='''钟声响起归家的讯号在他生命里仿佛带点唏嘘黑色肌肤给他的意义是一生奉献肤色斗争中年月把拥有变做失去疲倦的双眼带着......
  • python中某个字符的替换escape
    re包中的escape就是对特殊字符进行转义:......
  • python3中zip详解
    描述zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象......
  • Python3 ImportError: No module named '_tkinter'
    Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"/usr/local/lib/python3.5/tkinter/__init__.py",line35,in<module>import_tkinter#......
  • python怎么获取向量中非零元素的行号
    假设A为向量 :行向量的时候,需要转化为列向量  A.TA为列向量的时候,不需要转化了解下numpy中的nonzero()函数np.nonzero(arrayormmatrix)返回非零的行标,和列标......
  • python2.7 + MySQL 拼接SQL语句的技巧 (处理unicode,时间)
    背景在Python2.7中,可以使用单引号,双引号,三引号表示字符串,当字符串的值为中文时,则会默认转换成unicode。但是在MYSQL中,使用SQL语句时,直接用unicode作为列的查询条件(例如......
  • 快速上手python的简单web框架flask
    目录简介web框架的重要组成部分快速上手flaskflask的第一个应用flask中的路由不同的http方法静态文件使用模板总结简介python可以做很多事情,虽然它的强项在于进行向量运......
  • 八、python——测试
    anonymousSurvey.pyclassAnonymousSurvey():"""收集匿名调查问卷的答案"""def__init__(self,question):"""存储一个问题,并为存储答案做准备"""......
  • 深刻理解Python的类
    Python的类​​类的定义​​​​函数与方法的区别​​​​类与对象​​​​构造函数​​​​区分模块变量与类中的变量​​​​类变量和实例变量​​​​类与对象的变量查找......