如何从VBA Excel中抓取Google地图?
作为一个真正的编码初学者,我在这里寻找一些帮助 我想从GoogleMaps中提取数据:比如说,邮政编码,通过VBA从excel单元格中的公司输入 当我开始编码时,我在字符串级别遇到了一些困难,因为我无法找到准确的标记(我认为,这里是关键,span)并有效地提取Googlemaps HTML页面地址行上的邮政编码:如何从VBA Excel中抓取Google地图?,excel,vba,google-maps,web-crawler,extract,Excel,Vba,Google Maps,Web Crawler,Extract,作为一个真正的编码初学者,我在这里寻找一些帮助 我想从GoogleMaps中提取数据:比如说,邮政编码,通过VBA从excel单元格中的公司输入 当我开始编码时,我在字符串级别遇到了一些困难,因为我无法找到准确的标记(我认为,这里是关键,span)并有效地提取Googlemaps HTML页面地址行上的邮政编码: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = Range("nom").Row And
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = Range("nom").Row And _
Target.Column = Range("nom").Column Then
Dim GM As New InternetExplorer
GM.Visible = True
GM.navigate "https://www.google.fr/maps/@43.3082377,5.4259519,17z?q=" & Range("nom").Value
Do
DoEvents
Loop Until GM.readyState = READYSTATE_COMPLETE
Dim doc As HTMLDocument
Set doc = GM.document
Dim sSPAN As String
sSPAN = Trim(doc.getElementsByTagName("span")(4).innerText)
MsgBox sSPAN
End If
End Sub
第13行显示以下错误:
运行标题错误91:对象变量或未设置块变量
因为我无法选择准确的块
接下来,我有两个问题:
这不是我将要做的,API肯定是首选的,尽管不是通过GoogleMaps,除非您正在构建一个应用程序,您也可以在其中嵌入所需的地图 您需要适当的页面加载等待,等待元素出现,最后退出应用程序,并使用不同的选择器策略。您还需要实现一些逻辑来从地址提取邮政编码(我不确定您得到的是什么视图。我使用了测试值
Enterome
):
选项显式
私有子工作表_更改(ByVal目标作为范围)
Dim t作为日期,gm作为新的InternetExplorer
常量最大等待时间=10秒
如果Target.Row=Range(“nom”).Row和Target.Column=Range(“nom”).Column,则
gm.可见=真实
总经理“导航”https://www.google.fr/maps/@43.3082377,5.4259519,17z?q=“&Range(“nom”).值
总经理忙时或总经理准备时状态4:DoEvents:Wend
作为对象的模糊元素
t=计时器
做
出错时继续下一步
Set elem=gm.document.querySelector(“.section info text”)
错误转到0
如果定时器-t>最大等待时间,则退出Do
循环,而元素什么都不是
如果不是,那么elem什么都不是
MsgBox Trim$(元素innerText)
'实现逻辑以提取post代码
如果结束
总经理,辞职
如果结束
端接头
在这里,您将看到有关可用的API的概述。我建议使用比web爬行可靠得多的API。开始时,API可能看起来更难,但以后每次Google更改地图上的输出时,都需要修复web爬行器。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t As Date, gm As New InternetExplorer
Const MAX_WAIT_SEC As Long = 10
If Target.Row = Range("nom").Row And Target.Column = Range("nom").Column Then
gm.Visible = True
gm.navigate "https://www.google.fr/maps/@43.3082377,5.4259519,17z?q=" & Range("nom").Value
While gm.Busy Or gm.readyState <> 4: DoEvents: Wend
Dim elem As Object
t = Timer
Do
On Error Resume Next
Set elem = gm.document.querySelector(".section-info-text")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While elem Is Nothing
If Not elem Is Nothing Then
MsgBox Trim$(elem.innerText)
'Implement logic to extract post code
End If
gm.Quit
End If
End Sub