数据抓取不同资产类别数据

时间:2020-05-23 12:34:16

标签: excel vba web-scraping

我正在尝试编写一些可抓取不同资产类别数据的代码。用户输入要获取其信息的股票名称,然后代码获取该特定股票的相关定量数据。

我当时在考虑使用VBA,因为将数据输出到excel电子表格很容易。但是如果容易的话,也可以使用其他语言(我知道一些Python)。

我遇到的问题是似乎没有要查看的唯一标签,然后才能访问我想要的数据表。

例如我可以GetElementsByClassName("clear"),但其中许多存在。我以为也许我可以访问表类名称本身。我对此有两个问题:

1):我无法在VBA中使用它,因为它似乎不喜欢此类名称所具有的空格

2):即使我可以使用它,我也不知道超量库存的类名是否相同...

任何建议都非常感谢。这是我最复杂的VBA项目。

Tag example

2 个答案:

答案 0 :(得分:2)

我无法在VBA中使用它,因为它似乎不喜欢此类名称所具有的空格

该元素具有3个类; CSS类中没有空格。

您可以GetElementsByClassName("companyFinancialSumaryTbl"),这将为您提供一个包含<table>元素的节点集合,大概是第一个也是唯一一个项目。

从那里可以获得<tbody>子元素,然后可以迭代其<tr>子元素,并且在每一行中可以迭代<td>子节点;当<td>具有bold类时,您知道您正在查看行标题。

即使我可以使用它,我也不知道超量库存的类名是否相同...

我们也不知道!如果还有另一个表要读取数据,则该表可能没有companyFinancialSummaryTbl类,而可能有一些overstocksTbl类;无论哪种方式,它都是一个<table>元素,带有可以导航和迭代的子节点。

我对网络抓取并不十分熟悉,但是说您在对象<table>中有一个e元素,那么可以想象得到这样的<tbody>元素:

Dim thead As Object
Set thead = e(0)

Dim tbody As Object
Set tbody = e(1)

如果可行,那么也应该这样做:

Dim tr As Object
For Each tr In tbody
    Dim td As Object
    For Each td In tr
        Debug.Print td,; ' comma prints a tab, semicolon skips printing the line break
    Next
    Debug.Print 'print the line break
Next

答案 1 :(得分:1)

好吧,您没有共享URL,但是一般来讲,我将向您展示如何实现。您可以将其抽象为您的特定用例。

Sub Web_Table_Option_Two()
    Dim HTMLDoc As New HTMLDocument
    Dim objTable As Object
    Dim lRow As Long
    Dim lngTable As Long
    Dim lngRow As Long
    Dim lngCol As Long
    Dim ActRw As Long
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    Dim c As Range
    Dim sht As Worksheet
    Dim LastRow As Long
    Dim wb As Workbook: Set wb = ThisWorkbook

    Set sht = wb.Sheets("Stocks")

    'find last used row in ColumnA
    LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

    For Each c In Range("A2:A" & LastRow)

    mystock = c.Value

        objIE.Navigate "https://www.asx.com.au/asx/share-price-research/company/" & mystock & "/details"

        Do Until objIE.ReadyState = 4 And Not objIE.Busy
            DoEvents
        Loop

        Sheets.Add After:=ActiveSheet
        ActiveSheet.Name = mystock

        ActRw = 1
        Application.Wait (Now + TimeValue("0:00:01")) 'wait for java script to load
        HTMLDoc.body.innerHTML = objIE.Document.body.innerHTML
        With HTMLDoc.body
            Set objTable = .getElementsByTagName("table")
            For lngTable = 0 To objTable.Length - 1
                For lngRow = 0 To objTable(lngTable).Rows.Length - 1
                    For lngCol = 0 To objTable(lngTable).Rows(lngRow).Cells.Length - 1
                        ThisWorkbook.ActiveSheet.Cells(ActRw + lngRow + 1, lngCol + 1) = objTable(lngTable).Rows(lngRow).Cells(lngCol).innerText
                    Next lngCol
                Next lngRow
                ActRw = ActRw + objTable(lngTable).Rows.Length + 1
            Next lngTable
        End With

    Next c

    objIE.Quit

End Sub

之前:

enter image description here

之后:

enter image description here