ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 531|回复: 9

[求助] urldownloadtofile下载图片卡住

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-11 17:11 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在用urldownloadtofile下载百度图片时有时会卡住,明明文件不大,有方法把下载时间较长的跳过吗?或者有没有其他方法,实在等的太慢了



#If VBA7 Then '64位
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal IpfnCB As Long) As Long

#Else
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal IpfnCB As Long) As Long
#End If

Sub DownLoadFile1()
    Dim PageNum
    Dim sSource As String
    Dim sLocal As String
    PageNum = 0
    j = 1
    For k = 1 To 2
        sSource = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=11400304292847218692&ipn=rj&ct=201326592&is=&fp=result&fr=&word=%E7%BE%8E%E5%A5%B3&cg=girl&queryWord=%E7%BE%8E%E5%A5%B3&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=0&ic=0&hd=0&latest=0&copyright=0&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn=" & PageNum & "&rn=30&gsm=1e&1681179430816="
        sLocal = "C:\Users\16118\Desktop\百度图片\"  '下载保存路径
        With CreateObject("Msxml2.XMLHTTP")
            .Open "GET", sSource
            .Send
            Do Until .ReadyState = 4
                DoEvents
            Loop
            s = Split(.responseText, """")
            For i = 2 To UBound(s)
                If s(i) Like "ippr*" And s(i - 2) = "objURL" Then
                    Debug.Print decode(s(i) & "")
                    URLDownloadToFile 0, decode(s(i) & ""), sLocal & j & ".jpg", 0, 0
                    j = j + 1
                End If
            Next
            Erase s
        End With
    PageNum = PageNum + 30
    Next
    MsgBox "已完成!"
End Sub
Function decodes(s As String) As String
    Dim str As String
    Dim bef_chr()
    Dim aft_chr()
    bef_chr() = Array("w", "k", "v", "1", "j", "u", "2", "i", "t", "3", "h", "s", "4", "g", "5", "r", "q", "6", "f", "p", "7", "e", "o", "8", "d", "n", "9", "c", "m", "0", "b", "1", "a", "-")
    aft_chr() = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-")
    str = ""
    s = Replace(s, "_z2C$q", ":")  '"_z2C$q", "_z&e3B", "AzdH3F"
    s = Replace(s, "_z&e3B", ".")  '":", ".", "/"
    s = Replace(s, "AzdH3F", "/")
    flag = True
    For i = 1 To Len(s)
        For j = 0 To UBound(bef_chr)
            If Mid(s, i, 1) = bef_chr(j) Then
                str = str & aft_chr(j)
                flag = False
                Exit For
            Else
            flag = True
            End If
        Next j
        If flag Then
        str = str & Mid(s, i, 1)
        End If
        flag = True
    Next i
    decodes = str
   'decode = Replace(str, " ", "")
'加密{w:"a",k:"b",v:"c",1:"d",j:"e",u:"f",2:"g",i:"h",t:"i",3:"j",h:"k",s:"l",4:"m",g:"n",5:"o",r:"p",q:"q",6:"r",f:"s",p:"t",7:"u",e:"v",o:"w",8:"1",d:"2",n:"3",9:"4",c:"5",m:"6",0:"7",b:"8",l:"9",a:"0",_z2C$q:":","_z&e3B":".",AzdH3F:"/"}
End Function


附件.zip

14.97 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2023-4-11 18:38 | 显示全部楼层
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
    Private Declare PtrSafe Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
#Else
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
    Private Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
#End If

Sub 下载图片()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Dim i, arr, ReturnVal&, m
    arr = [a1].CurrentRegion
    If Dir(ThisWorkbook.Path & "\照片\", vbDirectory) = "" Then MkDir (ThisWorkbook.Path & "\照片")
    If Dir(ThisWorkbook.Path & "\二维码\", vbDirectory) = "" Then MkDir (ThisWorkbook.Path & "\二维码")
    For i = 2 To UBound(arr)
        n = n + 1
        If Len(n) = 1 Then m = "00" & n
        If Len(n) = 2 Then m = "0" & n
        If Len(n) = 3 Then m = n
        sPath = ThisWorkbook.Path & "\照片\"
        ReturnVal = URLDownloadToFile(0, arr(i, 20), sPath & m & "-" & arr(i, 1) & "-" & arr(i, 3) & ".jpg", 0, 0)
        sPath = ThisWorkbook.Path & "\二维码\"
        ReturnVal = URLDownloadToFile(0, arr(i, 21), sPath & m & "-" & arr(i, 1) & "-" & arr(i, 3) & ".jpg", 0, 0)
    Next
    MsgBox "加载完毕!", 48, "提示!"
End Sub

作者:约定的童话  QQ:1975382969

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-11 20:55 | 显示全部楼层
约定的童话 发表于 2023-4-11 18:38
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias " ...

你好,请问你的做法是把地址放数组然后一个一个下吗?
我发现如果当下载地址为如下地址时,网页都显示错误,这时urldownloadtofile下载不下来,程序也卡死了,也就导致了等待时间长,如何当遇到这样的无效网址时可以跳过这个网址呢
https://pic.jj20.com/up/allimg/mn02/1231201R102/2012311R102-4.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-11 21:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
约定的童话 发表于 2023-4-11 18:38
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias " ...

你好,谢谢,我发现,对于下载的地址如果为错误地址,urldownloadtofile下载时会卡住,导致程序卡死,有办法能在发现为错误地址时跳过这个地址的下载,或者超时时跳过

TA的精华主题

TA的得分主题

发表于 2023-4-12 07:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cxzvxzc 发表于 2023-4-11 21:59
你好,谢谢,我发现,对于下载的地址如果为错误地址,urldownloadtofile下载时会卡住,导致程序卡死,有 ...

On error resume next试一下

TA的精华主题

TA的得分主题

发表于 2023-4-12 15:39 | 显示全部楼层
本帖最后由 perfect131 于 2023-4-12 15:47 编辑
cxzvxzc 发表于 2023-4-11 20:55
你好,请问你的做法是把地址放数组然后一个一个下吗?
我发现如果当下载地址为如下地址时,网页都显示错 ...

不推荐用 URLDownloadToFile ,不稳定,而且较慢,用协议获取 ,再用 htmfile 解析 json 就可以
可以搞

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-13 17:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
perfect131 发表于 2023-4-12 15:39
不推荐用 URLDownloadToFile ,不稳定,而且较慢,用协议获取 ,再用 htmfile 解析 json 就可以
可以搞: ...

有案例或者文章可以参考吗?

TA的精华主题

TA的得分主题

发表于 2023-4-13 17:51 | 显示全部楼层
本帖最后由 jokklx 于 2023-4-14 08:22 编辑
cxzvxzc 发表于 2023-4-13 17:23
有案例或者文章可以参考吗?

这个是我用来下载word文档的
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    WinHttpReq.Option(4) = 13056
        For i = c.Row + 1 To Sheets("基本信息").Range("c100").End(xlUp).Row
            url = "http://xxxxxx" & Sheets("基本信息").Range("g" & i)
            WinHttpReq.Open "GET", url, False
            WinHttpReq.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
           'WinHttpReq .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
            WinHttpReq.setRequestHeader "Cookie", Cookie
            WinHttpReq.Send
myURL = WinHttpReq.ResponseBody
Set oStream = CreateObject("ADODB.Stream")
  oStream.Open
  oStream.Type = 1
  oStream.Write WinHttpReq.ResponseBody
  oStream.SaveToFile file_path & "\" & savename, 2
  oStream.Close

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-13 20:24 来自手机 | 显示全部楼层
jokklx 发表于 2023-4-13 17:51
这个是我用来下载word文档的
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("WinHttp.WinH ...

好的,我研究下

TA的精华主题

TA的得分主题

发表于 2023-4-16 11:48 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-27 22:16 , Processed in 0.045714 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表