Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从VBA Excel中抓取Google地图?_Excel_Vba_Google Maps_Web Crawler_Extract - Fatal编程技术网

如何从VBA Excel中抓取Google地图?

如何从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

作为一个真正的编码初学者,我在这里寻找一些帮助

我想从GoogleMaps中提取数据:比如说,邮政编码,通过VBA从excel单元格中的公司输入

当我开始编码时,我在字符串级别遇到了一些困难,因为我无法找到准确的标记(我认为,这里是关键,span)并有效地提取Googlemaps HTML页面地址行上的邮政编码:

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:对象变量或未设置块变量

因为我无法选择准确的块

接下来,我有两个问题:

  • 从谷歌地图中提取数据有效吗?(通过VBA或开源Google API,从Google工作表(10000行excel)中提取)
  • 有人遇到过这种困难吗?我怎样才能在谷歌地图的HTML页面上选择正确的块

  • 这不是我将要做的,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