【问题标题】:MSXML2.XMLHTTP page request: How do you make sure you get ALL of the final HTML code?MSXML2.XMLHTTP 页面请求:如何确保获得所有最终 HTML 代码?
【发布时间】:2014-07-26 06:43:59
【问题描述】:

我使用这个简单的子程序从 Web 加载 HTML 文档已经有一段时间了,没有任何问题:

Function GetSource(sURL As String) As Variant

' Purpose:   To obtain the HTML text of a web page
' Receives:  The URL of the web page
' Returns:   The HTML text of the web page in a variant

Dim oXHTTP As Object, n As Long

Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
oXHTTP.Open "GET", sURL, False
oXHTTP.send
GetSource = oXHTTP.responsetext
Set oXHTTP = Nothing

结束函数

但我遇到了这样一种情况,它大部分时间只加载页面的一部分(并非总是如此——有时它会加载所有预期的 HTML 代码)。如果您从浏览器将页面的 HTML 保存到 Web 上的另一个文件,子例程将始终毫无问题地读取它。

我猜问题出在时间上——动态页面注册“完成”,而脚本仍在填写详细信息。有时它会及时完成,有时则不会。

以前有没有人遇到过这种行为并克服了它?似乎应该有一种方法可以通过 MSXML2.XMLHTTP 对象准确捕获如果转到页面并选择保存到 HTML 选项会得到什么。

如果您想亲自查看该行为,以下是加载不一致的页面示例:

http://www.tiff.net/festivals/thefestival/programmes/specialpresentations/mr-turner

这是同一页面的已保存 HTML 文件:

http://tofilmfest.ca/2014/film/fest/Mr_Turner.htm

是否有任何已知的解决方法?

【问题讨论】:

  • 您说的是动态页面,但XMLHTTP 将简单地下载服务器返回的任何内容,不像浏览器会执行任何内容修改脚本等,这可能是您所看到的吗? - 您还应该检查请求.status 以确保它按预期执行。页面的哪些部分缺失?它被截断了吗? (没有

标签: vba xmlhttprequest web-scraping


【解决方案1】:

我找到了一种解决方法,可以满足我的需求。我以编程方式控制 Internet Explorer,并在告诉它导航到页面以使内容完成加载后调用三秒延迟。然后我使用 Microsoft 的 HTML 库中的 IHTMLElement 提取 HTML 代码。它并不漂亮,但它检索了我尝试过的每个页面的所有 HTML 代码。如果有人有更好的方法来达到同样的目的,请随意炫耀。

Function testbrowser() As Variant
   Dim oIE As InternetExplorer
   Dim hElm As IHTMLElement
   Set oIE = New InternetExplorer
   oIE.Height = 600
   oIE.Width = 800
   oIE.Visible = True
   oIE.Navigate "http://www.tiff.net/festivals/thefestival/programmes/galapresentations/the-riot-club"
   Call delay(3)
   Set hElm = oIE.Document.all.tags("html").Item(0)
   testbrowser = hElm.outerHTML
End Function

Sub delay(ByVal secs As Integer)
   Dim datLimit As Date
   datLimit = DateAdd("s", secs, Now())
   While Now() < datLimit
   Wend
End Sub

【讨论】:

【解决方案2】:

按照 Alex 的建议,以下是如何在没有蛮力固定延迟的情况下做到这一点:

Function GetHTML(ByVal strURL as String) As Variant
  Dim oIE As InternetExplorer
  Dim hElm As IHTMLElement
  Set oIE = New InternetExplorer
  oIE.Navigate strURL
  Do While (oIE.Busy Or oIE.ReadyState <> READYSTATE_COMPLETE)
     DoEvents
  Loop
  Set hElm = oIE.Document.all.tags("html").Item(0)
  GetHTML = hElm.outerHTML
  Set oIE = Nothing
  Set hElm = Nothing
End Function

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多