【问题标题】:Web scraping the data behind every url from a list of urlsWeb 从 url 列表中抓取每个 url 背后的数据
【发布时间】:2018-03-20 17:14:00
【问题描述】:

我正在尝试从这个名为 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 - 我想要资金金额、代币、国家等。

任何帮助将不胜感激!

【问题讨论】:

    标签: r web-scraping rvest purrr


    【解决方案1】:

    首先加载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>
    

    【讨论】:

    • 非常感谢您的详尽回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2019-08-27
    • 2021-11-30
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多