【问题标题】:Unable to get rid of blank screen popping up while scraping content抓取内容时无法摆脱弹出的空白屏幕
【发布时间】:2019-07-24 05:26:25
【问题描述】:

我创建了一个宏来解析不同电影的名称,该电影遍历来自一个 torrent 网站的多个页面。我将InternetExplorerHtml.body.innerHTML 解析器(通常与 xmlhttp 请求一起使用)结合使用以加快执行速度。虽然这个网站的内容不是动态的,但我使用 IE 来查看它在结合 Html.body.innerHTML 进行抓取时的行为。

当我使用 IE 运行我的脚本时,它会按预期解析内容并完成工作。我面临的唯一问题是每个分页中都会突然出现一个空白屏幕,如下图所示。

我怎样才能摆脱这个黑屏问题?

我的脚本(当我将Html.body.innerHTML 与 Chrome 驱动程序结合使用时没有问题):

Sub FetchContent()
    Const link = "https://yts.am/browse-movies/0/all/action/0/latest?page="
    Dim driver As New ChromeDriver, Html As New HTMLDocument, genre$
    Dim post As HTMLDivElement, I&, R&

    For I = 1 To 3
        With driver
            .AddArgument "--headless"
            .get link & I
            Html.body.innerHTML = .ExecuteScript("return document.documentElement.outerHTML")
        End With
        For Each post In Html.getElementsByClassName("browse-movie-bottom")
            R = R + 1: Sheets(1).Cells(R, 1) = post.getElementsByClassName("browse-movie-title")(0).innerText
        Next post
    Next I
    driver.Quit
End Sub

当我尝试将Html.body.innerHTML 与 IE 结合使用时,我希望获得相同的行为,但它会产生空白屏幕以及所需的结果:

Sub FetchContent()
    Const link = "https://yts.am/browse-movies/0/all/action/0/latest?page="
    Dim IE As New InternetExplorer, Html As New HTMLDocument, genre$
    Dim post As HTMLDivElement, I&, R&

    For I = 1 To 4
        With IE
            .Visible = False
            .navigate link & I
            While .Busy Or .readyState < 4: DoEvents: Wend
            Html.body.innerHTML = .document.DocumentElement.outerHTML
        End With
        For Each post In Html.getElementsByClassName("browse-movie-bottom")
            R = R + 1: Sheets(1).Cells(R, 1) = post.getElementsByClassName("browse-movie-title")(0).innerText
        Next post
    Next I
    IE.Quit
End Sub

IEHtml.body.innerHTML 组合时每个分页中出现的空白屏幕:

【问题讨论】:

  • 使用html.Write ie.Document.body.outerHtml,后跟html.Close。用Set ie = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 实例化IE,用Set html = CreateObject("new:{25336920-03F9-11CF-8FD0-00AA00686F13}") 实例化文档。
  • 很高兴从您@Florent B 那里得到任何解决方案。问题是由于我的知识浅薄,我几乎无法在我的脚本中实现您建议的部分。但是,如果您介意将此作为答案,我将不胜感激。谢谢。

标签: excel vba web-scraping internet-explorer-11


【解决方案1】:

我尝试用 IE 测试你的代码,发现我能够产生问题。

我发现下面一行导致了这个问题。

Html.body.innerHTML = .document.DocumentElement.outerHTML

以下是解决此问题的代码的修改版本。

Sub FetchContent1()
    Const link = "https://yts.am/browse-movies/0/all/action/0/latest?page="
    Dim IE As New InternetExplorer, Html As New HTMLDocument, genre$
    Dim post As HTMLDivElement, I&, R&

    For I = 1 To 4
        With IE
            .Visible = False
            .navigate link & I
            While .Busy Or .readyState < 4: DoEvents: Wend

            For Each post In .document.getElementsByClassName("browse-movie-bottom")
            R = R + 1: Sheets(1).Cells(R, 1) = post.getElementsByClassName("browse-movie-title")(0).innerText
        Next post
        End With

    Next I
    IE.Quit
End Sub

IE 11 中的输出:

现在,它不会在 IE 中打开任何空白页了。

【讨论】:

  • 我创建这篇文章只是为了了解Html.body.innerHTML 结合IE 的用法。所以,保留这个Html.body.innerHTML 是必须的。谢谢。
  • 看起来将 outerHTML 分配给 innerHTML 会导致此问题。如果您想保留 Html.body.innerHTML 而不是尝试创建 MSXML2.XMLHTTP 对象。请参阅此链接中的第一个代码示例。 codingislove.com/parse-html-in-excel-vba 内部 HTML 属性的其他参考。 docs.microsoft.com/en-us/previous-versions/office/developer/…
  • 您正在尝试将 IE 自动化的代码执行与 Chrome 驱动程序进行比较。这是不公平的比较。在 IE 中,您遇到了这个问题,上面的解决方案可以帮助您解决这个问题。
  • 这绝对是一个公平的问题,为什么一个人可以做,而除非有一个非常强有力的理由。但是,我是出于这个原因。您正在尝试的方式是帮助我获取内容,但为了您的信息,我在几年前了解到@Deepak-MSFT。谢谢。
  • 您正在尝试将 IE 自动化与 Chrome 驱动程序进行比较。 Chrome 驱动程序不是 Microsoft 的产品,它是第三方产品。 IE 自动化和 Chrome 驱动程序的工作机制可能存在许多差异。目前没有任何信息或任何可用的文档可以说明为什么 Html.body.innerHTML 不能与 IE 自动化一起使用。如果我将来得到任何文件,我会尽力为您提供。感谢您的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2013-01-01
  • 1970-01-01
相关资源
最近更新 更多