【问题标题】:Why doesn't the code receive data from the web page?为什么代码没有从网页接收数据?
【发布时间】:2018-10-20 16:57:02
【问题描述】:
Sub Yarislar()
    Dim Asays(), ws As Worksheet, Asay As Long, html As HTMLDocument
    Dim http As clsHTTP, url As String, headers(), numberOfRequests As Long
    headers = Array("Asay", "Tarih", "Sehir", "Cins", "Grup", "Msf/Pist", "Derece", "Sira", "Jokey", "Kilo", "GC", "Hnd", "Gny", "Taki")
    Set http = New clsHTTP
    Set ws = ThisWorkbook.Worksheets("X")
    Set html = New HTMLDocument
    Asays = Application.Transpose(Sheets("Y").Range("A2:A" & Sheets("Y").Columns("A:A").Find(What:="boş").Row - 1).Value)
    Const numTableRows As Long = 11
    Const numTableColumns As Long = 15
    Const BASE_URL As String = "https://yenibeygir.com/at/"
    numberOfRequests = UBound(Asays)
    Dim results(), headerRow As Boolean, tRows As Object, tRow As Object, iRow As Long
    Dim tCells As Object, tCell As Object, r As Long, c As Long, hTable As HTMLTable
    ReDim results(1 To numTableRows * numberOfRequests, 1 To numTableColumns)
    Application.ScreenUpdating = False
    For Asay = 1 To numberOfRequests
        headerRow = True
        url = BASE_URL & Asays(Asay)
        html.body.innerHTML = http.GetString(url)
        Set hTable = html.querySelector(".at_Yarislar")
        Set tRows = hTable.getElementsByTagName("tr")
        For Each tRow In tRows
            If Not headerRow Then
                c = 2: r = r + 1
                results(r, 1) = Asays(Asay)
                Set tCells = tRow.getElementsByTagName("td")
                For Each tCell In tCells
                    results(r, c) = tCell.innerText
                    c = c + 1
                Next
            End If
            headerRow = False
        Next
    Next
    With ws
        .Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
        .Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
    End With
    Application.ScreenUpdating = True
end sub

为什么我修改@Qharr 的代码无法从同一网页检索其他数据? @QHarr 为“Galoplar”数据编写的代码完美运行,但是当我修改相同的代码时,它不适用于“Yarislar”。我是不是选桌有误?

Link

【问题讨论】:

  • Doesn't work 是最喜欢的错误描述;(网站上与工作示例有什么区别?BaseURL 很短,与 Galoptar 相同。如果我在浏览器中使用连接的 url ( yenibeygir.com/at/Asay) 我被重定向到 yenibeygir.com/at。似乎 url 中缺少某些内容。
  • 测定下一个周期的计数。例如,12543、14362、11563 等。它将使用代码 Sheets("Y").Range("A2:A" & Sheets("Y").Columns("A:A").Find(What:="boş").Row 读取这些值- 1. 在“Y”表中。
  • 对不起,我读了 Array 进行分析。提供示例网址并使用Debug.Print url 检查您创建的网址,将其放在url = BASE_URL & Asays(Asay) 之后
  • ^^ 根据@ComputerVersteher 提供的 cmets。一些示例 ID/完整 URL 在哪里?原始 URL 库的部分内容丢失了,类定义也丢失了。当您在浏览器中手动键入这些完整 URL 之一时,它会检索数据吗?如果找不到“boş”会怎样?
  • “results(r, 1) = Asays(Asay)”行中的错误。错误 9

标签: html excel vba web-scraping


【解决方案1】:

您缺少类定义。我认为,您还需要不同的 URL 结构。您没有提供,但基于您之前的问题,并且有点想象力,您需要添加以下 URL 结构:

BASE_URL & asay & /name

例如

https://yenibeygir.com/at/10221/dorukhatun

因此,源表中的 A 列的名称必须与检测 ID 一致,即必须包含诸如 10221/dorukhatun 之类的字符串。

您还必须调整控制表格中行号和列号的常量。

您需要适当调整源列 A 的范围。

我使用了我记得的两个 id,并在 A1:A2 中有以下内容(请注意,一些结果现在出现在工作表中,因为有测试运行)

表 1:

VBA:

类 clsHTTP:

Option Explicit
Private http As Object

Private Sub Class_Initialize()
    Set http = CreateObject("MSXML2.XMLHTTP")
End Sub

Public Function GetString(ByVal url As String) As String
    Dim sResponse As String
    With http
        .Open "GET", url, False
        .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
        GetString = sResponse
    End With
End Function

标准模块 1:

Option Explicit
Public Sub DYarislar()
    Dim asays(), ws As Worksheet, asay As Long, html As HTMLDocument
    Dim http As clsHTTP, url As String, headers(), numberOfRequests As Long

    headers = Array("Asay", "Tarih", "Sehir", "K.Cinsi", "Gr", "Msf/Pist", "Derece", "S", "Jokey", "Kilo", "G.Ç", "Hnd", "Gny", "Taki")
    Set http = New clsHTTP
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set html = New HTMLDocument
    asays = Application.Transpose(ws.Range("A1:A2").Value) 'Load asay values from sheet 1

    Const numTableRows As Long = 44
    Const numTableColumns As Long = 14
    Const BASE_URL As String = "https://yenibeygir.com/at/"

    numberOfRequests = UBound(asays)

    Dim results(), headerRow As Boolean, tRows As Object, tRow As Object, iRow As Long
    Dim tCells As Object, tCell As Object, r As Long, c As Long, hTable As HTMLTable
    ReDim results(1 To numTableRows * numberOfRequests, 1 To numTableColumns)

    Application.ScreenUpdating = False

    For asay = 1 To numberOfRequests
        headerRow = True
        url = BASE_URL & asays(asay)
        html.body.innerHTML = http.GetString(url)

        Set hTable = html.querySelector(".at_Yarislar")

        Set tRows = hTable.getElementsByTagName("tr")

        For Each tRow In tRows
            If Not headerRow Then
                c = 2: r = r + 1
                results(r, 1) = asays(asay)
                Set tCells = tRow.getElementsByTagName("td")
                For Each tCell In tCells
                    results(r, c) = tCell.innerText
                    c = c + 1
                Next
            End If
            headerRow = False
        Next
    Next

    With ws
        .Cells(1, 3).Resize(1, UBound(headers) + 1) = headers
        .Cells(2, 3).Resize(UBound(results, 1), UBound(results, 2)) = results
    End With
    Application.ScreenUpdating = True
End Sub

【讨论】:

  • 又是一次非常成功的研究。你知道这个。我希望我可以通过这些代码解码来自网络的数据。非常感谢。我很感激。
  • 我过大以考虑不同数量的结果行,例如yenibeygir.com/at/10221/dorukhatun 29 行 yenibeygir.com/at/69963/hesperos 6 行。选择一个大于任何给定页面上可能的最大结果数的数字。
  • 将 Const numTableRows As Long = 44 更改为较大的数字,例如150.跨度>
  • 感谢您的关注和努力。晚上好。
猜你喜欢
  • 2021-12-04
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多