#提取每条数据的image_list字段中的每一张图片链接,将图片链接和图片所属的标题一并返回,此时可以构造一个生成器。 defget_images(json): if json.get('data'): #json中data存在 for item in json.get('data'): title = item.get('title') if item.get('image_list'): #item中image_list存在 images = item.get('image_list') for image in images: yield{ #构造生成器 'image':'http:'+ image['url'], 'title':title
''' 保存图片,其中item就是前面get_images()方法返回的一个字典。 首先根据item的title来创建文件夹。 然后请求这个图片链接,获取图片的二进制数据,以二进制的形式写入文件。 图片的名称可以使用其内容的MD5值,这样可以去除重复。 ''' defsave_image(item): ifnot os.path.exists(item.get('title')): #判断路径不存在 os.mkdir(item.get('title')) #用title创建文件夹 try: response = requests.get(item.get('image')) #请求图片地址 if response.status_code == 200: file_path = '{0}/{1}.{2}'.format(item.get('title'),md5(response.content).hexdigest(),'jpg') #定义图片路径,图片命名用图片内容MD5值16进制表示 ifnot os.path.exists(file_path): #判断路径不存在 with open(file_path,'wb') as f: f.write(response.content) #写入二进制文件 else: print('Already Downloaded', file_path) except requests.ConnectionError: print('Failed to Save Image') defmain(offset): json = get_page(offset) for item in get_images(json): print(item) save_image(item) group_start = 1 group_end = 5 if __name__ == '__main__': pool = Pool() groups = ([i*20for i in range(group_start,group_end+1)]) #构造一个offset数组 pool.map(main,groups) #多进程进程池,调用其map()方法实现多进程下载 pool.close() pool.join()