gpt4 book ai didi

javascript - 使用 JavaScript 生成的表格的 Web 抓取

转载 作者:行者123 更新时间:2023-11-29 17:48:17 25 4
gpt4 key购买 nike

我正在尝试从 this website 上的代码选项卡中抓取表格(包含 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 来生成表格?这是否意味着无法获得该表?

注意:我无法在办公室 PC 上安装 RSelenium

最佳答案

我没看到robots.txt也不是条款和条件,但我确实通读了(相当令人生畏的)“使用受限微数据的应用程序”(我忘记了我有一个可以访问 IPUMS 的帐户,尽管我不记得曾经使用过它)。他们希望在下载之前预先了解其数据的潜在敏感性质的重要性,这给我留下了深刻的印象。

由于此元数据中没有“微数据”(似乎提供元数据是为了帮助人们决定他们可以选择哪些数据元素)并且由于获取和使用它不会违反任何规定的限制,因此以下内容应该没问题。如果 IPUMS 的代表看到这个并且不同意,我将很乐意删除答案并要求 SO 管理员真的也删除它(对于那些不知道的人,具有足够高代表的人可以看到已删除的答案)。

现在,您不需要为此使用 Selenium 或 Splash,但您需要对以下代码检索到的数据进行一些后处理。

构建元数据表的数据位于 <script> 中的 javascript blob 中。标签(使用“查看源代码”查看它,稍后您将需要它)。我们可以使用一些字符串修改和 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

找到目标 <script>元素,获取内容,将其转换为行并找到不是数据的第一行。我们只能提取带有数据的 javascript 代码,因为 R 中的 V8 引擎不是一个完整的浏览器,无法执行它之后的 jQuery 代码。

我们现在创建一个“V8 上下文”,提取代码并在所述 V8 上下文中执行它并检索它:

ctx <- v8()

ctx$eval(paste0(js_lines[1:idx], collapse="\n"))

code_data <- ctx$get("codeData")

str(code_data)
## List of 14
## $ jsonPath : chr "/international-action/frequencies/MIGYRSBR"
## $ samples :'data.frame': 6 obs. of 2 variables:
## ..$ name: chr [1:6] "br1960a" "br1970a" "br1980a" "br1991a" ...
## ..$ id : int [1:6] 2416 2417 2418 2419 2420 2651
## $ categories :'data.frame': 100 obs. of 5 variables:
## ..$ id : int [1:100] 4725113 4725114 4725115 4725116 4725117 4725118 4725119 4725120 4725121 4725122 ...
## ..$ label : chr [1:100] "Less than 1 year" "1" "2" "3" ...
## ..$ indent : int [1:100] 0 0 0 0 0 0 0 0 0 0 ...
## ..$ code : chr [1:100] "00" "01" "02" "03" ...
## ..$ general: logi [1:100] FALSE FALSE FALSE FALSE FALSE FALSE ...
## $ longSamplesHeader : chr "<tr class=\"fullHeader grayHeader\">\n\n <th class=\"codesColumn\">Code</th>\n <th class=\"la"| __truncated__
## $ samplesHeader : chr "\n<tr class=\"fullHeader grayHeader\">\n <th class=\"codesColumn\">Code</th>\n <th class=\"labelColum"| __truncated__
## $ showCounts : logi FALSE
## $ generalWidth : int 2
## $ width : int 2
## $ interval : int 25
## $ isGeneral : logi FALSE
## $ frequencyType : NULL
## $ project_uses_survey_groups: logi FALSE
## $ variables_show_tab_1 : chr ""
## $ header_type : chr "short"

jsonPath组件建议它在构建代码和频率表时使用更多数据,因此我们也可以获取它:

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

那些“100 的列表”是每个 100 个数字。

您需要查看“查看源代码”中的代码(如上所述),了解如何使用这两位数据重新创建元数据表。

确实认为您最好遵循@alistaire 开始的路径,但完全 遵循它。我在论坛 (http://answers.popdata.org/) 中没有看到关于获取“代码和频率”或“元数据”(例如这个)的问题,并且至少阅读了 5 个地方,IPUMS 工作人员在论坛和他们的论坛中阅读和回答问题信息-电子邮件地址:ipums@umn.edu .

他们显然以电子方式在某处拥有此元数据,并且可能会为您提供所有数据产品的完整转储以避免进一步抓取(我猜这是您的目标,因为我无法想象人们想要经历的场景一个摘录就麻烦了)。

关于javascript - 使用 JavaScript 生成的表格的 Web 抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46763207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com