#coding:utf-8

# windows中测试不通过,下载的图片不完整
# 通过多线程下载图片 import requests
import threading class downloader(object):
def __init__(self):
# self.url = 'http://f1.topitme.com/1/eb/96/112730204208796eb1o.jpg'
# mysql source package
# self.url = 'http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35.tar.gz'
# yangmi
self.url = 'https://imgsa.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=18d31e2c6c380cd7f213aabfc02dc651/2e2eb9389b504fc27dcf5199ecdde71191ef6d9e.jpg' # self.name = 'mysql-5.6.35.tar.gz'
self.name = 'yangmi.jpg'
self.num = 5 def get_img(self, r):
# 获取图片的分段位置,并记录seek值(分段后的起始位置)开始写入系统
_request = requests.get(self.url, headers = {'Range':'bytes=%s-%s' % r})
self.fd.seek(r[0])
self.fd.write(_request.content)
print 'success %s-%s' % r def get_range(self):
r = requests.head(self.url)
headers = r.headers
# 获取图片的大小
image_size = int(headers['Content-Length'])
# print [image_size]
# 分为5段(即开启5个线程下载图片)
offset = image_size / self.num
print image_size
range_list = [] # 将图片分为 num(5)段
for i in range(self.num):
if i == self.num - 1:
range_list.append((offset*i, ''))
else:
range_list.append((offset*i, offset*(i + 1)))
return range_list def download(self):
range_list = self.get_range()
self.fd = open(self.name, 'w')
n = 0
ths = []
# 创建线程
for r in range_list:
# self.get_img(r)
# 开启多线程下载
th = threading.Thread(target=self.get_img(r), args = r)
th.start()
print 'thread%d' % n
n += 1
ths.append(th) # 线程等待
for r in ths:
r.join() self.fd.close()
print 'download success' if __name__ == "__main__":
d = downloader()
d.download()

普通分段下载

#coding:utf-8

# windows中测试不通过,下载的图片不完整
# 分段下载图片
import requests
from decimal import Decimal class downloader(object):
def __init__(self):
self.url = 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=4241609126,773789288&fm=173&s=E42EB6570862D211C87C4CEE0300A02A&w=500&h=333&img.JPG'
# yangmi
# self.url = 'https://imgsa.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=18d31e2c6c380cd7f213aabfc02dc651/2e2eb9389b504fc27dcf5199ecdde71191ef6d9e.jpg' self.name = 'bizhi.jpg'
self.num = 5 def get_img(self, r):
_request = requests.get(self.url, headers = {'Range':'bytes=%s-%s' % r})
self.fd.seek(r[0])
self.fd.write(_request.content)
print 'success %s-%s' % r def get_range(self):
r = requests.head(self.url)
headers = r.headers
image_size = int(headers['Content-Length'])
# print [image_size]
offset = image_size / self.num
print image_size
range_list = []
for i in range(self.num):
if i == self.num - 1:
range_list.append((offset*i, ''))
else:
range_list.append((offset*i, offset*(i + 1)))
return range_list def download(self):
range_list = self.get_range()
self.fd = open(self.name, 'w')
for r in range_list:
self.get_img(r) if __name__ == "__main__":
d = downloader()
d.download()

python多线程threading下载示例的更多相关文章

  1. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  2. Python多线程 - threading

    目录 1. GIL 2. API 3. 创建子线程 4. 线程同步 4.1. 有了GIL,是否还需要同步? 4.1.1. 死锁 4.1.2. 竞争条件 4.1.3. GIL去哪儿了 4.2. Lock ...

  3. [转]python 多线程threading简单分析

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  4. python多线程批量下载远程图片

    python多线程使用场景:多线程采集, 以及性能测试等 . 数据库驱动类-简单封装下 mysqlDriver.py #!/usr/bin/python3 #-*- coding: utf-8 -*- ...

  5. python多线程threading

    本文通过 4个example 介绍python中多线程package —— threading的常用用法, 包括调用多线程, 同步队列类Queue, Ctrl+c结束多线程. example1. 调用 ...

  6. Python(多线程threading模块)

    day27 参考:http://www.cnblogs.com/yuanchenqi/articles/5733873.html CPU像一本书,你不阅读的时候,你室友马上阅读,你准备阅读的时候,你室 ...

  7. [Python 多线程] threading.local类 (六)

    在使用threading.local()之前,先了解一下局部变量和全局变量. 局部变量: import threading import time def worker(): x = 0 for i ...

  8. 再看python多线程------threading模块

    现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个“,”否则会抛参数异常的错误. 如下: for i ...

  9. Python多线程Threading爬取图片,保存本地,openpyxl批量插入图片到Excel表中

    之前用过openpyxl库保存数据到Excel文件写入不了,换用xlsxwriter 批量插入图片到Excel表中 1 import os 2 import requests 3 import re ...

随机推荐

  1. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  2. HDU 1022(火车过站 栈)

    题意是给定火车进站的序列和出站的序列,问能否完成转换,若能输出过程. 和另一道以火车进站为背景的栈应用题类似,但增加了对于过程的输出,只需要多记录一下进出站顺序即可. #include <bit ...

  3. ASP.NET Identity V2简单介绍

    Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...

  4. Spark SQL基本概念与基本用法

    1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了两个编程抽象分别叫做DataFrame和DataSet,它们用于作为 ...

  5. vue filter过滤器简单应用

    vue中过滤器,用于一些常见的文本格式化,用 | 来操作. 过滤器可以用在两个地方: 1.在{{}}双花括号中插入值 2.v-bind表达式中使用 <!-- 在双花括号中 --> {{ m ...

  6. awk指定[]为分隔符

    root@standby[16:38:35]$ root@standby[16:38:35]$ cat tmp.log qq [8.8.8.8] 6.6.6.6 [1502301436.016] &q ...

  7. SpringBoot系列: 使用 flyway 管理数据库版本

      Flyway 和 Liquibase 都是 Java 项目中常用的 DB migration 工具, 从使用简便性看,Flyway 比 Liquibase 更简单, 从 github 的 star ...

  8. XOR 加密

    XOR 是一个神奇的运算符, 观察它的真值表, 很容易得到以下结论: 假设现有 a , b 变量, 则 a ^ 0 == a a ^ 0xff == ~a (取反加1等于作为补码的a的真值的相反数的补 ...

  9. 【SRM-05 B】无题?

    Description 有一个拥有n个城市的国家.这个国家由n-1条边连接起来.有一天国家发生叛乱.叛军已占领了一些城市.如果叛军占领的城市中,存在两个城市之间有边直接相连,则称这种情况是坏的.现在并 ...

  10. springboot11-01-security入门

    场景: 有3个页面:首页.登录页.登录成功后的主页面,如下图: 如果没有登录,点击“去主页”,会跳转到登录页 如果已经登录,点击“去主页”,跳转到主页,显示“hello 用户名” 下面用springb ...