Web从URL列表中抓取每个URL后面的数据

时间:2018-03-20 17:14:00

标签: r web-scraping rvest purrr

我正在尝试从此网站收集名为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 - 我想要资金金额,代币,国家等等。

非常感谢任何帮助!

1 个答案:

答案 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>