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>