XMLHTTP从父网页

时间:2017-02-05 06:22:13

标签: html vba web-scraping xmlhttprequest wunderground

我正试图从wunderground中提取历史天气数据 - 最初我试图使用标准HTML元素等从主网页上删除网页数据。但是后来我发现如果你添加"?格式= 1"对于URL,浏览器将显示或多或少的csv,这更容易解析为数据表......

然而,我仍然使用IE浏览器,如果你需要大量数据,这可能会非常慢,所以我开始考虑使用XMLHTTP对象来帮助更快地提取数据,这是我遇到的问题。问题 - 我提到添加"?format = 1"到URL的末尾会返回一个漂亮的纤薄csv,但是当我使用XMLHTTP时,它会拉出原始页面的HTML而不是CSV!

在我看来,当XMLHTTP发送请求时,响应是从父母那里回来的。网站,如果你愿意,而不是我指定的csv ...我注意到它从以.html结尾的URL中提取HTML,就像它切断了.html,以及为什么响应来自.html。 html页面,而不是CSV页面..所以我尝试查看URL协议,看看是否有办法强制XMLHTTP请求csv URL,但我远远超出我的元素,无法找到任何东西。 。

以下代码 - 感谢您给我的任何帮助:

Public Sub downloadWebDataToCSV(URL As String)

    Dim ADOStream As ADODB.Stream
    Dim XMLHTTP As MSXML2.XMLHTTP60

    Set XMLHTTP = New MSXML2.XMLHTTP60
    XMLHTTP.Open "GET", URL, False
    XMLHTTP.send

    If XMLHTTP.Status = 200 Then
        Set ADOStream = New ADODB.Stream
        With ADOStream
            .Open
            .Type = adTypeBinary
            .Write XMLHTTP.responseBody
            .SaveToFile "C:\datafile.csv", 2
            .Close
        End With
    End If

End Sub

以下是父网址和csv网址,如果有帮助的话 -

主页:https://www.wunderground.com/history/airport/KDAL/2003/10/15/DailyHistory.html CSV: https://www.wunderground.com/history/airport/KDAL/2003/10/15/DailyHistory.html?format=1

提前致谢, TheSilkCode

2 个答案:

答案 0 :(得分:1)

我认为您需要更改返回内容的编码,然后您可以在稍微清理一下格式后直接写入CSV。要更改格式,您需要设置一些请求标头。见下文。

Public Sub downloadWebDataToCSV()
    Dim URL As String: URL = "https://www.wunderground.com/history/airport/KDAL/2003/10/15/DailyHistory.html?format=1"
    Dim XMLHTTP As New MSXML2.XMLHTTP60

    With XMLHTTP
        .Open "GET", URL, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
        .setRequestHeader "content-type", "text/html; charset=UTF-8"
        .send
    End With

    If XMLHTTP.Status = 200 Then
        Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
        Dim Fileout As Object: Set Fileout = fso.CreateTextFile("C:\users\megatron\desktop\vba.txt")
        Dim myText As String: myText = Replace(XMLHTTP.responseText, "<br />", vbCrLf)
        Fileout.Write myText
        Fileout.Close
    End If

End Sub

答案 1 :(得分:0)

您可以通过示例网址通过Weather API获取数据:

http://api.wunderground.com/api/c991975b7f4186c0/history_20031015/q/airport/KDAL.json

如您所见,该网址由三个可变部分组成:API密钥c991975b7f4186c0,日期20031015和位置airport/KDAL。如果你创建XHR,响应将以JSON格式返回。

如何获取API密钥并解析您在this answer中可以看到的JSON响应。

详细了解Weather API