import osimport timeimport sys

import requests#依序下载POP20_CC = ('CN IN US ID BR PK NG BD RU JP'            'MX PH VN ET EG DE IR TE CD TR').split()BASE_URL = 'http://flupy.org/data/flags'DEST_DIR = 'downloads/'

def save_flag(img, filename):    path = os.path.join(DEST_DIR, filename)    if not os.path.isdir(DEST_DIR):        os.mkdir(DEST_DIR)

    with open(path, 'wb') as fp:        if fp.writable():            fp.write(img)

def get_flag(cc):#下载内容    url = '{}/{cc}/{cc}.gif'.format(BASE_URL, cc=cc.lower())  # 格式化字符串{BASE_URL}/{cc}/{cc}    print(url)    resp = requests.get(url)#以二进制形式下载    return resp.content#返回二进制数据

def show(text):    print(text,end=' ')    sys.stdout.flush()#在liunx系统下,不加这句,打印时间不是立刻打印的。假如在windows中不存在这个问题(正常情况遇到换行才会刷新stdout缓冲)

def download_many(cc_list):    for cc in sorted(cc_list):#sorted()这个排序的结果和作用是什么?        image=get_flag(cc)        show(cc)

        save_flag(image,cc.lower()+'.gif')    return len(cc_list)

def main_n(download_many):    t1=time.time()    count=download_many(POP20_CC)    elapsed=time.time()-t1    msg='\n{} flags download in {:.2f}s'    print(msg.format(count,elapsed))

if __name__ == '__main__':    main_n(download_many)#BD BR CD CN DE EG ET ID IN IR JPMX NG PH PK RU TE TR US VN# 19 flags download in 8.57s

#concurrent.futures 模块下载
from concurrent import futuresimport osimport timeimport requestsimport sys

MAX_WORKERS = 20POP20_CC = ('CN IN US ID BR PK NG BD RU JP'            'MX PH VN ET EG DE IR TE CD TR').split()BASE_URL = 'http://flupy.org/data/flags'DEST_DIR = 'downloads/'

def save_flag(img, filename):    path = os.path.join(DEST_DIR, filename)    if not os.path.isdir(DEST_DIR):        os.mkdir(DEST_DIR)

    with open(path, 'wb') as fp:        if fp.writable():            fp.write(img)

def get_flag(cc):    url = '{}/{cc}/{cc}.gif'.format(BASE_URL, cc=cc.lower())    resp = requests.get(url)    return resp.content

def show(text):    print(text, end=' ')    sys.stdout.flush()

def main_n(download_many):    t1 = time.time()    count = download_many(POP20_CC)    elapsed = time.time() - t1    msg = '\n{} flags download in {:.2f}s'    print(msg.format(count, elapsed))

def download_one(cc):    image = get_flag(cc)    show(cc)    save_flag(image, cc.lower() + '.gif')    return cc

def download_many(cc_list):    workers = min(MAX_WORKERS, len(cc_list))  # 设置最大线程数

    with futures.ThreadPoolExecutor(workers) as executor:        res = executor.map(download_one, sorted(cc_list))    return len(list(res))

# BD BR CN ID EG JPMX IN NG RU TE ET CD IR PH PK VN DE US TR# 19 flags download in 2.44sif __name__ == '__main__':    main_n(download_many)
												

python 网络下载的三种风格 未完成的更多相关文章

  1. [转]VMware Workstation网络连接的三种模式

    经常要使用VMWare Workstation来在本地测试不同的操作系统,以前也搞不清楚网络连接三种模式,最近看了几篇文章才算明白.现总结如下: 1. VMware Workstation的虚拟网络组 ...

  2. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  3. Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...

  4. Python格式化输出的三种方式

    Python格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式比如要求用户输入用户名和年龄,然后打印如下格式:My name is xxx,my age ...

  5. 辛星跟您玩转vim第一节之vim的下载与三种模式

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...

  6. python字符串连接的三种方法及其效率、适用场景详解

    python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39;+& ...

  7. Python 列表(List) 的三种遍历(序号和值)方法

    三种遍历列表里面序号和值的方法: 最近学习python这门语言,感觉到其对自己的工作效率有很大的提升,特在情人节这一天写下了这篇博客,下面废话不多说,直接贴代码 #!/usr/bin/env pyth ...

  8. 记住 Python 变量类型的三种方式

    title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...

  9. python更新数据库脚本三种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...

随机推荐

  1. Spring容器中获取bean实例的方法

    // 得到上下文环境 WebApplicationContext webContext = ContextLoader .getCurrentWebApplicationContext(); // 使 ...

  2. JAVAWEB 一一 userweb2(升级,servlet版,jstl和el)

    创建数据库和表 首先,创建一个web项目 然后引入jar包(jstl.jar和standard.jar是jstl和el包,在jsp页面中需要手动加 <%@ taglib uri="ht ...

  3. SqlServer 中 for xml path 相关

    表结构: typename varchar(50) typedesc varchar(50) 示例 SQL 语句: SELECT '{"'+TypeName, '":"' ...

  4. 解决idea控制台乱码及项目乱码

    如果控制台出现乱码,解决办法: 第1方案:.找到安装idea的路径下找idea文件下的bin中vmoptions文件,打开该文件,加上-Dfile.encoding=UTF-8 第二方案: 第3种方案 ...

  5. 吴裕雄 21-MySQL 正则表达式

    MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配.MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表 ...

  6. ADO.Net创建数据模型和数据访问类及泛型集合

    数据模型和数据访问类:数据模型: 使用面向对象中的封装特性,将数据表中的行数据组成一个同样结构的对象,来单独使用: 数据访问类: 将某一个表的全部增删改查操作的方法写进去,方便统一管理和调用: 数据模 ...

  7. akka之种子节点

    AKKA提供的cluser功能能够很便捷的创建一个分布式应用,在使用cluster时需要配置seed nodes节点,这里对seed nodes节点做一下介绍. AKKA seed nodes 和普通 ...

  8. StringBuild类

    每次拼接都会产生新的字符串对象,从而产生很多废弃的垃圾,拼的越多,垃圾越多,而利用StringBuilder来拼接字符串自始至终用的都是同一个StringBuilder容器 StringBuilder ...

  9. python-ceilometerclient命令行(终结)

    ceilometerclient入口 工程ceilometerclient shell.py中的main方法 ceilometerclient目录 --ceilometerclient --commo ...

  10. 解题(StringTongPei--字符串匹配(动态规划))

    题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符:*:匹配0个或以上的字符(字符由英文字母和 ...