我之前的代码非常天真,因为我没有利用多线程。显然需要等待URL请求响应,但计算机在代理服务器响应时也可以进行其他请求。
通过以下调整,您可以将效率提高10倍 - 并且还有进一步提高效率的方法,使用像scrapy这样的软件包。
要添加多线程,请使用multiprocessing软件包执行以下操作:
1)将URL检索封装在一个函数中:
import import urllib.request
def geturl(link,i):
try:
urllib.request.urlretrieve(link, str(i)+".jpg")
except:
pass
2) 然后创建一个集合,包含您想要下载的图片的所有网址和名称:
urls = [url1,url2,url3,urln]
names = [i for i in range(0,len(urls))]
3) 从 multiprocessing 包导入 Pool 类并使用该类创建一个对象(显然,在实际程序中,您将在第一行代码中包含所有导入):
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(100)
然后使用pool.starmap()方法,并传递函数及其参数。
results = pool.starmap(geturl, zip(links, d))
注意: pool.starmap() 仅适用于 Python 3