我正在尝试从此网站收集名为ICObench的数据集。我设法使用rvest和purrr在91页中提取每个ICO的名称,但我对如何提取列表中每个名称后面的数据感到困惑。所有名称都是可点击的链接。这是到目前为止的代码:
url_base <- "https://icobench.com/icos?page=%d&filterBonus=&filterBounty=&filterTeam=&filterExpert=&filterSort=&filterCategory=all&filterRating=any&filterStatus=ended&filterCountry=any&filterRegistration=0&filterExcludeArea=none&filterPlatform=any&filterCurrency=any&filterTrading=any&s=&filterStartAfter=&filterEndBefore="
map_df(1:91,function(i){
page <- read_html(sprintf(url_base,i))
data.frame(ICOname = html_text(html_nodes(page,".name")))
})->ICOdataset
有什么方法可以将每个名称背后的特定信息与现有列表相匹配,以便R自动为所有ICO提取它?例如:https://icobench.com/ico/domraider - 我想要资金金额,代币,国家等等。
非常感谢任何帮助!
答案 0 :(得分:0)
首先加载library(tidyverse); library(rvest)
...并发出警告 - 此代码效率不高(即,您可以避免使用lapply扩展list()结构或使代码更加咕噜声,但我&#39;将其留作练习)
所以答案的关键在于通过rvest::html_session()
开始会话,然后使用rvest::follow_link()
和/或rvest::jump_to()
,但是其他数据清理难度很小,所以我想我会做一个更完整的答案。既然你已经拥有了所有的&#34;链接&#34;如果您想要关注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)
}
注意到来自第二个选择器(table
)的.data_row .col_2
数据并不理想,但它可以正常工作,并且在进行抓取时是相同的。 data[c(FALSE, TRUE)]
和data[c(TRUE, FALSE)]
分别是拉出每个奇数或每个偶数元素。为什么?因为您注意到ICO
数据表不一致,所以我们需要一个动态分配名称的变长data.frame
。
现在我们可以使用ICO
启动会话并循环浏览jump_to()
并运行我们的函数,同时将结果存储在列表中。
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()
}
注意您需要清理原始scrape中的名称,以便它们对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>