【问题标题】:StockCharts web scraping using Excel and VBA使用 Excel 和 VBA 进行 StockCharts 网页抓取
【发布时间】:2020-11-30 05:30:54
【问题描述】:

我正在尝试使用 Excel 和 VBA 从 StockCharts 获取数据。我可以列出标题但不能列出数据。有人可以帮我解决这个问题吗?

这是代码:

Sub Scraping_StockCharts()

    Dim XMLPage As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim HTMLIm As MSHTML.IHTMLElement
    Dim HTMLIms As MSHTML.IHTMLElementCollection
    Dim URL As String
    
    Sheets("Results").Range("a1:z10000").ClearContents
    
    URL = "https://stockcharts.com/freecharts/sectorsummary.html?&G=SECTOR_DJUSHP&O=1"
    
    XMLPage.Open "Get", URL, False
    XMLPage.setRequestHeader "Content-Type", "text/xml"
    
    XMLPage.send
    
    HTMLDoc.body.innerHTML = XMLPage.responseText

    Set HTMLIms = HTMLDoc.getElementsByTagName("th")
    
    Row = 1
    Column = 1
           
        For Each HTMLIm In HTMLIms
         
                Sheets("Results").Cells(Row, Column).Value = HTMLIm.innerText
                Column = Column + 1
        
        Next HTMLIm

    Set HTMLIms = HTMLDoc.getElementsByTagName("td")
    
    Row = 2
    Column = 1
      
        For Each HTMLIm In HTMLIms
            
                Sheets("Results").Cells(Row, Column).Value = HTMLIm.innerText
                Column = Column + 1
        Next HTMLIm
        
End Sub

【问题讨论】:

    标签: excel vba web-scraping getelementsbytagname


    【解决方案1】:

    我会这样做的。

    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
        objIE.Navigate "https://stockcharts.com/freecharts/sectorsummary.html?&G=SECTOR_DJUSHP&O=1"
    
        Do Until objIE.ReadyState = 4 And Not objIE.Busy
            DoEvents
        Loop
        Application.Wait (Now + TimeValue("0:00:03")) '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.Sheets("Sheet1").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
        objIE.Quit
    End Sub
    

    【讨论】:

    • 非常感谢 ASH。我在“Dim objIE as InternetExplorer”出现错误。想知道我是否还没有启用某些库。我有:VisualBasic for Applications - Microsoft Excel 16.0 对象库 - OLE 自动化 - Microsoft Office 16.0 对象库 - Microsoft HTML 对象库。
    • 我添加了 Microsoft Internet Controls,它运行良好。只是最后一个问题。我有许多 url 的列表,可以在其中提取仅更改扇区名称的数据。例如:stockcharts.com/freecharts/… - stockcharts.com/freecharts/…。有没有办法创建一个程序来从列表中执行所有这些不同的 url(超过 50 个)?
    • 当然!只需遍历 URL 列表并将其传递给 'objIE.Navigate' 变量。这听起来与您最初询问的问题完全不同。请提出一个与您的特定最终游戏相关的新问题。
    • 如果对您有帮助,请点击“此答案很有用”。
    • 虽然,我想多了,也许你应该看看是否有一个 API 端点可以针对这种请求进行访问。如果您对某些服务进行过多调用,您最终可能会被该服务阻止。也可能有法律影响。此类事情的合法性远远超出了我的专业领域。
    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 2019-04-03
    • 2017-11-04
    • 2020-12-15
    • 2013-08-27
    • 2021-01-19
    • 2019-07-30
    • 1970-01-01
    相关资源
    最近更新 更多