首先加载library(tidyverse); library(rvest)...并发出警告——此代码效率不高(即,您可以通过使用 lapply 或使代码更咕噜声来避免扩展 list() 结构,但我将其保留为练习)
因此,答案的关键在于通过rvest::html_session() 开始会话,然后使用rvest::follow_link() 和/或rvest::jump_to(),但几乎没有其他数据清理挑战,所以我想我会做一个更完整的答案。由于您已经在 ICOdataset 变量中拥有了所有想要关注的“链接”,我们可以利用它并构建一个函数来获取任何特定 ICO 页面的数据。
例如,假设我们已经关注了../ico/domraider,我们可以编写一个函数get_data_for_ico()来提取它的相关信息:
get_data_for_ico <- function(ico_page) {
raised <-
ico_page %>%
html_node(".raised") %>%
html_text()
data <-
ico_page %>%
html_nodes(".data_row .col_2") %>%
html_text(trim = T)
data_df <- data.frame(raised, t(data[c(FALSE, TRUE)]))
names(data_df) <- c("raised", t(data[c(TRUE, FALSE)]))
return(data_df)
}
请注意,来自第二个选择器 (.data_row .col_2) 的数据的 table 并不理想,但它会起作用,并且在抓取方面与课程相当。 data[c(FALSE, TRUE)] 和 data[c(TRUE, FALSE)] 分别是拉每奇或每偶元素。为什么?因为您会注意到 ICO 的数据表不一致,所以我们需要一个可变长度的 data.frame 来动态分配其名称。
现在我们可以使用jump_to() 开始一个会话并循环遍历ICO 并运行我们的函数,同时将结果存储在一个列表中。
results <- list()
s <- html_session(sprintf(url_base, 1))
for (ico in seq_along(ICOdataset$ICOname)) {
clean_ico <-
ICOdataset$ICOname[ico] %>%
str_to_lower() %>%
str_replace_all("\\s|\\.", "-")
link_name <- paste0("ico/", clean_ico)
message(link_name)
results[[clean_ico]] <-
s %>%
jump_to(link_name) %>%
get_data_for_ico()
}
请注意,您需要清理原始抓取中的名称,以便它们对 URL 友好(即,用连字符替换空格和句点)。
现在我们的结果在列表中,我们可以像这样转换为漂亮的tibble:
results_df <-
bind_rows(results, .id = "ICO") %>%
as_data_frame()
# # A tibble: 60 x 12
# ICO raised Token `Price in ICO` Country `preICO start` `preICO end`
# <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 domrai~ ~$45,0~ DRT 0.12 USD France 16th Aug 2017 11th Sep 20~
# 2 genesi~ ~$2,83~ GVT 1.00 USD Russia 15th Sep 2017 5th Oct 2017
# 3 latoken ~$20,0~ LAT 0.30 USD Singap~ NA NA
# 4 vibera~ ~$10,7~ VIB 0.10 USD Sloven~ NA NA
# 5 wepower ~$40,0~ WPR 0.13 USD Gibral~ 22nd Sep 2017 23rd Oct 20~
# 6 xinfin NA XDCE 1 ETH = 133,0~ Singap~ 1st Jun 2017 31st Jul 20~
# 7 aeron ~$5,68~ ARN 0.50 USD Belize 1st Sep 2017 19th Sep 20~
# 8 ambros~ ~$30,0~ AMB 0.29 USD Switze~ NA NA
# 9 appcoi~ ~$15,3~ APPC 0.10 USD Singap~ 6th Nov 2017 20th Nov 20~
# 10 bankex ~$70,6~ BKX 1 ETH = 500 B~ USA NA NA
# # ... with 50 more rows, and 5 more variables: `ICO start` <chr>, `ICO
# # end` <chr>, `Whitelist/KYC` <chr>, `Restricted areas` <chr>, `Price in
# # preICO` <chr>