Web 从 url 列表中抓取每个 url 背后的数据
Web scraping the data behind every url from a list of urls
我正在尝试从这个名为 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 - 我想要资金数额、代币、国家等
如有任何帮助,我们将不胜感激!
首先加载 library(tidyverse); library(rvest)
...和一个警告——此代码效率不高(即,您可以通过使用 lapply 或使代码更 purrr 来避免扩展 list() 结构,但我会把它留作练习)
所以答案的关键在于通过 rvest::html_session()
开始会话,然后使用 rvest::follow_link()
and/or rvest::jump_to()
但几乎没有其他数据清理挑战,所以我想我会做一个更完整的答案。由于您已经在 ICOdataset
变量中拥有了要跟踪的所有 "links",我们可以利用它并构建一个函数来获取任何特定 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)]
分别是拉取 every-odd 或 every-even 元素。为什么?因为您会注意到 table 数据与 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()
}
请注意,您需要 clean-up 原始拼写中的名称,以便它们 URL-friendly(即,用连字符替换空格和句点)。
现在我们的结果在一个列表中,我们可以像这样转换为漂亮的 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~ ~,0~ DRT 0.12 USD France 16th Aug 2017 11th Sep 20~
# 2 genesi~ ~,83~ GVT 1.00 USD Russia 15th Sep 2017 5th Oct 2017
# 3 latoken ~,0~ LAT 0.30 USD Singap~ NA NA
# 4 vibera~ ~,7~ VIB 0.10 USD Sloven~ NA NA
# 5 wepower ~,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 ~,68~ ARN 0.50 USD Belize 1st Sep 2017 19th Sep 20~
# 8 ambros~ ~,0~ AMB 0.29 USD Switze~ NA NA
# 9 appcoi~ ~,3~ APPC 0.10 USD Singap~ 6th Nov 2017 20th Nov 20~
# 10 bankex ~,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>
我正在尝试从这个名为 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 - 我想要资金数额、代币、国家等
如有任何帮助,我们将不胜感激!
首先加载 library(tidyverse); library(rvest)
...和一个警告——此代码效率不高(即,您可以通过使用 lapply 或使代码更 purrr 来避免扩展 list() 结构,但我会把它留作练习)
所以答案的关键在于通过 rvest::html_session()
开始会话,然后使用 rvest::follow_link()
and/or rvest::jump_to()
但几乎没有其他数据清理挑战,所以我想我会做一个更完整的答案。由于您已经在 ICOdataset
变量中拥有了要跟踪的所有 "links",我们可以利用它并构建一个函数来获取任何特定 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)]
分别是拉取 every-odd 或 every-even 元素。为什么?因为您会注意到 table 数据与 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()
}
请注意,您需要 clean-up 原始拼写中的名称,以便它们 URL-friendly(即,用连字符替换空格和句点)。
现在我们的结果在一个列表中,我们可以像这样转换为漂亮的 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~ ~,0~ DRT 0.12 USD France 16th Aug 2017 11th Sep 20~
# 2 genesi~ ~,83~ GVT 1.00 USD Russia 15th Sep 2017 5th Oct 2017
# 3 latoken ~,0~ LAT 0.30 USD Singap~ NA NA
# 4 vibera~ ~,7~ VIB 0.10 USD Sloven~ NA NA
# 5 wepower ~,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 ~,68~ ARN 0.50 USD Belize 1st Sep 2017 19th Sep 20~
# 8 ambros~ ~,0~ AMB 0.29 USD Switze~ NA NA
# 9 appcoi~ ~,3~ APPC 0.10 USD Singap~ 6th Nov 2017 20th Nov 20~
# 10 bankex ~,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>