django 多线程下载图片
example1:
from multiprocessing.dummy import Pool as ThreadPool #多线程
import time
import urllib2 urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
'http://www.python.org/doc/',
] # 单线程
start = time.time()
results = map(urllib2.urlopen, urls)
print 'Normal:', time.time() - start # 多线程
start2 = time.time()
# 开4个 worker,没有参数时默认是 cpu 的核心数
pool = ThreadPool(4)
# 在线程中执行 urllib2.urlopen(url) 并返回执行结果
results2 = pool.map(urllib2.urlopen, urls)
pool.close()
pool.join()
print 'Thread Pool:', time.time() - start2
example2:
#!/usr/bin/env python
# coding=utf-8 import os
import random
import requests
from cStringIO import StringIO
from PIL import Image
from multiprocessing.dummy import Pool as ThreadPool class Labelcode(object): def __init__(self, path='images'): self.base_path = os.path.dirname(__file__)
print 'self.base_path', self.base_path
totalImg = [os.path.join(self.base_path, path, fname) for fname in os.listdir(os.path.join(self.base_path, path))]
finished = [fname for fname in totalImg if fname.find('_')>1]
self.unfinished = [fname for fname in totalImg if fname not in finished] self.label_msg = {} # 当前信息
self.label_msg['totalCnt'] = len(totalImg)
self.label_msg['finishedCnt']= len(finished) if self.unfinished:
self.label_msg['fname'] = random.choice(self.unfinished)
else:
self.label_msg['fname'] = 'no img exists' def get_label_img(self, fname=None, result=''):
"""
标注相关验证码图片,并返回当前信息
"""
print self.base_path
print '---'*30
if fname in self.unfinished and len(result)>1:
newName = '%s/images/%s_%s.jpg' % (self.base_path, result, fname.split('/')[-1].split('.')[0])
if os.path.exists(fname):
os.rename(fname, newName) # 更新名字
self.unfinished.remove(fname)
self.label_msg['finishedCnt'] += 1
self.label_msg['fname'] = random.choice(self.unfinished) if self.unfinished:
self.label_msg['fname'] = random.choice(self.unfinished) return self.label_msg def download_img(self, img_url=None, web_name=None, cnt=1000):
"""
多线程下载图片
"""
res = {'totalCnt': cnt, 'finishedCnt':0}
if not img_url:
return res def get_html((img_ur, idx)):
try:
img = StringIO(requests.get(img_url).content)
img = Image.open(img).convert('RGB')
img.save('%s/images/%s/%d.jpg' % (self.base_path, web_name, idx))
res['finishedCnt'] += 1
except Exception as e:
print (e) web_name = web_name.strip().lower()
cnt = int(cnt) if cnt else 0
img_urls = []
pool = ThreadPool(10) # 同时开启 10 个线程
for i in range(cnt):
img_urls.append((img_url, i+500)) # 插入需要下载的url if not os.path.exists('%s/images/%s' % (self.base_path, web_name)):
os.makedirs('%s/images/%s' % (self.base_path, web_name)) pool.map(get_html, img_urls)
pool.close()
pool.join() return res if __name__ == '__main__': test = Labelcode()
url = 'https://passport.360.cn/captcha.php?m=create&app=i360&scene=login&userip=n7ASHVefL%2FAiu7j%2BPntTvQ%3D%3D&level=default&sign=c5d208'
print test.download_img(url, '', 10)
django 多线程下载图片的更多相关文章
- 多线程下载图片,滑动tableView崩溃--资源抢夺问题
最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.htm ...
- android 多线程下载图片
很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载. 方法一.直接通过Android提供的Http类访问远程服 ...
- 多线程下载图片,同步下载http://www.importnew.com/15731.html
package mutiDownload; import java.io.IOException; import java.io.InputStream; import java.io.RandomA ...
- SDWebImage 在多线程下载图片时防止错乱的策略
在我们使用sd的时候,对tableView 上cell得图片进行异步下载的时候会遇到这样一个问题: 由于cell的重用机制,在我们加载出一个cell的时候imageView数据源开启一个下载任务并返 ...
- curl多线程下载类
<?php /** * curl多线程下载类 */class MultiHttpRequest{ public $urls = array (); private $res = array () ...
- iOS多线程自定义operation加载图片 不重复下载图片
摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用: 2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验 2:自定义operati ...
- php中ob_get_contents、curl_multi_init、curl_init多线程下载远程图片并保存记录
php中三种方式测试图片下载效率 原文共24张不同图,每张大小在500K以上 使用时注意调整传入数组格式以及需要下载时保存地址的路径格式等 这三种方式无需额外安装扩展,方便快捷易操作[虽然效率看结果没 ...
- Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍 本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
- [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片
目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...
随机推荐
- 菜鸟脱壳之脱壳的基础知识(五)——利用内存断点寻找OEP
经过第一节的基础知识,我们都知道了,加壳程序首先解把原来压缩的代码解压,然后放到所对应的区块中,当外壳程序执行完毕后,跳回到OEP执行,我们都知道,OEP是放在代码段中,也就是当外壳程序处理完毕后,跳 ...
- Python多线程基本操作
多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进 ...
- 微信小程序onLaunch修改globalData的值
//app.js App({ onLaunch: function (options) { //设置场景值到缓存中: //wx.setStorageSync("scene", op ...
- springmvc文件上传示例
首先要导包,用的的包是: commons-fileupload-*.*.*.jar commons-io-*.*.jar *号代表版本号 这里给大家分享一下下载链接:https://files.cnb ...
- 错误:Bean property 'sessionFactory' is not writable or has an invalid setter method.
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactory' ...
- mvvm框架
了解mvvm框架吗 vue.js react.js angular.js 谈谈你对mvvm的认识 mvc View :用来把数据以某种方式呈现给用户 Model :其实就是数据 Controller ...
- Centos下软件包管理
目录 一.安装软件包的三种方法 二.rpm包介绍 三.rpm工具用法 四.yum工具用法 五.yum搭建本地仓库 六.yum更换国内源 七.yum下载rpm包 八.源码包安装 九.扩展 一.安装软件包 ...
- python面向对象基本概念(OOP)
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...
- centos7 操作防火墙
原文:https://blog.csdn.net/u012498149/article/details/78772058 1.firewalld的基本使用 启动: systemctl start fi ...
- CSS 隐藏ul
老师要求只能用css做出覆盖ul时显示ul,之前一直在试 [ display:none display:block ]后来发现一直是闪烁的状态 不能实现消失 然后就试用了透明度,一下就可以了 ...