Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在某些循环结束之前,无法使脚本处理错误_Vba_Web Scraping_Error Handling_Proxy - Fatal编程技术网

Vba 在某些循环结束之前,无法使脚本处理错误

Vba 在某些循环结束之前,无法使脚本处理错误,vba,web-scraping,error-handling,proxy,Vba,Web Scraping,Error Handling,Proxy,我已经用vba编写了一个脚本,用于在发出代理请求时获取填充的ip地址。我在vba脚本中使用了代理(代理列表之外)进行测试(目前可能没有任何代理工作) 然而,我想要实现的是,当一个请求失败时,下面的脚本将打印该错误消息并继续执行下一个请求,否则它将解析该站点的ip地址并继续执行,直到循环耗尽 到目前为止,我的尝试(认为proxyList是有效的): Sub ValidateProxies() Dim Http作为新服务器XMLHttp60,elem作为对象,S$ Dim proxyList作为变体

我已经用vba编写了一个脚本,用于在发出代理请求时获取填充的ip地址。我在vba脚本中使用了代理(代理列表之外)进行测试(目前可能没有任何代理工作)

然而,我想要实现的是,当一个请求失败时,下面的脚本将打印该错误消息并继续执行下一个请求,否则它将解析该站点的ip地址并继续执行,直到循环耗尽

到目前为止,我的尝试(认为
proxyList
是有效的):

Sub ValidateProxies()
Dim Http作为新服务器XMLHttp60,elem作为对象,S$
Dim proxyList作为变体,oProxy作为变体
proxyList=[{“98.163.59.8:8080”、“134.209.115.223:3128”、“191.101.233.198:3129”、“198.177.126.218:80”、“35.185.201.225:8080”}]
对于proxyList中的每个oProxy
出错时继续下一步
使用Http
.打开“获取”https://www.myip.com/”“错
.setRequestHeader“用户代理”、“Mozilla/5.0”
.setProxy 2,oProxy
.发送
以
错误转到0
如果错误号为0,则
Debug.Print“遇到错误”
其他:
使用新的HTMLDocument
.body.innerHTML=Http.responseText
Set elem=.querySelector(“#ip”)
R=R+1:细胞(R,1)=丙氧基
单元格(R,2)=元素innerText
以
如果结束
下一个奥普拉
端接头

当出现错误时,如何让脚本打印任何错误并一直滚动直到循环结束?

这将打印遇到的所有错误,您应该根据错误编号进行调整

Option Explicit
Public Sub ValidateProxies()
    Dim http As New ServerXMLHTTP60, elem As Object, S$
    Dim proxyList As Variant, oProxy As Variant, r As Long
    Dim html As HTMLDocument
    Set html = New HTMLDocument
    proxyList = [{"98.163.59.8:8080","134.209.115.223:3128","191.101.233.198:3129","198.177.126.218:80","35.185.201.225:8080"}]

    For Each oProxy In proxyList
        On Error GoTo errhand:
        With http
            .Open "GET", "https://www.myip.com/", False
            .setRequestHeader "User-Agent", "Mozilla/5.0"
            .SetProxy 2, oProxy
            .send
            With html
                .body.innerHTML = http.responseText
                Set elem = .querySelector("#ip")
                r = r + 1: ActiveSheet.Cells(r, 1) = oProxy
                ActiveSheet.Cells(r, 2) = elem.innerText
            End With
        End With
    Next oProxy
    Exit Sub

errhand:
    If Err.Number <> 0 Then
        Debug.Print "Encountered an error " & Err.Description, oProxy
        Err.Clear
        Resume Next
    End If

End Sub
选项显式
公共子验证eProxies()
Dim http作为新服务器XMLHttp60,elem作为对象,S$
Dim proxyList为变体,oProxy为变体,r为长
将html设置为HTMLDocument
设置html=新的HTMLDocument
proxyList=[{“98.163.59.8:8080”、“134.209.115.223:3128”、“191.101.233.198:3129”、“198.177.126.218:80”、“35.185.201.225:8080”}]
对于proxyList中的每个oProxy
出错时转到errhand:
使用http
.打开“获取”https://www.myip.com/”“错
.setRequestHeader“用户代理”、“Mozilla/5.0”
.SetProxy 2,oProxy
.发送
使用html
.body.innerHTML=http.responseText
Set elem=.querySelector(“#ip”)
r=r+1:ActiveSheet.Cells(r,1)=oProxy
ActiveSheet.Cells(r,2)=元素innerText
以
以
下一个奥普拉
出口接头
错误:
如果错误号为0,则
Debug.Print“遇到错误”&错误描述,oProxy
呃,明白了
下一步继续
如果结束
端接头

以下是异步请求池的示例,并将状态和错误记录到工作表中。它使用来自的代理列表

选项显式
子TestProxy()
常数池容量=50
常数ReqTimeout=15
暗sResp
暗黑名单
暗匹配
暗色oWS
暗淡的林黛克斯
暗池
昏暗的我
暗淡的结果
淡奥利克
'正在从free-proxy-list.net解析代理列表
使用CreateObject(“MSXML2.ServerXMLHTTP.6.0”)
.打开“获取”https://free-proxy-list.net/”“是的
.SetRequestHeader“用户代理”、“Mozilla/5.0(Windows NT 6.1;Win64;x64)”
.发送
Do Until.ReadyState=4:DoEvents:Loop
sResp=.ResponseText
以
使用CreateObject(“VBScript.RegExp”)
.Global=True
.Pattern=“]*>(\d+\.\d+\.\d+.\d+)]*>(\d+)
aProxyList=数组()
对于每个oMatch In.Execute(sResp)
重拨保留aProxyList(UBound(aProxyList)+1)
aProxyList(UBound(aProxyList))=oMatch.子匹配(0)和“:”和oMatch.子匹配(1)
下一个
以
'使用api.myip.com请求进行代理检查
设置oWS=ThisWorkbook.Sheets(1)
oWS.Cells.Delete
Set ocPool=新集合
林德克斯=0
做
'检查池中是否有已完成的请求
对于i=ocPool.Count到1步-1
出错时继续下一步
sResult=“”
(i)(0)
选择Case True
病例:再结晶状态<4
案例状态\100 2
sResult=“Status”和.Status&“/”和.StatusText
其他情况
sResult=.ResponseText
结束选择
以
选择Case True
案例错误编号0
sResult=“Error”&Err.Number&“/”&Err.Description
案例(现在-ocPool(i)(1))*86400>请求超时
sResult=“超时”
结束选择
错误转到0
如果sResult“”则
oWS.Cells(ocPool(i)(2),2).Value=sResult
ocPool,移除我
如果结束
多芬特
下一个
'将新请求添加到池中
如果ocPool.Count
您是否尝试过单步执行代码?是的,我刚才这样做了,可以发现在它的第一个循环中它工作得很好,但是当它第二次循环时,它抛出这个错误
完成操作所需的数据还不可用
指向这一行
.body.innerHTML=Http.responseText
。如果出现错误并且有一个外循环,请结束子循环重复调用此sub并打印可能的错误消息。将sub改为可以向printOopsy返回可能的错误消息的函数!打字错误现在试试。奇怪的是,即使出现错误,r仍然会增加。您可以尝试ActiveSheet.Cells(r,2)=elem.innerText:Set elem=Nothing我也无法做很多调试工作。我想试着理解,如果r仍然在递增,为什么它会被覆盖。set elem=n是否也会发生同样的情况
Option Explicit
Public Sub ValidateProxies()
    Dim http As New ServerXMLHTTP60, elem As Object, S$
    Dim proxyList As Variant, oProxy As Variant, r As Long
    Dim html As HTMLDocument
    Set html = New HTMLDocument
    proxyList = [{"98.163.59.8:8080","134.209.115.223:3128","191.101.233.198:3129","198.177.126.218:80","35.185.201.225:8080"}]

    For Each oProxy In proxyList
        On Error GoTo errhand:
        With http
            .Open "GET", "https://www.myip.com/", False
            .setRequestHeader "User-Agent", "Mozilla/5.0"
            .SetProxy 2, oProxy
            .send
            With html
                .body.innerHTML = http.responseText
                Set elem = .querySelector("#ip")
                r = r + 1: ActiveSheet.Cells(r, 1) = oProxy
                ActiveSheet.Cells(r, 2) = elem.innerText
            End With
        End With
    Next oProxy
    Exit Sub

errhand:
    If Err.Number <> 0 Then
        Debug.Print "Encountered an error " & Err.Description, oProxy
        Err.Clear
        Resume Next
    End If

End Sub