找不到错误的脚本如何完美工作的任何逻辑吗?

时间:2018-07-01 14:46:08

标签: vba excel-vba web-scraping internet-explorer-11 excel

我已经使用IE在vba中编写了一个脚本,以从网页中获取不同酒店名称的标题。旅馆名称通过分页遍历多页。

我的抓取器可以在解析每个页面的标题的同时继续成功单击下一个按钮,直到不再单击该按钮来执行。解析器所做的只是完美的工作。我只想知道下面是我问过的简单逻辑。

我的问题:即使在Set Htmldoc = IE.document之后不使用此.click行,如何正确显示每个页面的内容?启动点击后,抓取工具会转到带有新内容的新页面。当我定义的do loop出现在with IE块之后时,它如何通过每个页面的新内容进行更新?

这是脚本:

Sub GetTitles()
    Const Url As String = "https://www.tripadvisor.com/Hotels-g147237-Caribbean-Hotels.html"
    Dim IE As New InternetExplorer, Htmldoc As HTMLDocument, post As Object, R&

    With IE
        .Visible = True
        .navigate Url
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set Htmldoc = .document
    End With

    Do
        For Each post In Htmldoc.getElementsByClassName("listing") ''how this "Htmldoc" gets updated
            With post.getElementsByClassName("property_title")
                If .Length Then R = R + 1: Cells(R, 1) = .Item(0).innerText
            End With
        Next post

        If Not Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']") Is Nothing Then
            Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
            Application.Wait Now + TimeValue("00:00:05")

            ''I didn't use anything like "Set Htmldoc = IE.document" but it still works flawlessly 
        Else:
            Exit Do
        End If
    Loop
    IE.Quit
End Sub

2 个答案:

答案 0 :(得分:3)

脚本没有错误。但是,如果您在没有完全理解的情况下使用它,肯定会很麻烦。


执行此操作Set Htmldoc = .document时,您正在设置IE的文档以供以后使用。

执行此操作时,Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click会使用javascript,并更新页面的内容(即文档)。

您可能认为文档已更改,但仅是更新的。实际上,根本没有导航发生。


添加以下内容,看看页面/文档保持不变,只是内容发生了变化。

            '/ Url before Next button click
            Debug.Print "Before Click " & Htmldoc.Url
            Htmldoc.querySelector(".standard_pagination span[onclick*='pagination_next']").Click
            '/ Url after Next button click
            Debug.Print "After Click " & Htmldoc.Url

自文档以来,一旦设置就保持不变,并且更新后的内容具有相同的布局/ DOM (这是大多数程序员编写代码的方式,很可能所有页面都使用模板来呈现),因此您代码工作得很好。您的do循环的网对网,什么都没有改变。

答案 1 :(得分:0)

Set Htmldoc = .document

获取指向DOM的指针。当Htmldoc更改时,它指向新内容。无需执行新的Set Htmldoc