我如何使用 R 从 neurosynth 中抓取 table?

How do I webscrape a table from neurosynth with R?

我正在尝试从 neurosynth 中抓取一些 table 数据来处理 fmri 数据。 https://www.neurosynth.org/locations/2_2_2_6/(现在什么数据并不重要。我只想能够从位置页面的关联部分的 table 获取数据)

我已经成功地使用以下代码抓取了一个简单的维基百科页面:

          url = 
"https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population"
          read_html(url) %>%
            html_element("table") %>%
            html_table() %>%
           

工作绝对没问题。我用我的 neurosynth 数据尝试同样的事情,即:

             neurosynth_link = "https://www.neurosynth.org/locations/2_2_2_6/"
             read_html(neurosynth) %>%
               html_element("table") %>%
               html_table() 

我得到:

# A tibble: 0 × 4 
# … with 4 variables: Title <lgl>, Authors <lgl>, Journal <lgl>, Activations 
<lgl>

无效。

我玩了一会儿,设法用下面的代码得到了我想要的 table 的标题(z-score、后验概率等):

neurosynth_link = "https://www.neurosynth.org/locations/2_2_2_6/"
neurosynth_page = read_html(neurosynth)
neuro_synth_table = neurosynth_page %>% html_nodes("table#location_analyses_table")  
 %>%
 html_table() 
neuro_synth_table

[[1]]
# A tibble: 1 × 5
 ``    `Individual voxel` `Individual voxel` `Seed-based network` `Seed-based 
network`    
<chr> <chr>              <chr>              <chr>                <chr>                   
 1 Name  z-score            Posterior prob.    Func. conn. (r)      Meta-analytic 
coact. (r)

但这就是我所能得到的。怎么回事?

您想要的 table 是由 javascript 生成的,因此实际上并不存在于您要抓取的静态 html 中。 javascript 下载一个单独的 json 文件,其中包含 table.

每个页面的所有数据

这实际上是个好消息 - 这意味着您可以一次获取所有 134 页数据的条目。我们可以在浏览器的开发人员选项卡中找到 json 文件的 url 并使用它。通过一些争论,我们将所有数据都放在一个数据框中。这是一个完整的代表:

library(httr)

url    <- "https://www.neurosynth.org/api/locations/2_2_2_6/compare?_=1645644227258"
result <- content(GET(url), "parsed")$data
names  <- c("Name", "z_score", "post_prob", "func_con", "meta_analytic")
df     <- do.call(rbind, lapply(result, function(x) setNames(as.data.frame(x), names)))
df$z_score <- as.numeric(df$z_score)
#> Warning: NAs introduced by coercion
df <- df[order(-df$z_score), ]

现在我们在一个漂亮的数据框中有了数据:

head(df)
#>         Name z_score post_prob func_con meta_analytic
#> 760       mm    8.78      0.86     0.15          0.52
#> 509    gamma    8.10      0.85     0.19          0.63
#> 1135 sources    6.46      0.77     0.10          0.32
#> 825    noise    5.33      0.73     0.00          0.08
#> 671  lesions    4.66      0.72    -0.01          0.00
#> 1137 spatial    4.57      0.63    -0.15          0.00

我们有全部数据:

nrow(df)
#> [1] 1334

reprex package (v2.0.1)

于 2022-02-23 创建