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

pwuypxnk  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(121)

我尝试导出一个网站与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函数不能按预期工作。到目前为止,我无法对抗任何好的示例如何使用它。有人有建议吗?
先谢谢你了!

bis0qfac

bis0qfac1#

这不是一个解决方案,这是一个解释在哪里找到价格和为什么它很难阅读。
正如你已经注意到的,直接从web服务器下载的html文件并不包含你想阅读的信息,事实上,下载的文件大小只有1.22kB,看起来和网站其他页面完全一样(我试过了;- ))它只是显示页面的基本结构。使用以下VBA代码,检索到的页面的html代码保存在驱动器上。我选择了驱动器E:,对于您的计算机,您可能需要调整它:
您指定的url的html代码:
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 Object Notation)。
https://en.wikipedia.org/wiki/JSON(英语)
https://de.wikipedia.org/wiki/JavaScript_Object_Notation(德文)
当然,从web服务器下载的每个文件都有自己的url。
https://skinport.com/api/item?appid=730&url=operation-bravo-case
这样做有两个问题。首先,如果您尝试调用url,则会出现“Acsess Denied”错误。因此无法轻松检索文件。第二个问题是,需要“appID”730来检索文件,以便首先正确Mapurl。
我没有追究这个问题,因为730,因为它很难得到。我假设“Acsess Denied”错误可以通过拦截设置的cookie并重新发送它来规避查询。这已经不能用xhr来完成了,但(据我所知)只能通过WinHTTP。最后是一样的。但正如我所说,我看到的问题主要是在所需的ItemID中。
我一开始以为ID指的是游戏。对于手套,我从搜索中得到的,这也是真的。但是对于任何武器,ID突然变成了430,这是一个完全不同的数字,我没有时间去想是否有办法得到这个数字。正如我所说,没有它,你不能得到你需要的JSON,我甚至还没有试过它是否可以用cookie下载。
我希望这至少解释了问题所在,或者说网页抓取有时是一门很坚韧的学科。也许“另一个网站”是更好的来源。

相关问题