【问题标题】:R: How can I use the package Rcrawler to do JSON parsing in parallel?R:如何使用 Rcrawler 包并行进行 JSON 解析?
【发布时间】:2018-02-25 11:57:07
【问题描述】:

我刚刚遇到了这个强大的 R 包,但不幸的是,我无法找到如何并行解析响应为 JSON 的 url 列表。

作为一个简单的例子,假设我有一个城市列表(在瑞士):

list_cities <- c("Winterthur", "Bern", "Basel", "Lausanne", "Lugano")

在下一步中,我想为列出的每个城市找到前往苏黎世市的公共交通连接。我可以使用以下传输 api 来查询公共时间表数据:

https://transport.opendata.ch

使用 httr 包,我可以为每个城市发出如下请求:

for (city in list_cities) {
   r <- GET(paste0("http://transport.opendata.ch/v1/connections?from=", city, "&to=Zurich&limit=1&fields[]=connections/duration"))
   cont <- content(r, as = "parsed", type = "application/json", encoding = "UTF-8")
}

获取个人旅程的持续时间。但是,我有更长的列表和更多的目的地。这就是为什么我正在寻找一种方法来并行发出多个请求。

【问题讨论】:

  • 哪些有效,哪些无效?你将如何迭代地做它?提供一个最小的可重现示例。
  • @ 感谢 cmets。我添加了一个小例子。

标签: json r rcrawler


【解决方案1】:

请注意,我没有对此进行测试 - 但首先,您将初始化并行工作器

library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterEvalQ(cl, { library(Rcrawler) }) # load required packages onto each parallel worker

用你的相关命令创建函数

custom_parse_json <- function(city) {
    r <- GET(paste0("http://transport.opendata.ch/v1/connections?from=", city, "&to=Zurich&limit=1&fields[]=connections/duration"))
    cont <- content(r, as = "parsed", type = "application/json", encoding = "UTF-8")
    return(cont)
}

导出函数到每个并行工作

clusterExport(cl, c("custom_parse_json"))

遍历城市列表

parLapply(cl, list_cities, function(i) custom_parse_json(i))

这应该会返回您的 JSON 内容列表。

【讨论】:

  • @CPak 非常感谢 - 完美运行并将我的解析时间减少了 75%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多