我如何使用 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 创建
我正在尝试从 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 创建