MSXML2.XMLHTTP页面请求:如何确保获得所有最终的HTML代码?

时间:2014-07-24 05:26:51

标签: vba xmlhttprequest web-scraping

我已经使用这个简单的子程序从网上加载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

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

2 个答案:

答案 0 :(得分:2)

我找到了一种解决方法,可以满足我的需求。我以编程方式控制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

答案 1 :(得分:1)

按照亚历克斯的建议,如果没有强力固定延迟,请按照以下步骤操作:

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