Python小功能实现(链接下载图品并存储到EXCEL中)

news/2024/10/21 23:20:51/
python">import os
import requests
from openpyxl import Workbook
from openpyxl.drawing.image import Image
from concurrent.futures import ThreadPoolExecutor# 图片链接列表
image_urls = ["https://uploads/file/20230205/f85Lpcv8PXrLAdmNUDE1Hh6xqkp0NHi2gSXeqyOb.png","https://uploads/file/20230205/geG4FOpthrsUX0LkmWvDH2veFtw6yj8JLDMYBaQ1.png","https://uploads/file/20230205/mjVAx4jsbke6uj0e2Qz66f8KDceL1P5tanKQkNoy.png"
]
output_dir = "C:/Users/win-10/Desktop/发票图片/"  # 指定Excel文件的输出目录
# 保存图片的本地目录
save_folder = "C:/Users/win-10/Desktop/发票图片/downloaded_images/"
# Excel文件名
excel_filename = "images_with_links.xlsx"
# 最大下载尝试次数
max_download_attempts = 3def download_image(url, filename, attempts=0):"""下载图片到指定文件名:param url: 图片的URL链接:param filename: 保存图片的本地文件名:param attempts: 当前下载尝试次数,默认为0:return: 成功保存的文件名,下载失败返回None"""try:response = requests.get(url, stream=True)if response.status_code == 200:with open(filename, 'wb') as f:for chunk in response.iter_content(1024):f.write(chunk)return url, filename  # 返回包含URL和文件名的元组else:raise Exception(f"HTTP错误码:{response.status_code}")except Exception as e:if attempts < max_download_attempts - 1:print(f"下载尝试失败:{e},重试...")return download_image(url, filename, attempts + 1)else:print(f"下载失败:{url}{e}")return url, None  # 返回包含URL和None(表示下载失败)的元组def create_excel_file(image_data, output_dir, excel_filename):"""创建Excel文件并添加图片信息:param image_data: 包含图片URL和本地路径的元组列表:param output_dir: 目标Excel文件的输出目录:param excel_filename: Excel文件名(不含目录路径)"""global cm_to_px_ratioworkbook = Workbook()sheet = workbook.activefor idx, (img_url, img_path) in enumerate(image_data, start=1):sheet[f"A{idx}"] = img_urlimg = Image(img_path[1])  # 使用元组的第二个元素(文件名)# 设置图片大小为6厘米 × 6厘米cm_to_px_ratio = 20  # 假设1厘米等于96像素img.width = 6 * cm_to_px_ratioimg.height = 6 * cm_to_px_ratio# 将图片放置在与链接同一行的第二列(B列)img.anchor = f"B{idx}"img.left = idx  # 或者 img.left = idx * 250  如果需要图片间有一定的间距img.top = idxsheet.add_image(img)# 调整列宽以适应内容sheet.column_dimensions['A'].width = 6 * cm_to_px_ratiosheet.column_dimensions['B'].width = 6 * cm_to_px_ratiosheet.row_dimensions[idx].height = 6 * cm_to_px_ratioexcel_full_path = os.path.join(output_dir, excel_filename)workbook.save(excel_full_path)print(f"图片及其链接已保存至Excel文件:{excel_full_path}")if __name__ == "__main__":if not image_urls:print("图片链接列表为空,程序退出。")exit(1)# 创建保存目录(如果不存在)if not os.path.exists(save_folder):os.makedirs(save_folder)with ThreadPoolExecutor(max_workers=5) as executor:# 使用线程池并发下载图片image_futures = [executor.submit(download_image, url, os.path.join(save_folder, f"image{idx}.{url.split('.')[-1]}")) foridx, url in enumerate(image_urls, start=1)]# 收集下载结果image_data = [(url, future.result()) for idx, (url, future) inenumerate(zip(image_urls, image_futures), start=1)]# 使用下载的图片信息创建Excel文件create_excel_file(image_data, output_dir, excel_filename)

在这里插入图片描述


http://www.ppmy.cn/news/1442580.html

相关文章

192.168.100.0被划分为8个网段后子网掩码写多少?

题目&#xff1a;192.168.100.0被划分为8个网段后子网掩码写多少&#xff1f; 众所周知&#xff0c;二进制转十进制的公式&#xff1a;2^n2^n-1...2^0 其实一些比较小数值的运算可以使用以下方式&#xff1a; 解析&#xff1a; 先按照2^n计算结果从大到小排列将现在的十进制数…

UI图中的opacity效果和代码效果不一样

有时UI图中使用了opacity属性&#xff0c;这个和前端代码效果不一致&#xff0c;修改方法&#xff1a; 不要用opacity属性&#xff0c;而是使用background:rgba( )的效果接客。

Redis发布-订阅模式之Channel的发布订阅

文章目录 一、简介二、通过频道&#xff08;Channel&#xff09;实现三、代码示例&#xff08;1&#xff09;发布者发送消息&#xff08;2&#xff09;订阅者订阅频道 一、简介 Redis 发布订阅&#xff08;Pus/Sub&#xff09;是一种消息通信模式&#xff1a;发送者通过 publi…

【C++】:拷贝构造函数和赋值运算符重载

目录 一&#xff0c;拷贝构造函数1. 什么是拷贝构造函数2. 拷贝构造函数的特性3. 实践总结 二&#xff0c;赋值运算符重载2.1 运算符重载2.2 赋值运算符重载 一&#xff0c;拷贝构造函数 1. 什么是拷贝构造函数 拷贝构造函数是特殊的构造函数。是用一个已经存在的对象&#x…

06 华三防火墙的如何进入web页面?

1 AI 思路 要进入华三防火墙的Web页面,你需要按照以下步骤操作: 确定防火墙的IP地址:首先,你需要知道你的华三防火墙的IP地址。通常,你可以从网络管理员或者设备本身获取这个信息。 打开浏览器:在你的电脑上打开一个网页浏览器,例如Chrome、Firefox或者Edge等。 输入UR…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口&#xff0c;并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

基础SQL 函数

在MySQL中内置了很多函数&#xff0c;我们可以通过一段程序或者代码直接调用这个函数 一、字符串函数 下面通过例子来验证这些函数 -- 字符串函数-- concat函数 select concat("hello ","world");-- lower函数 select lower("HELLO");-- upper函…

【Flink入门修炼】2-3 Flink Checkpoint 原理机制

如果让你来做一个有状态流式应用的故障恢复&#xff0c;你会如何来做呢&#xff1f; 单机和多机会遇到什么不同的问题&#xff1f; Flink Checkpoint 是做什么用的&#xff1f;原理是什么&#xff1f; 一、什么是 Checkpoint&#xff1f; Checkpoint 是对当前运行状态的完整记…