在上一篇博文中,我用单线程版本的Python来实现下载脚本,其中最大的不足在于它是单线程的,很慢。
其实,下载网络图片是天然的具有并行性的,因为下载每一副图片都是独立的,甚至线程之间都不用交互。
-*- coding: utf-8 -*-
"""
Created on Tue Apr 07 20:19:38 2015
@author: Chenriwei
"""
import threading
import time
import urllib
def download_and_save(url,savename):
try:
urlopen=urllib.URLopener()
fp = urlopen.open(url)
data = fp.read()
fp.close()
fid=open(savename,'w+b')
fid.write(data)
print "下载成功:"+ url
fid.close()
except IOError:
print "下载失败:"+ url
def get_all_iamge(filename):
fid=open(filename)
lines=fid.readlines()
for line in lines:
line_split=line.split('\t')
name=line_split[0]
image_id=line_split[1]
face_id=line_split[2]
box=line_split[4]
image_url=line_split[3]
if False == os.path.exists(name):
os.mkdir(name)
savefile=name+'/'+image_id+'.jpg'
#最多1000个线程,
while True:
if(len(threading.enumerate()) < 1000):
break
t = threading.Thread(target=download_and_save,args=(image_url,savefile,))
t.start()
if __name__ == "__main__":
get_all_iamge('facescrub_actresses.txt')
用多线程去下载图片,明显就快很多了,看自己电脑的网速,一个小时一般就可以都下载完
数据库。