【问题标题】:Web Scraping by XMLHTTP通过 XMLHTTP 进行网页抓取
【发布时间】:2020-11-09 05:29:00
【问题描述】:

我想从求职网站上抓取所有职位和公司名称。但是我无法这样做,因为我相信我无法检查 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_scraping()

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 代码示例:

【问题讨论】:

  • 问题可能出在显示 '== $0' 的 html 末尾,不确定它的含义以及如何使用它检查元素。

标签: css vba dom web-scraping xmlhttprequest


【解决方案1】:

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

对于属性运行 JavaScript 的页面,您可以使用 InternetExplorer.Application 自动化 IE。尝试使用 Google 搜索关键字,例如“使用 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 的 Watch 窗口中检查 html。

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

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

【讨论】:

  • 嗨,Kamocyc,我尝试了 IE 自动化和 XMLHTTPrequest 两种方法,它们都具有相同的调试消息并在 HTML 代码处停止,== $0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2013-08-27
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多