从HTML中的嵌套div中提取数据



我尝试用VBA导出一个网站的项目价格。我是全新的VBA,到目前为止,我主要是从互联网上复制和编辑代码。这是我试图提取的价格页面:https://skinport.com/de/item/operation-bravo-case/价格在一个名为ItemPage-Value的嵌套div中。

这是到目前为止我设法得到的代码:

Sub Update_Price()
Dim MyValue()
Dim Webpage As String
Webpage = Worksheets(2).Cells(2, 5).Value 'Webpage is loaded from Cell of Excel sheet
Dim content As Object    
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")

.Open "GET", Webpage, False
.send
html.body.innerHTML = .responseText
End With
Set content = html.querySelectorAll(".ItemPage-value .Tooltip-link")
MyValue(1) = content.Item(1).innerText
Worksheets(2).Cells(2, 12).Value = MyValue 'Write Price in Cell
End Sub

不知何故,querySelectorAll函数没有按预期工作。到目前为止,我找不到任何好的例子来说明如何使用它。有人有什么建议吗?

提前感谢!

这不是一个解决方案,这是一个解释在哪里可以找到价格和为什么它很难阅读。

正如你已经注意到的,直接从web服务器下载的html文件不包含你想要阅读的信息。事实上,下载的文件只有1.22 kB大小,看起来与网站的其他页面完全相同。(我试过了;-))它只是显示页面的基本结构。使用以下VBA代码,检索页面的html代码将保存在驱动器上。我选择的驱动器是E:,对于你的电脑,你可能需要调整它:


https://skinport.com/de/item/operation-bravo-case/
Sub SkinportSpecificItem()
Dim url As String
Dim doc As Object

Set doc = CreateObject("htmlFile")

With CreateObject("MSXML2.XMLHTTP.6.0")
url = "https://skinport.com/de/item/operation-bravo-case/"
.Open "GET", url, False
.Send

If .Status = 200 Then
Close
Open "E:GetPrice.html" For Output As #1
Print #1, .responseText
Close
Else
MsgBox "Page not loaded. HTTP status " & .Status
End If
End With
End Sub

输入操作bravo作为搜索词时页面搜索结果的html代码:
https://skinport.com/de/market?search=operation+bravo

Sub SkinportSearch()
Dim url As String
Dim doc As Object

Set doc = CreateObject("htmlFile")

With CreateObject("MSXML2.XMLHTTP.6.0")
url = "https://skinport.com/de/market?search=operation+bravo"
.Open "GET", url, False
.Send

If .Status = 200 Then
Close
Open "E:GetPrice.html" For Output As #1
Print #1, .responseText
Close
Else
MsgBox "Page not loaded. HTTP status " & .Status
End If
End With
End Sub

是相同的基本结构。里面什么也没有,是一页空白。内容首先由JavaScript在本地生成,在您自己计算机上的浏览器中生成。这是魔法吗?不,当然不是。当在浏览器中调用一个网站时,不仅下载了一个文件,然后在浏览器中显示出来,而且还有几个文件,有时甚至很多。

例如,显示的每个图像是一个单独的文件。几乎每个页面都使用脚本,即在浏览器中本地执行的一段软件。该软件是用JavaScript (JS)编写的。此外,网站的外观,即设计,是由层叠样式表(CSS)决定的。CSS也经常在单独的文件中提供。除了这些网页的核心组件,字体,其他html文件和其他一些东西也从web服务器检索。

你提到的网页编程很整齐。它区分了数据、表示和算法。它是一种设计模式。这被称为MVC(模型,视图,控制器)。https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller(英语)https://de.wikipedia.org/wiki/Model_View_Controller(德国)

回到主题上来。您正在寻找的是JSON (Java Script对象表示法)。
https://en.wikipedia.org/wiki/JSON(英文)
https://de.wikipedia.org/wiki/JavaScript_Object_Notation(德文)

当然,从web服务器下载的每个文件都有自己的url。JSON的url是
https://skinport.com/api/item?appid=730&url=operation-bravo-case。

这里有两个问题。首先,如果您尝试调用url,会出现"访问被拒绝";错误。因此,该文件不容易检索。第二个问题是,有一个"appid";为了在第一时间正确地映射url,需要检索文件。

我没有追究这个问题是因为730,因为它很难到达。我假定"拒绝访问"可以通过拦截set cookie并将其重新发送给查询来避免错误。仅凭xhr不能再完成,但(据我所知)只能通过WinHTTP。最后都是一样的。但是正如我所说的,我认为问题主要在于必需的ItemID。

我一开始以为这个ID指的是游戏。对于手套,我在搜索中找到的,也是如此。但是对于任何武器来说,ID突然变成了430,这是一个完全不同的数字,我没有时间去想是否有办法得到这个数字。就像我说的,没有它,你就不能得到你需要的JSON,我甚至还没有尝试过是否可以用cookie下载它。

我希望这至少解释了问题所在,或者网页抓取有时是一项艰巨的任务。可能是"另一个网站"。是更好的来源。

最新更新