VBA HTML Listing Info Pull

后端 未结 3 718
终归单人心
终归单人心 2021-01-26 14:29

I am looking to follow a series of URL\'s that are found in column A (example: https://www.ebay.com/itm/Apple-iPhone-7-GSM-Unlocked-Verizon-AT-T-TMobile-Sprint-32GB-128GB-256GB/

3条回答
  •  自闭症患者
    2021-01-26 15:01

    I would use late binding for MSXML2.XMLHTTP and set a reference to the Microsoft HTML Object Library for the HTMLDocument.

    Note: querySelector() references the first item it finds that matches its search string.

    Here is the short version:

    Public Sub ListingInfo()
        Dim cell As Range
        With ThisWorkbook.Worksheets("Sheet1")
            For Each cell In .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
                Dim Document As MSHTML.HTMLDocument
                With CreateObject("MSXML2.XMLHTTP")
                    .Open "GET", cell.Value, False
                    .send
                    Set Document = New MSHTML.HTMLDocument
                    Document.body.innerHTML = .responseText
                End With
                cell.Offset(0, 1).Value = Document.getElementByID("itemTitle").innerText
                cell.Offset(0, 2).Value = Document.getElementByID("prcIsum").innerText
    
                If Not Document.querySelector(".viSNotesCnt") Is Nothing Then
                    cell.Offset(0, 3).Value = Document.querySelector(".viSNotesCnt").innerText
                Else
                    'Try Something Else
                End If
            Next
        End With
    End Sub
    

    A more elaborate solution would be to break the code up into smaller routines and load the data into an Array. The main advantage of this is that you can test each subroutine separately.

    Option Explicit
    Public Type tListingInfo
        Description As String
        Price As Currency
        Title As String
    End Type
    
    Public Sub ListingInfo()
        Dim source As Range
        Dim data As Variant
        With ThisWorkbook.Worksheets("Sheet1")
            Set source = .Range("A1:D1", .Cells(.Rows.count, 1).End(xlUp))
            data = source.Value
        End With
        Dim r As Long
        Dim record As tListingInfo
        Dim url As String
    
        For r = 1 To UBound(data)
            record = getListingInfo()
            url = data(r, 1)
            record = getListingInfo(url)
            With record
                data(r, 2) = .Description
                data(r, 3) = .Price
                data(r, 4) = .Title
            End With
        Next
        source.Value = data
    End Sub
    
    Public Function getListingInfo(url As String) As tListingInfo
        Dim ListingInfo As tListingInfo
        Dim Document As MSHTML.HTMLDocument
        Set Document = getHTMLDocument(url)
    
        With ListingInfo
            .Description = Document.getElementByID("itemTitle").innerText
            .Price = Split(Document.getElementByID("prcIsum").innerText)(1)
            .Title = Document.querySelectorAll(".viSNotesCnt")(0).innerText
            Debug.Print .Description, .Price, .Title
        End With
    End Function
    
    Public Function getHTMLDocument(url As String) As MSHTML.HTMLDocument
        Const READYSTATE_COMPLETE As Long = 4
    
        Dim Document As MSHTML.HTMLDocument
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", url, False
            .send
            If .readyState = READYSTATE_COMPLETE And .Status = 200 Then
                Set Document = New MSHTML.HTMLDocument
                Document.body.innerHTML = .responseText
                Set getHTMLDocument = Document
            Else
                MsgBox "URL:  " & vbCrLf & "Ready state: " & .readyState & vbCrLf & "HTTP request status: " & .Status, vbInformation, "URL Not Responding"
            End If
        End With
    End Function
    

提交回复
热议问题