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

如何在R中使用Socrata API从数字开头的resource.id深度滚动查询

问题:如何配置Socrata API的scroll_id参数,让深度滚动从数字开头的最小resource.id开始?

我用R爬取犹他州Socrata门户的所有公开数据集,因为总量超过10000条,必须使用API的deep scrolling机制和scroll_id参数。但发现带scroll_id查询时,结果是按resource.id的字母顺序返回的——当scroll_id设为NULL时,默认从首字母开头的记录开始拉取,导致数千条数字开头的记录无法被获取到。

我现在的临时解决办法是:先不带scroll_id发起查询,会返回10000条随机顺序的结果,从中提取出编号最小的数字开头记录,再用这个ID作为scroll_id重新进行深度滚动查询。但我觉得这种方法可能无法覆盖全部数据,以下是我目前用的代码:

pacman::p_load(tidyverse,
               httr,
               jsonlite)

# Function to query without scroll_id
get_socrata_data <- function(domain, 
                             limit = 15000) {
    "http://api.us.socrata.com/api/catalog/v1?domains=${domain}&limit=${limit}" %>%
        str_interp() %>%
        httr::GET() %>%
        content("text") %>%
        fromJSON(flatten = TRUE)
}

# Scroll function that includes scroll_id
scroll_socrata <- function(domain,
                           limit = 15000,
                           scroll_id = NULL) {
    "http://api.us.socrata.com/api/catalog/v1?domains=${domain}&scroll_id=${scroll_id}&limit=${limit}" %>%
        str_interp() %>%
        httr::GET() %>%
        content("text") %>%
        fromJSON(flatten = TRUE)
}

ut_domain <- 'opendata.utah.gov'

# Initial query without scroll_id
ut_results <- get_socrata_data(ut_domain)
nrow(ut_results$results)

# If results are capped, restart with first digit id using scroll function
if (nrow(ut_results$results) == 10000) {
    
    # Pull out first record starting with digit
    digit_start <- ut_results$results |>
        filter(str_starts(resource.id, '\\d'))
    first_digit_id <- first(sort(digit_start$resource.id))
    
    # Data frame for results
    output <- data.frame()
    
    # Restart query with scroll_socrata function that includes scroll_id
    page <- scroll_socrata(ut_domain,
                           scroll_id = first_digit_id)
    
    output <- bind_rows(output, page$results)
    
    # more pages if necessary
    while (nrow(page$results) == 10000) {
        page <- scroll_socrata(ut_domain,
                               scroll_id = last(page$results$resource.id))
        output <- bind_rows(output, page$results)
    }
}

# check total
nrow(output)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:28:25