当前位置:首页>python>还在手动保存图片,OUT了,Python代码1000张照片50行代码搞定

还在手动保存图片,OUT了,Python代码1000张照片50行代码搞定

  • 2026-09-06 06:29:23
还在手动保存图片,OUT了,Python代码1000张照片50行代码搞定
对打工人来说,最痛苦的事情莫过于加班,最最最痛苦的事莫过于在假期里还要不停地加班
这不,假期期间收到一个关于旅游打卡照片下载的问题:单元格一列全是图片链接,要求批量下载到本地 。
很多人遇到过这样的场景:
Excel一列全是图片URL,数量少还好说,右键——另存为,勉强能搞定。
如果有成百上千张,纯手工操作,半天时间就没了。
更糟糕的是,有的链接一行里有好几个网址。
怎么办?怎样快?Python可以一键搞定。
整体思路就4步:一是读取图片链接那一列;二是按景点分组,创建对应文件夹;三是把单元格里的网址拆出来,只认http开头的有效链接;四是循环下载到对应的文件夹。
这套逻辑,1000张图片也不在话下,泡杯茶回来就能搞定了。
完整代码如下,复制修改就能用:
import requestsfrom pathlib import Pathimport pandas as pdimport timedef download_single_image(image_url, save_folder):    try:        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"}        response = requests.get(image_url, headers=headers, timeout=timeout, stream=True)        response.raise_for_status()  # 检查请求是否成功        file_name = image_url.split("/")[-1].split("?")[0]      # 图片文件名        file_path = save_folder / file_name     # 路径        with open(file_path, "wb") as f:            for chunk in response.iter_content(chunk_size=8192):   # 分块写入,8192个字节为8KB                f.write(chunk)        print(f"成功下载: {file_name},保存路径: {save_folder}")        return True    except requests.exceptions.RequestException as e:        print(f"下载失败 {image_url}: {str(e)}")        return False    except Exception as e:        print(f"未知错误 {image_url}: {str(e)}")        return Falses_t = time.time()jiange = 0.2timeout = 5     # 请求超时设置count_url = 0   # 网址数量count_pic = 0   # 下载数量xlsx_path = Path(r"E:\大众携程数据汇总(信息在前).xlsx")df = pd.read_excel(xlsx_path)df = df.dropna(subset=['img'])df_group = df.groupby(by="景点id")for name, group in df_group:    folder_path = xlsx_path.parent / str(name)        # 构建路径    folder_path.mkdir(parents=True, exist_ok=True)    # 新建文件夹    for values in group['img']:        lists = values.split("\n")        for list in lists:            if str(list).startswith("http"):         # 过滤非网址                count_url += 1                if download_single_image(list, folder_path):                    count_pic += 1                time.sleep(jiange)print(f"共{count_url}个网址,成功下载{count_pic}个,用时{time.time() - s_t:.3f}秒")
代码分三部分:
第一部分:导入需要的模块(第1-4行)
requests负责下载图片。
pathlib负责新建文件夹。
pandas负责数据读取、分组和处理
time负责延时和运行时长统计
第二部分:单张图片下载函数(第6-25行)
第8行的headers是请求头,让代码伪装成浏览器。
第9行的timeout是请求超时设置,如果不设置程序可能会无限期挂起而卡死。
第11行的split("/")[-1].split("?")[0]从网址里截取干净的文件名
第14行的chunk_size=8192是下载时分块的大小,8192个字节=8KB,每次只读取8KB数据到内存。
第三部分:读取Excel,分组,批量下载(27-50行)
第28行的jiange = 0.2表示每张图片间隔0.2秒
第35行的df.dropna(subset=['img'])表示自动过滤空单元格。
第36行的df.groupby(by="景点id")表示按“景点id”分组。
第39-40行构建新路径,创建新的文件夹。
第42行values.split("\n")作用是把一个单元格里的多行网址拆分出来。
第44行ifstr(list).startswith("http")表示只读取有效链接。
第48行time.sleep(jiange)表示间隔时间,请求更稳定。
再来看效果。我用这段代码把Excel文件跑一遍,1001个网址,999张图片,用时313秒,也就一杯茶的时间。
半天的活变成了一键搞定,说实话,你做你也行!

最新文章

随机文章