""" Download image according to given urls and automatically rename them in order. """ # -*- coding: utf-8 -*- # author: Yabin Zheng # Email: sczhengyabin@hotmail.com from __future__ import print_function import shutil import imghdr import os import concurrent.futures import requests headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Proxy-Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", "Accept-Encoding": "gzip, deflate, sdch", # 'Connection': 'close', } def download_image(image_url, dst_dir, file_name, timeout=20, proxy_type=None, proxy=None): proxies = None if proxy_type is not None: proxies = { "http": proxy_type + "://" + proxy, "https": proxy_type + "://" + proxy } response = None file_path = os.path.join(dst_dir, file_name) temp_path = os.path.join(dst_dir, file_name+".downloads") repair_count = 1 try: response = requests.get( image_url, headers=headers, timeout=timeout, proxies=proxies) while response.status_code != 200 and repair_count <= 5: download_image(image_url,dst_dir,file_name) print(f'重试:第{repair_count}次 {image_url}') repair_count += 1 with open(temp_path, 'wb') as f: f.write(response.content) response.close() shutil.move(temp_path, file_path) print("## OK: {} {}".format(file_path, image_url)) except Exception as e: if response: response.close() print("## Fail: {} {}".format(image_url, e.args)) def download_images(image_urls, dst_dir, file_prefix="img", concurrency=50, timeout=360, proxy_type=None, proxy=None,filesName=None): """ Download image according to given urls and automatically rename them in order. :param timeout: :param proxy: :param proxy_type: :param image_urls: list of image urls :param dst_dir: output the downloaded images to dst_dir :param file_prefix: if set to "img", files will be in format "img_xxx.jpg" :param concurrency: number of requests process simultaneously :return: none """ concurrency = len(image_urls) with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as executor: future_list = list() count = 0 if not os.path.exists(dst_dir): os.makedirs(dst_dir) for image_url in image_urls: file_name = filesName[count] future_list.append(executor.submit( download_image, image_url, dst_dir, file_name, timeout, proxy_type, proxy)) count += 1 concurrent.futures.wait(future_list, timeout=360)