如何基于HTML代码确定单页应用程序的URL

时间:2018-09-11 16:53:59

标签: vba web-scraping xmlhttprequest

我需要从使用单页应用程序代码(https://www.rigzone.com/oil/jobs/search/)的网页中抓取信息,只需在“搜索”字段中加载内容,然后单击按钮,然后使用底部的箭头从页面跳转到页面,您会注意到在此过程中,顶部栏中显示的URL保持不变。我假设(如果我错了,请纠正我)有一种方法可以显示与张贴有不同位置的每个页面相对应的URL。理想情况下,我想确定要在脚本中打开它们的那些,提取HTML代码,并借助VBA xmlhttp提取我想要的信息。我该怎么办?

或者,我只可以在底部找到与“下一步”按钮相对应的元素,然后在脚本中激活该元素以抓取数据,这可能会容易得多,但我对第一种方法感到好奇。 / p>

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是一些非常丑陋的代码,需要改进,这些代码使用IE,并根据每页20个结果,持续单击“下一步”按钮以获取预期的页面数。

如果有一种方法可以构造为POST XMLHTTPRequest,那么我会顺其自然。如果有API,那就更好了。

Option Explicit
Public Sub LoopPages()
    Dim IE As New InternetExplorer, t As Date, num As String, i As Long
    Const MAX_WAIT_SEC As Long = 5
    Const RESULTS_PER_PAGE = 20

    With IE
        .Visible = True
        .navigate "https://www.rigzone.com/oil/jobs/search/"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            .getElementById("txtSearch").Value = "Health"
            .getElementById("txtLocation").Value = "Paris, France"
            .getElementById("btnBasicSearch").Click
        End With

        While .Busy Or .readyState < 4: DoEvents: Wend

        Application.Wait Now + TimeSerial(0, 0, 4)
        t = Timer

        Do
            On Error Resume Next
            num = Split(Split(.document.querySelector(".rz-table-dd-sm + div").innerText, "of ")(1), Chr$(32))(0)
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While num = vbNullString

        'do stuff with initial page

        On Error GoTo errhand
        num = Round(CLng(num) / RESULTS_PER_PAGE, 0)
        num = IIf(num < 1, 1, num)

        For i = 1 To num          
            .document.querySelector(".next").Click        
            While .Busy Or .readyState < 4: DoEvents: Wend            
            'other code with new page               
        Next   
        Stop                                     '<== Delete me later   
errhand:
        .Quit
    End With
End Sub

CSS选择器组合为

.rz-table-dd-sm + div

这将使用adjacent sibling selector "+"选择类别为div的元素旁边的rz-table-dd-sm"."是类选择器。