首页 > 解决方案 > 如何根据 HTML 代码确定单页应用的 URL

问题描述

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

或者,我可以在底部找到与“下一步”按钮相对应的元素,并在删除数据的脚本中激活它,这可能会容易得多,但我对第一种方式很好奇。

谢谢!

标签: vbaweb-scrapingxmlhttprequest

解决方案


这是一些非常难看的代码,需要改进,它使用 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

这使用相邻兄弟选择器 "+"来选择div具有 class 的元素的下一个rz-table-dd-sm"."是类选择器。


推荐阅读