如何使用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
相关产品推荐
相关产品推荐

