【问题标题】:Crashing with loop of xmlhttp requestsxmlhttp 请求循环崩溃
【发布时间】:2020-01-26 12:42:15
【问题描述】:

我正在尝试将此宏从 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 引用处于活动状态

【问题讨论】:

  • Next r 之前添加DoEvents。现在检查?
  • 找出崩溃的临界点在哪里,或者分批处理(在这一点之下),或者尝试在某个步骤添加等待(比如每 500 个或其他)....

标签: excel vba web-scraping xmlhttprequest


【解决方案1】:

挤一挤

Do While xmlhttp.ReadyState <> 4
    DoEvents
Loop

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

【讨论】:

    【解决方案2】:

    这行得通:

    在发送请求后,内部带有 DoEvents 的 do-while。

    一个单独的 DoEvents 就在下一个 r 之前。

    只使用其中一个,不起作用。

    【讨论】:

    • 即使您使用MSXML2.XMLHTTP60 @user10523399 发送请求,您确定您使用A do-while with DoEvents 得到了结果吗?到目前为止,我的知识是:利用那个循环(当你不使用 IE 时)是完全没用的。
    • 就像我说的那样,它不起作用,因为我还必须在下一条语句之前添加一个 doEvents。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多