【VBA研究】用XMLHTTP的Get功能通過百度API接口抓取城市間距離

作者:iamlaosong

我曾經用VB做了個工具,抓取城市間距離(參見:從網頁抓取城市間的距離),現在看來,那個工具還是比較low的,用瀏覽器控件,模擬點擊過程,再在響應中截取距離,後來還利用這個方法做了幾個其它工具。在掌握了瀏覽器中開發人員工具和fiddler使用方法之後,通過分析這個網頁查詢城市之間距離可以發現,距離是通過百度接口取得的。摒棄無關的請求之後(特別是其中圖形部分),只申請距離,響應速度得到極大的提高,爲此做了一個函數可以輕鬆獲得城市間的距離。

1、通過開發人員工具獲取相關請求

Request URL:

http://api.map.baidu.com/?qt=nav&c=1&sn=2%24%24%24%24%24%24%E5%90%88%E8%82%A5%24%24%24%24&en=2%24%24%24%24%24%24%E4%B9%8C%E9%B2%81%E6%9C%A8%E9%BD%90%24%24%24%24&sy=0&ie=utf-8&oue=1&fromproduct=jsapi&res=api&callback=BMap._rd._cbk92197

其中參數sn和en就是兩個城市名稱,替換這兩個參數值,其他參數值不變,就可以得到不同城市間的距離。

開發人員工具向下滾動找到參數部分,看其中的sn和en這兩個參數,按照其格式替換參數即可:

2、響應很長,我們只要截取前面一段中的距離

以距離前後的字符“dis”和“kps”爲標誌,截取距離數據,單位是“米”。

3、抓取數據需要用到對象Microsoft XML v6.0,可以先引用一下,然後用New創建對象

也可以不引用直接創建對象:

Dim xh As Object

Set xh = CreateObject("MSXML2.XMLHTTP.6.0")


4、函數lc(sn,en)使用情況

5、幾行代碼寫成的函數

'城市距離
Public Function lc(sn As String, en As String)
    Dim rt As String, hp1 As String, hp2 As String, http As String
    Dim m1 As Integer, m2 As Integer
    Dim xh As New XMLHTTP60
    
    'sn = "合肥"
    'en = "上海"
    '構成請求網址
    hp1 = "http://api.map.baidu.com/?qt=nav&c=1&sn=2$$$$$$"
    hp2 = "$$$$&sy=0&ie=utf-8&oue=1&fromproduct=jsapi&res=api&callback=BMap._rd._cbk92197"
    http = hp1 & sn & "$$$$&en=2$$$$$$" & en & hp2
    
    xh.Open "get", http
    xh.send
    
    '/BMap._rd._cbk92197 && BMap._rd._cbk92197({"content":{"dis":3463940,"kps":
    rt = xh.responseText
    m1 = InStr(rt, "dis")
    m2 = InStr(rt, "kps")
    lc = Mid(rt, m1 + 5, m2 - m1 - 7)
End Function

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章