首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Internet explorer进行VBA屏幕抓取

通过Internet explorer进行VBA屏幕抓取
EN

Stack Overflow用户
提问于 2021-10-25 10:19:55
回答 1查看 94关注 0票数 1

有没有人可以帮我指出正确的方向,让我的代码再次工作?“老方法”已经通过VBA工作了很多年,它通过Internet Explorer定期查询下面的网站来收集天气信息。但是,现在只要调用IE,它就会在Edge中打开,代码就会失败。

我一直在尝试通过XML v6让同样的代码工作,并且在“新方法”上几乎取得了成功。我可以得到一个单一的页面加载,但我需要纳入的逻辑,其中一个区号是输入到搜索框中,然后按下一个按钮在网站上。输入框为HTMLDoc.getElementById(“关键字”),按钮为HTMLDoc.getElementsByTagName(“按钮”)。只有在进入该区域并按下按钮后,才会返回该区域的天气。

可以将此查询设为新方式吗?

我还了解到,使用Selenium和VBA中的web驱动程序查询,这可能是可能的。然而,我听说每次Microsoft Edge获得更新时,你都需要为web驱动程序下载一个新的驱动程序,考虑到查询的基本程度,这似乎有点过头了。

提前感谢!

詹姆斯

老方法

//引用: Microsoft Internet控件、Microsoft HTML对象库

代码语言:javascript
复制
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLInput As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection

IE.Visible = True
IE.Navigate ("www.bom.gov.au/aviation/forecasts/taf/")
//issue is that ie does not seem to exist, think it is because this actually redirects to edge now so code crashes from this point

Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
Debug.Print IE.LocationName; IE.LocationURL

Set HTMLDoc = IE.Document
Set HTMLInput = HTMLDoc.getElementById("keyword")
HTMLInput.Value = "20"
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
HTMLButtons(0).Click

新方法

//参考资料: Microsoft XML,v6.0

代码语言:javascript
复制
Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
    
XMLPage.Open "GET", "http://bom.gov.au/aviation/forecasts/taf/", False
XMLPage.send
    
HTMLDoc.body.innerHTML = XMLPage.responseText
Call ProcessHTMLPage(HTMLDoc)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-25 13:06:18

使用XMLHTTP,您必须忘记与网页的交互,就像在浏览器中一样,因为内容是静态的,而现代网站现在大多是动态生成其内容。

从DevTools查看网站,似乎搜索触发了一个POST请求到http://www.bom.gov.au/aviation/php/process.php,关键字作为返回结果的数据,所以这是你必须复制的。

下面是使用YBWP作为关键字(更改常量或适应您的代码)的示例代码,并从单元格A1开始将输出插入到Sheet1

代码语言:javascript
复制
Sub Test()
    Const searchKeyWord As String = "YBWP"
    
    Dim XMLPage As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim requestData As String
    
    requestData = "keyword=" & searchKeyWord & "&type=search&page=TAF"
    
    XMLPage.Open "POST", "http://www.bom.gov.au/aviation/php/process.php", False
    XMLPage.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    XMLPage.send requestData 
   
    HTMLDoc.body.innerHTML = XMLPage.responseText
    
    Dim resultColl As Object
    Set resultColl = HTMLDoc.getElementsByTagName("p")
    
    Dim i As Long
    For i = 0 To resultColl.Length - 1
        ThisWorkbook.Worksheets("Sheet1").Cells(i + 1, 1).Value = resultColl(i).innerText
    Next i
End Sub

运行此命令将返回XMLPage.responseText,如下所示:

代码语言:javascript
复制
<h3>WEIPA YBWP</h3><p class="product">TAF YBWP 251217Z 2514/2602<br />10006KT 9999 SCT020<br />RMK<br />T 27 25 25 30 Q 1011 1009 1011 1012</p><p class="product">METAR YBWP 251230Z AUTO 00000KT 9999 // SCT027 SCT033 BKN047 28/24<br />Q1012 RMK RF00.0/000.0</p>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69706344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档