从 public Google sheet 抓取数据 - 对于不同的选项卡相同 url
Scraping data from public Google sheet - same url for different tabs
我想从 Google sheet 的 public 网页中抓取数据。这是 link.
我对第 4 个选项卡 "US daily 4 pm ET" 中的数据特别感兴趣,但是该选项卡的 url 与所有其他选项卡相同(至少根据地址栏我试过的浏览器——Chrome 和 Firefox)。当我尝试使用 R 中的 rvest 包抓取数据时,我最终得到了第二个选项卡中的数据,"States current"。
我右键单击以检查第一个选项卡 "README",看看我是否可以找出有关选项卡名称的信息。看起来第 4 个选项卡的名称是 sheet-button-916628299。但是在我的浏览器中输入以 /pubhtml#gid=sheet-button-916628299 或 /pubhtml#gid=916628299 结尾的 URLS 并没有带我到第 4 个选项卡。
如何找到 URL 将我(更重要的是,R 中的 rvest 包)带到第 4 个选项卡中的数据?
这相当直截了当:所有选项卡的数据都已加载到页面上,而不是通过 xhr 请求加载。 css 只是隐藏或取消隐藏每个选项卡的内容。
如果您在浏览器中使用开发者窗格,您可以看到每个选项卡都在一个 div 中,带有一个数字 ID,该 ID 由每个选项卡的 ID 中的数字给出。
我们可以获取页面并制作正确 css 选择器的数据框,以获取每个选项卡的内容,如下所示:
library(rvest)
url <- paste0("https://docs.google.com/spreadsheets/u/2/d/e/",
"2PACX-1vRwAqp96T9sYYq2-i7Tj0pvTf6XVHjDSMIKBdZ",
"HXiCGGdNC0ypEU9NbngS8mxea55JuCFuua1MUeOj5/pubhtml#")
page <- read_html(url)
tabs <- html_nodes(page, xpath = "//li")
tab_df <- data.frame(name = tabs %>% html_text,
css = paste0("#", gsub("\D", "", html_attr(tabs, "id"))),
stringsAsFactors = FALSE)
tab_df
#> name css
#> 1 README #1600800428
#> 2 States current #1189059067
#> 3 US current #294274214
#> 4 States daily 4 pm ET #916628299
#> 5 US daily 4 pm ET #964640830
#> 6 States #1983833656
现在我们可以像这样获取第四个选项卡的内容:
html_node(page, tab_df$css[4]) %>% html_nodes("table") %>% html_table()
#> [[1]]
#>
#> 1 1 Date State Positive Negative Pending Death Total
#> 2 NA
#> 3 2 20200314 AK 1 143 144
#> 4 3 20200314 AL 6 22 46 74
#> 5 4 20200314 AR 12 65 26 103
#> 6 5 20200314 AZ 12 121 50 0 183
#> 7 6 20200314 CA 252 916 5 1,168
#> 8 7 20200314 CO 101 712 1 814
#> 9 8 20200314 CT 11 125 136
#> 10 9 20200314 DC 10 49 10 69
#> 11 10 20200314 DE 6 36 32 74
#> 12 11 20200314 FL 77 478 221 3 776
#> 13 12 20200314 GA 66 1 66
#> 14 13 20200314 HI 2 2
#> 15 14 20200314 IA 17 83 100
#> .... (535 rows in total)
我想从 Google sheet 的 public 网页中抓取数据。这是 link.
我对第 4 个选项卡 "US daily 4 pm ET" 中的数据特别感兴趣,但是该选项卡的 url 与所有其他选项卡相同(至少根据地址栏我试过的浏览器——Chrome 和 Firefox)。当我尝试使用 R 中的 rvest 包抓取数据时,我最终得到了第二个选项卡中的数据,"States current"。
我右键单击以检查第一个选项卡 "README",看看我是否可以找出有关选项卡名称的信息。看起来第 4 个选项卡的名称是 sheet-button-916628299。但是在我的浏览器中输入以 /pubhtml#gid=sheet-button-916628299 或 /pubhtml#gid=916628299 结尾的 URLS 并没有带我到第 4 个选项卡。
如何找到 URL 将我(更重要的是,R 中的 rvest 包)带到第 4 个选项卡中的数据?
这相当直截了当:所有选项卡的数据都已加载到页面上,而不是通过 xhr 请求加载。 css 只是隐藏或取消隐藏每个选项卡的内容。
如果您在浏览器中使用开发者窗格,您可以看到每个选项卡都在一个 div 中,带有一个数字 ID,该 ID 由每个选项卡的 ID 中的数字给出。
我们可以获取页面并制作正确 css 选择器的数据框,以获取每个选项卡的内容,如下所示:
library(rvest)
url <- paste0("https://docs.google.com/spreadsheets/u/2/d/e/",
"2PACX-1vRwAqp96T9sYYq2-i7Tj0pvTf6XVHjDSMIKBdZ",
"HXiCGGdNC0ypEU9NbngS8mxea55JuCFuua1MUeOj5/pubhtml#")
page <- read_html(url)
tabs <- html_nodes(page, xpath = "//li")
tab_df <- data.frame(name = tabs %>% html_text,
css = paste0("#", gsub("\D", "", html_attr(tabs, "id"))),
stringsAsFactors = FALSE)
tab_df
#> name css
#> 1 README #1600800428
#> 2 States current #1189059067
#> 3 US current #294274214
#> 4 States daily 4 pm ET #916628299
#> 5 US daily 4 pm ET #964640830
#> 6 States #1983833656
现在我们可以像这样获取第四个选项卡的内容:
html_node(page, tab_df$css[4]) %>% html_nodes("table") %>% html_table()
#> [[1]]
#>
#> 1 1 Date State Positive Negative Pending Death Total
#> 2 NA
#> 3 2 20200314 AK 1 143 144
#> 4 3 20200314 AL 6 22 46 74
#> 5 4 20200314 AR 12 65 26 103
#> 6 5 20200314 AZ 12 121 50 0 183
#> 7 6 20200314 CA 252 916 5 1,168
#> 8 7 20200314 CO 101 712 1 814
#> 9 8 20200314 CT 11 125 136
#> 10 9 20200314 DC 10 49 10 69
#> 11 10 20200314 DE 6 36 32 74
#> 12 11 20200314 FL 77 478 221 3 776
#> 13 12 20200314 GA 66 1 66
#> 14 13 20200314 HI 2 2
#> 15 14 20200314 IA 17 83 100
#> .... (535 rows in total)