-
导入必要的库:包括
pandas
用于处理CSV文件,requests
用于发送网络请求,以及os
和time
等进行文件系统操作和可能的时间控制。 -
设置路径:指定了CSV文件的位置和图片将要保存的目录。如果保存目录不存在,脚本会自动创建。
-
配置HTTP请求会话:使用
requests.Session()
建立会话,并通过Retry
和HTTPAdapter
添加了重试逻辑,以便在网络问题导致的失败后自动重试下载。这样提高了下载过程的健壮性。 -
定义请求头:模拟浏览器的User-Agent字符串,某些网站可能需要特定的User-Agent来允许访问或下载。
-
遍历CSV文件并下载图片:
- 对CSV中的每一行,提取图片URL。
- 使用URL的最后一部分作为图片的文件名,确保唯一性和可读性。
- 在尝试下载前,检查文件是否已存在,避免重复下载。
- 使用配置好的会话发送GET请求,并设置超时避免长时间阻塞。
- 成功下载后,图片被写入到本地文件系统,并更新下载计数。
- 如果遇到任何请求异常或非200状态码,会打印错误信息并继续处理下一行。
-
最终统计:完成所有URL的处理后,打印出成功下载的图片总数。
import pandas as pd import requests import os import time from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry # 设置CSV文件路径和保存图片的目录 csv_file_path = 'D:\\Desktop\\image\\下载.csv' # 你的CSV文件路径 save_dir = 'D:\\a\\Desktop\\image\\images' # 保存图片的目录路径 # 检查保存目录是否存在,不存在则创建 if not os.path.exists(save_dir): os.makedirs(save_dir) # 读取CSV文件 df = pd.read_csv(csv_file_path) # 准备HTTP会话,设置重试策略 session = requests.Session() retries = Retry(total=5, # 设置最大重试次数为5 backoff_factor=0.1, # 重试间隔时间的因子,重试间的实际时间会因此递增 status_forcelist=[500, 502, 503, 504]) # 设置应该重试的HTTP状态码 session.mount('http://', HTTPAdapter(max_retries=retries)) session.mount('https://', HTTPAdapter(max_retries=retries)) # 设置请求头信息,模拟浏览器行为 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.0.0 Safari/537.36' } # 记录下载的图片数量 downloaded_count = 0 # 遍历CSV中的每一行,下载图片 for index, row in df.iterrows(): pic_url = row['picUrl'] # 获取图片的URL filename = os.path.join(save_dir, pic_url.split('/')[-1]) # 根据URL生成本地文件名和路径 if os.path.exists(filename): print(f"文件 {filename} 已存在,跳过下载。") continue try: # 发送HTTP请求获取图片,设置请求头并允许重试 response = session.get(pic_url, headers=headers, stream=True, timeout=10) # 设置超时时间避免长时间等待无响应的服务器 # 检查请求是否成功 if response.status_code == 200: with open(filename, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) downloaded_count += 1 # 每成功下载一个图片,增加计数 print(f"图片已保存到: {filename}") else: print(f"无法下载图片: {pic_url},状态码: {response.status_code}") except requests.exceptions.RequestException as e: print(f"下载图片时出错(第{index+1}行): {e}") # 打印下载的图片数量 print(f"总共下载了 {downloaded_count} 张图片。")