使用JavaScript生成的表的web抓取
我正试图从上的“代码”选项卡(包含使用JavaScript生成的表的web抓取,javascript,r,web-scraping,rvest,Javascript,R,Web Scraping,Rvest,我正试图从上的“代码”选项卡(包含x和的大表)中删除该表 我以为下面的一个会起作用 library(rvest) library(tidyverse) "https://international.ipums.org/international-action/variables/MIGYRSBR#codes_section" %>% read_html() %>% html_table() "https://international.ipums.org/internati
x
和
的大表)中删除该表
我以为下面的一个会起作用
library(rvest)
library(tidyverse)
"https://international.ipums.org/international-action/variables/MIGYRSBR#codes_section" %>%
read_html() %>%
html_table()
"https://international.ipums.org/international-action/variables/MIGYRSBR#codes_section" %>%
read_html() %>%
html_nodes(".variablesList , #ui-id-1")
。。。但是没有什么有用的东西回来了。我查看了html文件的源代码。我认为该网站正在使用一些JavaScript生成表?这是否意味着不可能拿到桌子
注意:我无法在我的office PC上安装RSelenium,我没有看到robots.txt,也没有看到T&C,但我读过(非常令人畏惧的)“使用受限微数据的应用程序”(我忘了我有一个可以访问IPUM的帐户,尽管我不记得曾经使用过它)。我对他们希望在下载之前预先登记数据潜在敏感性质的重要性印象深刻 由于该元数据中没有“微数据”(似乎提供元数据是为了帮助人们决定他们可以选择哪些数据元素),并且由于它的获取和使用没有违反任何规定的限制,以下内容应该可以。如果IPUMS的代表看到了这一点并不同意,我会很乐意删除答案,并要求SO管理员真正删除它(对于那些不知道的人,代表级别足够高的人可以看到删除的答案) 现在,您不需要Selenium或Splash,但需要对以下代码检索到的数据进行一些后处理 构建元数据表的数据位于
标记中的javascript blob中(使用“查看源代码”查看它,稍后您将需要它)。我们可以使用一些string-munging和V8包来获得它:
library(V8)
library(rvest)
library(jsonlite)
library(stringi)
pg <- read_html("https://international.ipums.org/international-action/variables/MIGYRSBR#codes_section")
html_nodes(pg, xpath=".//script[contains(., 'Less than')]") %>%
html_text() %>%
stri_split_lines() %>%
.[[1]] -> js_lines
idx <- which(stri_detect_fixed(js_lines, '$(document).ready(function() {')) - 1
那些“100人名单”每个都是100个数字
您需要查看“查看源代码”(如上所述)中的代码,以了解如何使用这两位数据重新创建元数据表
我确实认为你最好沿着@alistaire为你开创的道路走,但要完全遵循它。我在论坛()中没有看到关于获取“代码和频率”或“元数据”(如此)的问题,并且至少在5个位置阅读IPUMS工作人员在论坛中阅读和回答的问题,以及他们的信息电子邮件地址:ipums@umn.edu
很明显,他们在电子版的某个地方有这些元数据,可能会在所有数据产品中为您提供完整的元数据转储,以避免进一步的刮取(我猜这是您的目标,因为我无法想象一种情况下,一个世界会为了一个摘录而经历这种麻烦)。请参阅上面关于刮取的评论,但如果有帮助的话,我们刚刚发布了,这使得在R中使用IPUMS元数据更容易一些 如果您在其中提取
MIGYRSBR
,然后下载DDI(甚至在完整的微数据发布之前就可以使用DDI),您可以使用以下命令获取代码表:
# install.packages("ipumsr")
library(ipumsr)
ddi <- read_ipums_ddi("ipumsi_00020.xml")
ipums_val_labels(ddi, "MIGYRSBR")
#> # A tibble: 7 x 2
#> val lbl
#> <dbl> <chr>
#> 1 0 Less than 1 year
#> 2 6 6 (6 to 10 1960-70, 6 to 9 1980)
#> 3 10 10 (10+ 1980)
#> 4 11 11 (11+ 1960-70)
#> 5 97 97+
#> 6 98 Unknown
#> 7 99 NIU (not in universe)
注意,DDI本身不具备web上的可用性/频率,您需要计算
那些来自数据。可能是@Hardikgupta的副本我无法在我的办公室PC上安装RSelenium。该网站有明确允许的获取数据的方法,不包括刮取。通过他们的渠道,你可能会得到一个很好的平面文件,而不会破坏版权。@alistaire have。没有办法获得元数据(在我想要得到的表中),非常感谢。不打算刮去很多元数据页。。。现在只有三个人。。。没想到会变得这么复杂。我完全明白在工作电脑上限制selenium这样的东西是多么令人沮丧。它或Splash World很快就能解决这个问题。你甚至可以安装或使用独立的(我假设是Windows)二进制文件吗?如果是这样,我有一个小得多的解决方案。尝试从CLAN安装<代码> WebStudio,然后运行<代码>安装程序PHANDOMJS()>代码>,如果它在这里注释了Ping Me。现在请考虑元数据与微数据具有相同的术语(最重要的是请引用我们,这是我们如何能够保持灯亮!)否则我认为@hrbmstr所说的一切看起来都很好,请不要对我们的服务器太用力。我们希望开发一个API,这样就更容易了,但现在还不能讨论时间表。
code_json <- fromJSON(sprintf("https://international.ipums.org%s", code_data$jsonPath))
str(code_json, 1)
## List of 6
## $ 2416:List of 100
## $ 2417:List of 100
## $ 2418:List of 100
## $ 2419:List of 100
## $ 2420:List of 100
## $ 2651:List of 100
# install.packages("ipumsr")
library(ipumsr)
ddi <- read_ipums_ddi("ipumsi_00020.xml")
ipums_val_labels(ddi, "MIGYRSBR")
#> # A tibble: 7 x 2
#> val lbl
#> <dbl> <chr>
#> 1 0 Less than 1 year
#> 2 6 6 (6 to 10 1960-70, 6 to 9 1980)
#> 3 10 10 (10+ 1980)
#> 4 11 11 (11+ 1960-70)
#> 5 97 97+
#> 6 98 Unknown
#> 7 99 NIU (not in universe)
data <- read_ipums_micro(ddi, verbose = FALSE)
data$MIGYRSBR <- as_factor(data$MIGYRSBR)
table(data$MIGYRSBR)
#>
#> Less than 1 year 1
#> 123862 65529
#> 2 3
#> 77190 59908
#> 4 5
#> 44748 49590
#> 6 (6 to 10 1960-70, 6 to 9 1980) 10 (10+ 1980)
#> 185220 0
#> 11 (11+ 1960-70) 97+
#> 318097 0
#> Unknown NIU (not in universe)
#> 6459 2070836