
如何快速實現REST API集成以優化業務流程
library("magrittr")
library("jsonlite")
dizhi = c('北京市朝陽區望京東路6號望京國際研發園三期','北京市海淀區上地信息路9號奎科科技大廈')
將地址解析為具體的經緯度:
GetJD <- function(address){
url = "http://api.map.baidu.com/geocoder/v2/"
header <- c("User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36")
payload = list(
'output' = 'json',
'ak' = '***********'
)
addinfo <- data.frame()
for (i in dizhi){
payload[["address"]]=i
tryCatch({
web <- GET(url,add_headers(.headers = header),query = payload)
content <- web %>% content(as="text",encoding="UTF-8") %>% fromJSON(flatten = TRUE) %>% [[
(2) %>% [[
(1)
addinfo <- rbind(addinfo,content)
},error = function(e){
cat(sprintf("任務【%s】處理失敗!",i),sep = "\n")
addinfo <- rbind(addinfo,list("lng" = NA ,"lat" = NA))
})
Sys.sleep(runif(1))
print(sprintf("正在抓取第【%s】個地址",i))
}
print("所有數據全部抓取完畢!!!")
return(addinfo)
}
運行程序:
system.time(myresult<-GetJD(dizhi))
lng lat
116.4955 40.01256
116.3130 40.04769
lddata = data.frame(
lon = c(39.934,40.013,40.047),
lat = c(116.329,116.495,116.313)
)
GetAddress <- function(lddata){
url = "http://api.map.baidu.com/geocoder/v2/"
header = c('User-Agent'= 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36')
payload = list(
'output' = 'json',
'ak' = '*******'
)
addinfo = c()
for (i in 1:nrow(lddata)){
payload[['location']] = sprintf('%.3f,%.3f',lddata[i,'lon'],lddata[i,'lat'])
tryCatch({
web <- GET(url,add_headers(.headers = header),query = payload)
addinfo <- web %>% content(as="text",encoding="UTF-8") %>% fromJSON(flatten = TRUE) %>%[[(2) %>%[[`(2) %>% c(addinfo,.)
},error = function(e){
cat(sprintf(“第【%d】個任務處理失敗!”,i),sep = “\n”)
addinfo <- c(addinfo,NA)
})
}
return(addinfo)
}
運行逆解析程序
system.time( MyAddress<-GetAddress(lddata))
'北京市海淀區增光路35-6號' '北京市朝陽區望京東路輔路' '北京市海淀區上地五街9號'
Python版:
import time
import requests
from urllib.request import quote
#待解析的地址
dizhi = ['北京市朝陽區望京東路6號望京國際研發園三期','北京市海淀區上地信息路9號奎科科技大廈']
地址解析函數——將地址轉換為經緯度
def getid(dizhi):
url = "http://api.map.baidu.com/geocoder/v2/"
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
payload = {
'output':'json',
'ak':'**********'
}
addinfo = []
for i in dizhi:
payload['address'] = i
try:
content = requests.get(url,params=payload,headers=header).json()
addinfo.append(content['result']['location'])
except:
pass
return(addinfo)
運行解析程序
if __name__ == "__main__":
#計時開始:
t0 = time.time()
myaddress = getid(dizhi)
t1 = time.time()
total = t1 - t0
print("消耗時間:{}".format(total))
[{'lat': 40.012564990769135, 'lng': 116.49546484496102},
{'lat': 40.04768803728198, 'lng': 116.31300123279135}]
地址逆解析——經緯度解析為具體地址
lon = [39.934,40.013,40.047]
lat = [116.329,116.495,116.313]
lddata = [(j,w) for j,w in zip(lon,lat)]
解析函數
def GetAddress(lddata):
url = "http://api.map.baidu.com/geocoder/v2/"
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
payload = {
'output':'json',
'ak':'*********'
}
addinfo = []
for lon,lat in lddata:
payload['location'] = '{0:s},{1:s}'.format(str(lon),str(lat))
try:
content = requests.get(url,params=payload,headers=header).json()
addinfo.append(content['result']['formatted_address'])
except:
addinfo.append(None)
return(addinfo)
運行程序
if __name__ == "__main__":
#計時開始:
t0 = time.time()
mylonlat = GetAddress(lddata)
t1 = time.time()
total = t1 - t0
print("消耗時間:{}".format(total))
['北京市海淀區增光路35-6號', '北京市朝陽區望京東路輔路', '北京市海淀區上地五街9號']
文章轉自微信公眾號@數據小魔方