【发布时间】:2015-10-17 08:08:44
【问题描述】:
在进行网络抓取时,我遇到了以下问题,我认为可能有更好的解决方案:
拥有这些数据:
dat <- data.frame(query = c("Washington, USA", "Frankfurt, Germany"))
query
1 Washington, USA
2 Frankfurt, Germany
我想查询例如Google Maps Api 并返回格式化的地址。可能有多种格式。结果应该如下:
query formatted_address
1 Washington, USA Washington, DC, USA
2 Washington, USA Washington, UT, USA
3 Washington, USA Washington, VA 22747, USA
4 Washington, USA Washington, IA 52353, USA
5 Washington, USA Washington, GA 30673, USA
6 Washington, USA Washington, PA 15301, USA
7 Frankfurt, Germany Frankfurt, Germany
我现在要做的是:
require(RCurl)
require(rvest)
require(magrittr)
build_url <- function(x, base_url = "https://maps.googleapis.com/maps/api/geocode/xml?address="){
paste0(base_url, RCurl::curlEscape(x))
}
l <- lapply(dat$query, function(q){
formatted_address <- q %>% build_url %>% read_xml %>% xml_nodes("formatted_address") %>% xml_text
data.frame(query = q, formatted_address)
})
do.call(rbind, l) # This can be done via data.table::rbindlist as well
有没有更好的解决方案?也许更多data.table或dplyr风格?
【问题讨论】:
-
请包含
library/require调用以使您的代码可重现 -
当然。刚刚添加了
require语句 -
除了
stringsAsFactors=FALSE上的data.frame创建之外,您已经完美地优化了这个IMO。我建议在lappl中添加sleep,并确保将调用次数限制为2500 或更少的IIRC(usage limits 信息)。
标签: r google-maps data.table dplyr transformation