kaijie117 发表于 2024-11-23 02:34

获取CSV中的图片链接,并下载保存到对应文件夹中

本帖最后由 kaijie117 于 2024-11-23 16:02 编辑

获取CSV中第AE列(第31列)每行数据为图片链接
获取第C列(第3列)每行数据,作为文件夹名称
   其中每行单元格包含多个图片链接,它们使用,隔开
   下载到对应C列数据的文件夹中,图片文件名保留原文件名

举例

C列   AE列
TEST   https://cdn-fusion.imgcdn.store/i/2024/bd462b3f96eaca92.jpg,https://cdn-fusion.imgcdn.store/i/2024/9b317940dca5fc26.png

保存结果
文件夹TEST
   包含图片
   bd462b3f96eaca92.jpg
   9b317940dca5fc26.png

图片类型:webp,jpg,png 等几种常见的图片格式
若某行的AE列没有图片链接则跳过该行.

感谢{:17_1077:}

DetectiveConan 发表于 2024-11-23 02:34

写了个powershell脚本(类似于bat批处理脚本)https://x.ws28.cn/f/fn0xkvz9bal 复制链接到浏览器打开

1、下载后放到和你的CSV文件同级文件夹下,右键,用记事本打开,按照下面的图片改一下内容,
改一下csv文件名,第3列的列名,第31列的列名

https://www.helloimg.com/i/2024/11/23/6741960846292.png

我测试用的test.csv
https://www.helloimg.com/i/2024/11/23/6741966804a6e.png


2、保存后,右键,选择”使用 PowerShell 运行“。

rootbot007 发表于 2024-11-23 10:31

个人已经尝试了直接在csv中编写对应vb代码有效性,其中有一些前提条件:
1. 数据在第一个表格
Set ws = ThisWorkbook.Sheets(1) ' 假设数据在第一个工作表
2. 数据是从第一行开始的,也就是没有标题数据,若不是可以更改代码中对应数字即可
For i = 1 To lastRow ' 假设数据从第1行开始

接下来是所有代码,可直接在csv文件中运行
Sub DownloadImagesFromCSV()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim folderName As String
    Dim imageLinks As String
    Dim links() As String
    Dim link As String
    Dim fileName As String
    Dim imgFolderPath As String
    Dim currentDir As String
    Dim linkIndex As Long
    Dim imgPath As String
   
    currentDir = ThisWorkbook.Path

    ' 当前工作表
    Set ws = ThisWorkbook.Sheets(1) ' 假设数据在第一个工作表

    ' 获取最后一行
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' 遍历每一行数据
    For i = 1 To lastRow ' 假设数据从第1行开始
      folderName = ws.Cells(i, 3).Value ' 获取 C 列作为文件夹名
      imageLinks = ws.Cells(i, 31).Value ' 获取 AE 列作为图片链接

      ' 如果 AE 列没有图片链接,跳过该行
      If Len(Trim(imageLinks)) = 0 Then
            GoTo SkipRow
      End If

      ' 分割多个图片链接(以逗号分隔)
      links = Split(imageLinks, ",")

      ' 如果 links 数组没有有效的图片链接,跳过该行
      If UBound(links) < 0 Then
            GoTo SkipRow
      End If

      ' 创建相对路径的文件夹(如果不存在)
      imgFolderPath = currentDir & "\" & folderName
      If Dir(imgFolderPath, vbDirectory) = "" Then
            MkDir imgFolderPath
      End If

      ' 下载每个图片
      For linkIndex = 0 To UBound(links)
            link = Trim(links(linkIndex)) ' 获取当前链接
            If link <> "" Then
                ' 获取图片的文件名(从链接中提取)
                fileName = Mid(link, InStrRev(link, "/") + 1)
                imgPath = imgFolderPath & "\" & fileName

                ' 调用 DownloadFile 函数来下载图片
                Call DownloadFile(link, imgPath)
            End If
      Next linkIndex
      
SkipRow:
    Next i

    MsgBox "图片下载完成!"
End Sub

' 下载文件的函数
Sub DownloadFile(url As String, filePath As String)
    Dim httpRequest As Object
    Dim byteArray() As Byte
    Dim fileNumber As Integer

    ' 创建 HTTP 请求对象
    Set httpRequest = CreateObject("MSXML2.XMLHTTP")
   
    ' 发送 GET 请求
    httpRequest.Open "GET", url, False
    httpRequest.Send
   
    ' 检查请求是否成功
    If httpRequest.Status = 200 Then
      ' 获取响应体(二进制数据)
      byteArray = httpRequest.responseBody
      
      ' 获取文件号
      fileNumber = FreeFile
      
      ' 打开文件进行写入
      Open filePath For Binary Access Write As #fileNumber
      
      ' 写入数据
      Put #fileNumber, , byteArray
      
      ' 关闭文件
      Close #fileNumber
    Else
      MsgBox "下载失败,HTTP 状态码: " & httpRequest.Status, vbCritical
    End If
End Sub

kaijie117 发表于 2024-11-23 15:21

rootbot007 发表于 2024-11-23 10:31
个人已经尝试了直接在csv中编写对应vb代码有效性,其中有一些前提条件:
1. 数据在第一个表格


按照要求设置为第一个工作蒲.将For i = 1 To lastRow修改为 For i = 2 To lastRow

运行DownloadImagesFromCSV启动运行.秒提示图片下载成功.
查看目录,并未创捷文件夹和下载文件{:17_1082:}

kaijie117 发表于 2024-11-23 15:25

https://cdn-fusion.imgcdn.store/i/2024/1b9e8cb61525b2d3.png
运行前的设置,因为没有用过VB代码.不知道有没有错误

kaijie117 发表于 2024-11-23 17:58

DetectiveConan 发表于 2024-11-23 02:34
写了个powershell脚本(类似于bat批处理脚本)https://x.ws28.cn/f/fn0xkvz9bal 复制链接到浏览器打开

1 ...

下载的时候能不能加个重试次数5次, 出现网络波动它就跳过了{:17_1077:}

DetectiveConan 发表于 2024-11-23 18:05

kaijie117 发表于 2024-11-23 17:58
下载的时候能不能加个重试次数5次, 出现网络波动它就跳过了

https://x.ws28.cn/f/fn1ht3xk1pm 复制链接到浏览器打开

第25行,$maxRetries = 5
现在是5次,你想几次就改成几次
页: [1]
查看完整版本: 获取CSV中的图片链接,并下载保存到对应文件夹中