You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Rcrawler包并行解析JSON格式的URL响应?

如何用Rcrawler并行解析返回JSON响应的URL列表

我刚好之前用Rcrawler处理过类似的API并行请求场景,它完全能满足你的需求!下面针对你查询瑞士城市到苏黎世公共交通线路的场景,给出具体实现步骤和代码示例:

核心思路

Rcrawler虽常被用于网页抓取,但它的多线程功能可以灵活适配API请求——只需要自定义一个解析JSON响应的函数,再配置并行参数,就能批量处理你的URL列表。

步骤1:准备请求URL列表

先把你的瑞士城市列表转换成对应的API请求URL。假设你使用的公共交通API格式类似https://api.example.com/connections?from={city}&to=Zurich,可以这样构造:

library(Rcrawler)
library(jsonlite)

# 你的瑞士城市列表
swiss_cities <- c("Basel", "Bern", "Lausanne", "Geneva", "Winterthur", "Lucerne")

# 构造API请求URL(根据实际API格式调整占位符和参数)
api_template <- "https://api.sbb.ch/v1/connections?from={city}&to=Zurich&limit=1"
request_urls <- gsub("{city}", swiss_cities, api_template)

步骤2:编写自定义JSON解析函数

接下来写一个函数,用来处理每个API返回的JSON数据,提取你需要的信息(比如最快线路时长、出发时间等)。记得加入错误处理,避免单个请求失败中断整个并行任务:

parse_transit_data <- function(url) {
  tryCatch({
    # 发送请求并解析JSON
    json_response <- jsonlite::fromJSON(url)
    
    # 提取核心数据(根据API返回的JSON结构调整)
    if (!is.null(json_response$connections) && nrow(json_response$connections) > 0) {
      top_route <- json_response$connections[1, ]
      data.frame(
        from_city = top_route$from$station$name,
        to_city = "Zurich",
        duration_min = as.numeric(gsub("PT(\\d+)M", "\\1", top_route$duration)),
        departure_time = top_route$from$departure,
        status = "success"
      )
    } else {
      # 处理无结果的情况
      data.frame(
        from_city = gsub(".*from=(.*)&to=.*", "\\1", url),
        to_city = "Zurich",
        duration_min = NA,
        departure_time = NA,
        status = "no_connections"
      )
    }
  }, error = function(e) {
    # 处理请求失败的情况
    data.frame(
      from_city = gsub(".*from=(.*)&to=.*", "\\1", url),
      to_city = "Zurich",
      duration_min = NA,
      departure_time = NA,
      status = paste("error:", e$message)
    )
  })
}

步骤3:启动Rcrawler并行任务

用Rcrawler函数传入URL列表、自定义解析函数,同时设置并行线程数(根据你的CPU核心数调整,避免触发API限流):

# 启动并行抓取
parallel_results <- Rcrawler(
  URLs = request_urls,
  ParseFunction = parse_transit_data,
  numThreads = 3, # 建议根据API限流规则调整,别设太高
  verbose = TRUE, # 显示进度信息
  followLinks = FALSE # 不需要抓取页面链接,只处理给定的URL
)

# 合并所有结果为一个数据框
final_transit_data <- do.call(rbind, parallel_results)

# 查看结果
print(final_transit_data)

重要注意事项

  • API限流:绝大多数公共交通API都有请求频率限制,并行线程数不要设置过高,必要时可以在解析函数里加入Sys.sleep(0.5)添加延迟,避免被封禁。
  • JSON结构适配:上面的解析函数基于假设的API返回结构,你需要根据实际使用的API(比如SBB的官方API)调整提取逻辑。
  • 错误处理:tryCatch能确保单个请求失败不会影响整个任务,建议保留这个逻辑。

内容的提问来源于stack exchange,提问作者Patrick Balada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:11:34