通过XMLHTTP进行网页爬取

时间:2020-07-20 01:08:20

标签: css vba dom web-scraping xmlhttprequest

我想从职位搜索网站上搜索所有职位名称和公司名称。但是我无法这样做,因为我认为我无法检查HTML代码中的正确元素。我已经研究了好几天,请为正确的HTML元素提供帮助和建议。一旦我能够检查正确的元素,就可以进行循环并完成该程序。感激。

网站:https://www.efinancialcareers.my/search/?countryCode=MY&radius=40&radiusUnit=km&page=1&pageSize=20&currencyCode=MYR&language=en0

Option Explicit

Sub xmlhttp_scarpping()

Dim XMLrequest As New MSXML2.XMLHTTP60

XMLrequest.Open "GET", "https://www.efinancialcareers.my/search/?countryCode=MY&radius=40&radiusUnit=km&page=1&pageSize=20&currencyCode=MYR&language=en0", False
XMLrequest.send

Dim iDOC As New MSHTML.HTMLDocument
iDOC.body.innerHTML = XMLrequest.responseText

'Cells(2, 2).Value = iDOC.getElementsByClassName("d-flex justify-content-between")(0).getElementsByTagName("h5")(0).getElementsByTagName("a")(0).innerText
'Cells(2, 2).Value = iDOC.getElementById("8091724").innerText
'Cells(2, 2).Value = iDOC.getElementsByClassName("search-card")(0).getElementsByClassName("d-flex justify-content-between")(0).getElementsByTagName("h5")(0).getElementsByTagName("a")(0).innerText


Range("H1").Value = "Time Updated on"
Range("I1").Value = Now

Columns.AutoFit
MsgBox "Done"

End Sub

下面的HTML代码示例:

enter image description here

1 个答案:

答案 0 :(得分:0)

您尝试获取的页面使用JavaScript创建内容。但是,在您的代码中,iDOC的innerHTML只是静态内容。

要使页面属性运行JavaScript,可以使用InternetExplorer.Application自动执行IE。尝试使用诸如“使用VBA自动化Internet Explorer”之类的谷歌搜索关键字。

编辑

我阅读了您的评论。页面太快进入READY状态。因此,您应该等待内容以某种方式生成(例如,睡眠或检查是否出现了某些元素)。

Public Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

Sub sc2()
    Dim objIE As New InternetExplorer
    objIE.Visible = True
    objIE.navigate "https://www.efinancialcareers.my/search/?countryCode=MY&radius=40&radiusUnit=km&page=1&pageSize=20&currencyCode=MYR&language=en0"
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Dim htmlDoc As HTMLDocument
    
    ' Wait long enough
    Sleep 10000

    ' ... Or wait until some element appears (some element disappears)
'    Do
'        Set htmlDoc = objIE.document
'
'        If htmlDoc.getElementsXXX Then
'            Exit Do
'        End If
'
'        DoEvents
'        Sleep 1000
'    Loop
    
    Set htmlDoc = objIE.document
    
    ' Then you can access elements
    ' ... but this code also has a problem. ``.getElementsByTagName("h5")`` returns nothing. Please inspect the html.
    Debug.Print htmlDoc.getElementsByClassName("d-flex justify-content-between")(0).getElementsByTagName("h5")(0).getElementsByTagName("a")(0).innerText
    
End Sub

此外,访问元素的代码也有问题。由于它不跟随生成的html,因此.getElementsByTagName("h5")不返回任何内容。请在Chrome的控制台或VBE的“监视”窗口中检查html。

== $0与您的问题无关。它只是意味着开发人员工具中的活动DOM元素。 (What does == $0 mean in the DOM view in developer tools?

顺便说一句,越来越多的网站正在放弃对IE的支持。使用InternetExplorer对象很方便,但是使用Selenium自动化Chrome或Firefox是更好的方法。