2017-05-28 175 views
1

对此很新,很耐心。我需要从嵌入式谷歌地图提取标记坐标 - 示例链接是http://www.picknpay.co.za/store-search,我想提取搜索时在地图上生成的所有标记位置。考虑使用诸如ParseHub之类的服务,但在走这条路线之前,我认为我会通过SO /自己来投篮。从嵌入谷歌地图中提取标记坐标

要找到存储在地图中的标记的坐标,必须比手动遍历所有坐标并单独搜索它们的坐标要简单一些吗?

谢谢偷拍!

回答

2

网页源代码HTML提供的链接http://www.picknpay.co.za/store-search不包含必要的数据,它使用AJAX。网站http://www.picknpay.co.za有一个可用的API。响应以JSON格式返回。导航页面e。 G。在Chrome中,然后打开开发工具窗口(F12),网络选项卡,重新加载(F5)页面并检查记录的XHR。最相关的数据是由URL返回的JSON字符串:

http://www.picknpay.co.za/picknpay/json/picknpay/en/modules/store_finder/findStores.json

XHR-preview

XHR-headers

您可以使用下面的VBA代码的上述检索信息。 JSON.bas模块导入JSON处理的VBA项目。

Option Explicit 

Sub Scrape_picknpay_co_za() 

    Dim sResponse As String 
    Dim sState As String 
    Dim vJSON As Variant 
    Dim aRows() As Variant 
    Dim aHeader() As Variant 

    ' Retrieve JSON data 
    XmlHttpRequest "POST", "http://www.picknpay.co.za/picknpay/json/picknpay/en/modules/store_finder/findStores.json", "", "", "", sResponse 
    ' Parse JSON response 
    JSON.Parse sResponse, vJSON, sState 
    If sState <> "Array" Then 
     MsgBox "Invalid JSON response" 
     Exit Sub 
    End If 
    ' Convert result to arrays for output 
    JSON.ToArray vJSON, aRows, aHeader 
    ' Output 
    With ThisWorkbook.Sheets(1) 
     OutputArray .Cells(1, 1), aHeader 
     Output2DArray .Cells(2, 1), aRows 
     .Columns.AutoFit 
    End With 

    MsgBox "Completed" 

End Sub 

Sub XmlHttpRequest(sMethod As String, sUrl As String, arrSetHeaders, sFormData, sRespHeaders As String, sContent As String) 

    Dim arrHeader 

    'With CreateObject("Msxml2.ServerXMLHTTP") 
    ' .SetOption 2, 13056 ' SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS 
    With CreateObject("MSXML2.XMLHTTP") 
     .Open sMethod, sUrl, False 
     If IsArray(arrSetHeaders) Then 
      For Each arrHeader In arrSetHeaders 
       .SetRequestHeader arrHeader(0), arrHeader(1) 
      Next 
     End If 
     .send sFormData 
     sRespHeaders = .GetAllResponseHeaders 
     sContent = .responseText 
    End With 

End Sub 

Sub OutputArray(oDstRng As Range, aCells As Variant) 

    With oDstRng 
     .Parent.Select 
     With .Resize(1, UBound(aCells) - LBound(aCells) + 1) 
      .NumberFormat = "@" 
      .Value = aCells 
     End With 
    End With 

End Sub 

Sub Output2DArray(oDstRng As Range, aCells As Variant) 

    With oDstRng 
     .Parent.Select 
     With .Resize(_ 
       UBound(aCells, 1) - LBound(aCells, 1) + 1, _ 
       UBound(aCells, 2) - LBound(aCells, 2) + 1) 
      .NumberFormat = "@" 
      .Value = aCells 
     End With 
    End With 

End Sub 

对我来说,输出如下:

output

顺便说一句,在下面的答案适用相同的方法:123456789

+0

谢谢@巨蟒,这个工作就像一个魅力遵循这些说明。我对VBA不太熟悉,该脚本中实际发生了什么? – NickvR

+0

@NickvR代码中有关于主要步骤的注释,请询问您是否想要对代码的某个部分进行任何解释。 – omegastripes