从xmlhttp

时间:2019-01-28 18:56:28

标签: html vba http web-scraping scrape

我正在尝试从xmlhttp中抓取元素。 我对vba不太满意,但是对于数据抓取来说还是比较新的。 我以前一直在使用ie。

我可以将html导入单元格中,但是要具体导入名称,编号,价格和库存水平。

我用来导入数据的代码是

    Private Sub HTML_VBA_Excel()

    Dim oXMLHTTP    As Object
    Dim sPageHTML   As String
    Dim sURL        As String

        'Change the URL before executing the code
        sURL = "https://www.superdrug.com/Make-Up/Lips/Lip-Kits/Flower-Beauty-Mix-N%27-Matte-Lipstick-Duo-Tickled-Pink-687/p/769466"

        'Extract data from website to Excel using VBA
        Set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
        oXMLHTTP.Open "GET", sURL, False
        oXMLHTTP.send
        sPageHTML = oXMLHTTP.responseText

        'Get webpage data into Excel
        sh02.Cells(1, 1) = sPageHTML

End Sub

在此先感谢您提供的帮助。

伊恩

1 个答案:

答案 0 :(得分:1)

由于内容是用javascript加载的,因此无法运行,因此您无法从针对显示的url发出的xmlhttp请求中可靠地提取信息。

不确定令牌的可持续性(似乎与所使用的值无关紧要),但是您可以使用页面中存在的ajax令牌加入productid(即url的末尾),并使用以下命令发出和xmlhttp请求querystring参数并解析感兴趣项目的json响应。我使用jsonconverter.bas。下载并安装.bas之后,您需要进入VBE > Tools > References并添加对Microsoft Scripting Runtime的引用。

一些测试似乎表明可以在连字符后添加任何数字来代替令牌,以便您可以即时生成一个数字以供使用。

值得注意的是,您可以用逗号分隔查询字符串中的多个产品,从而进行批量请求。然后,您需要对返回的词典集合进行For Each循环。

Option Explicit

Public Sub GetInfo()
    Const URL As String = "https://www.superdrug.com/micrositeProduct/bulk/769466-1548702898380"
    Dim json As Object, title As String, price As String, stocking As String, id As String
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        Set json = jsonconverter.ParseJson(.responsetext)(1)
    End With

    title = json("name")
    price = json("price")("formattedValue") 'json("price")("value")
    stocking = json("stockLevel")
    id = json("code")
End Sub

如果使用浏览器,则json字符串将以.innerHTML的形式出现在脚本标记中,并且您可以轻松地从其中提取。