【问题标题】:Scrape data from list of websites从网站列表中抓取数据
【发布时间】:2020-03-16 07:24:47
【问题描述】:

`我正在尝试抓取数据,例如

成立日期、电子邮件地址、地址和董事详细信息 来自https://www.zaubacorp.com/company-list/nic-300-company.html 中的 500 个网站列表,该列表扩展到许多页面。我需要提取网站,这是我在 Excel 中使用 Power Query 完成的,但是从每个网站中提取特定细节在 Power Query 中是一项繁琐的工作。

另外,问题在于电子邮件地址和地址,无法找到类/标签 ID 名称。(这是我最近得到的,但现在我需要大量网站的帮助,代码应该适用于所有人网站(因为它们在特定位置具有相同类型的数据。

Sub GetInfo()
    Const URL = "https://www.zaubacorp.com/company/TECHDRIVE-SOFTWARE-LIMITED/U30007DL1999PLC356280"
    Dim Html As New HTMLDocument
    Dim elem As Object, adr As Object

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .send
        Html.body.innerHTML = .responseText
    End With

    For Each elem In Html.getElementsByTagName("b")
        If InStr(elem.innerText, "Email ID:") > 0 Then
            [A2] = elem.ParentNode.innerText
            Exit For
        End If
    Next elem

    For Each adr In Html.getElementsByTagName("b")
        If InStr(adr.innerText, "Address:") > 0 Then
            [B2] = adr.ParentNode.NextSibling.innerText
            Exit For
        End If
    Next adr
End Sub

【问题讨论】:

  • Set pages = ie.document Set mtbl = pages.getElementsByTagName("Table")(1) Set table_data = mtbl.getElementsByTagName("tr") 我为维基百科提取数据所做的这个简单代码,但对于禁忌的特定网站,它不起作用,而且我有 500 多个网站分布在许多页面上。在提出任何建议之前,请先查看网站。
  • 请不要在 cmets 中发布代码! cmets 中的代码不可读,并且在大多数情况下无用,因为换行符不可见,但它们在 VBA 中很重要。而是将所有属于您的问题的内容放入原始问题部分。你可以edit它来放你的代码或附加信息。
  • @SIM 正如我之前向您解释的那样,先生,我无法投票给您的答案。问题已结束。我再次道歉。
  • @Pᴇʜ 完成先生,我已经附上了我最初的小代码
  • 好吧,你不能发布 3 行代码然后等待我们完成你的整个项目(这不是免费的代码编写服务)。你甚至没有告诉代码有什么问题。你的代码有什么问题?

标签: excel vba web-scraping


【解决方案1】:

我已修改您现有的脚本以遍历多个页面,现在可以从那里提取每个容器的nameDate of Incorporationemailaddress。确保在执行以下脚本之前创建一个名为 DataContainer 的工作表。

Sub GetInfo()
    Const prefix$ = "https://www.zaubacorp.com/company-list/nic-300/p-"
    Const suffix$ = "-company.html"
    Dim Html As New HTMLDocument, Htmldoc As New HTMLDocument
    Dim newHtml As New HTMLDocument, newUrl$, elem As Object, oDate As Object, R&, I&
    Dim Wb As Workbook, ws As Worksheet, adr As Object, P&, pageNum&

    Set Wb = ThisWorkbook
    Set ws = Wb.Worksheets("DataContainer") '----------->create a sheet and name it `DataContainer` in order for the script to write the results in there

    For pageNum = 1 To 2  '---------------------------------> this is where you put the highest number the script will traverse
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", prefix & pageNum & suffix, False
            .send
            Html.body.innerHTML = .responseText
        End With

        With Html.querySelectorAll("#table tbody tr")
            For I = 0 To .Length - 1
                Htmldoc.body.innerHTML = .item(I).outerHTML
                newUrl = Htmldoc.querySelector("a[href]").getAttribute("href")

                With CreateObject("MSXML2.XMLHTTP")
                    .Open "GET", newUrl, False
                    .send
                    newHtml.body.innerHTML = .responseText
                End With

                R = R + 1: ws.Cells(R, 1) = newHtml.querySelector(".container > h1").innerText

                For Each oDate In newHtml.getElementsByTagName("p")
                    If InStr(oDate.innerText, "Date of Incorporation") > 0 Then
                        ws.Cells(R, 2) = oDate.ParentNode.NextSibling.innerText
                        Exit For
                    End If
                Next oDate

                For Each elem In newHtml.getElementsByTagName("b")
                    If InStr(elem.innerText, "Email ID:") > 0 Then
                        ws.Cells(R, 3) = elem.ParentNode.innerText
                        Exit For
                    End If
                Next elem

                For Each adr In newHtml.getElementsByTagName("b")
                    If InStr(adr.innerText, "Address:") > 0 Then
                        ws.Cells(R, 4) = adr.ParentNode.NextSibling.innerText
                        Exit For
                    End If
                Next adr
            Next I
        End With
    Next pageNum
End Sub

【讨论】:

  • 太棒了,先生,我将调整此代码以获得“注册日期”。感谢您宝贵的时间和帮助。再次为过去的错误道歉。
  • 无法从检查工具中提取“成立日期”值。
  • 您好,先生,我现在无法从列表中提取“成立日期”和“活动”。你能帮帮我吗?
  • 好的,我已经修改了脚本以包含date of Incorporation @Amit Shah。谢谢。
  • 非常感谢,我已经调整了代码以获取更多信息。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2014-07-06
  • 2018-10-13
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多