我需要从使用单页应用程序代码(https://www.rigzone.com/oil/jobs/search/)的网页中抓取信息,只需在“搜索”字段中加载内容,然后单击按钮,然后使用底部的箭头从页面跳转到页面,您会注意到在此过程中,顶部栏中显示的URL保持不变。我假设(如果我错了,请纠正我)有一种方法可以显示与张贴有不同位置的每个页面相对应的URL。理想情况下,我想确定要在脚本中打开它们的那些,提取HTML代码,并借助VBA xmlhttp提取我想要的信息。我该怎么办?
或者,我只可以在底部找到与“下一步”按钮相对应的元素,然后在脚本中激活该元素以抓取数据,这可能会容易得多,但我对第一种方法感到好奇。 / p>
谢谢!
答案 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
。 "."
是类选择器。