【问题标题】:Web-Crawler for VBAVBA 的网络爬虫
【发布时间】:2015-06-16 12:23:49
【问题描述】:

我正在尝试使用 Visual Basic 编写 Webcrawler。我有一个包含链接的列表,存储在 Excel 中(第 1 列)。然后宏应打开每个链接并将网站中的某些信息添加到 excel 文件中。 Here's the first link (stored in field A2).

宏应识别并将酒店名称插入第 2 列 (B2)、第 3 列 (C2) 中的评级和第 4 列 (D2) 中的地址。然后可以通过循环对所有其他链接重复此过程(所有网站具有相同的结构)。

到目前为止我的代码(我还没有添加循环):

Sub Hoteldetails()

Dim IEexp As Object

Set IEexp = CreateObject("InternetExplorer.Application")
IEexp.Visible = True

Range("A2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True

End Sub

如何“选择”我想要的特定数据并将其插入到 excel 文件中?我尝试通过“添加数据”记录宏,但无法从网站导入数据。我也尝试使用各种示例代码来做到这一点,但它不适用于我的特定网站。

非常感谢您的帮助!

【问题讨论】:

  • 您需要在ie页面上找到您想要的信息并将其拉入excel。

标签: vba excel web-scraping web-crawler


【解决方案1】:

tl;dr;

我不会为您完成所有工作,但如果页面具有相同的结构,这将相当容易。

您可以发出无浏览器的 XMLHTTP 请求,以获得良好的快速响应,然后使用 id 或类名和集合索引选择感兴趣的项目。

这是一个示例,使用您提供的链接,您可以将其调整为所有链接的循环。


网页浏览量:


代码输出:


VBA:

Option Explicit
Public Sub GetInfo()
    Dim sResponse As String, HTML As New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.tripadvisor.co.uk/Hotel_Review-g198832-d236315-Reviews-Grand_Hotel_Kronenhof-Pontresina_Engadin_St_Moritz_Canton_of_Graubunden_Swiss_Alps.html", False
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With

    sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))

    With HTML
       .body.innerHTML = sResponse
       Debug.Print "HotelName: " & .getElementById("HEADING").innerText
       Debug.Print "Address: " & .getElementsByClassName("detail")(0).innerText
       Debug.Print "Rating: " & .getElementsByClassName("overallRating")(0).innerText
    End With
End Sub

参考资料:

VBE > 工具 > 参考 > HTML 对象库

【讨论】:

    【解决方案2】:

    您有多种选择:

    选项 1:IEObject

    您需要使用 IEObject 中的getElementBy 方法并使用字符串操作来提取您需要的数据。字符串提取的 2 个选项:

    1. 通过NameId提取顶级元素,然后使用MidInStrLeftRight等字符串操作函数
    2. 使用 Regex(VBA Vbscript 对象)提取数据(推荐)

    选项 2:抓取 HTML 插件

    前段时间,我开发了一个用于 Excel 的插件,可让您轻松地在 Excel 公式中抓取 HTML 数据。该过程与上述类似,因为您仍然需要创建相关的正则表达式。请参阅以下 TripAdvisor 示例:

    B2中的公式是这样的(A2是链接,第二个参数是Regex):

    =GetElementByRegex(A2;"<h1 id=""HEADING"".*?>(?:(?:.|\n)*?)</div>((?:.|\n)*?)</h1>")
    

    您可以在此处下载插件: http://www.analystcave.com/excel-tools/excel-scrape-html-add/

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2012-08-01
      • 2015-05-12
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多