VBA因xmlhttp请求循环而崩溃

时间:2018-12-14 11:24:17

标签: excel vba excel-vba web-scraping xmlhttprequest

我正在尝试将该宏从ie.application重写为VBA中的http请求。 宏会导航到URL,先获取html,然后解析并抓取所需的数据。

它可以很好地处理一个请求,但是当我尝试使用包含数千个URL的FOR循环来执行此操作时,Excel就会崩溃。

我认为我应该在进入下一个循环之前以某种方式“关闭”连接,但是我没有找到解决方案。

这是我的代码:

Sub GetQuotes()
    Dim xmlhttp As New MSXML2.XMLHTTP60, myurl As String
    Dim html As New HTMLDocument


    For r = 1 To 10

'*****GO TO PRODUCT PAGE*****
        path= ThisWorkbook.Worksheets("Sheet1").Cells(r, 1).Value
        myurl = "https://some_domain.com" + path

        xmlhttp.Open "GET", myurl, False
        xmlhttp.send
        html.body.innerHTML = xmlhttp.responseText



'*****GET PRICE*****
        If Not html.getElementById("some_id") Is Nothing Then
            price = html.getElementById("some_id").innerHTML
            ThisWorkbook.Worksheets("sheet1").Cells(r, 2).Value = price
        Else
            price = "empty"
            ThisWorkbook.Worksheets("sheet1").Cells(r, 2).Value = price
        End If

        Next r

    End Sub

XML和HTML引用处于活动状态

2 个答案:

答案 0 :(得分:0)

挤入

Do While xmlhttp.ReadyState <> 4
    DoEvents
Loop

发送后。您当前的代码几乎会立即触发所有请求。这样,您将等待页面加载后再继续。

答案 1 :(得分:0)

这有效:

发送请求后立即在内部执行DoEvents。

仅在下一个r之前有一个DoEvent。

仅使用其中之一是无效的。