【问题标题】:R - Loop to scrap and combine pages using rvest [closed]R使用rvest抓取多个页面[关闭]
【发布时间】:2022-01-03 03:36:57
【问题描述】:

我想跨多个页面抓取表格中包含的数据。我使用下面的代码来抓取第一个表格,但我不确定如何抓取其他页面中的表格:

library (rvest)
library(dplyr)
    
WA_link<-"https://www.worldathletics.org/records/toplists/sprints/100-metres/outdoor/women/senior/2021?page=1"
WA_page<-read_html(WA_link)
    
WA_table<-WA_page  %>% html_nodes("table.records-table") %>%
      html_table() %>% . [[1]]

我希望抓取所有表(或给定数量的表),然后将它们组合成一个数据框。如何调整我的代码以实现此目的?

谢谢。

【问题讨论】:

    标签: r dataframe loops dplyr rvest


    【解决方案1】:

    这是一个用于抓取和合并第 1-4 页的循环。我不知道如何抓取网站以查看集合中有多少页,所以现在应该手动更改页数。

    pages <- 1:4 # where 4==whatever the number of pages is..
    
    WA_list=list()
    for(i in seq_along(pages)){
      WA_link<-paste0("https://www.worldathletics.org/records/toplists/sprints/100-metres/outdoor/women/senior/2021?page=",pages[i])
      WA_page<-read_html(WA_link)
    
      WA_list[[i]] <- WA_page  %>% html_nodes("table.records-table") %>%
        html_table() %>% . [[1]]
    
    }
    WA_table <- dplyr::bind_rows(WA_list)
    

    或者,您可以扫描比预期更多的内容。

    pages <- c(1:100)
    
    WA_list=vector("list", length(pages))
      ## "pre-allocate" an empty list of length 5
    for(i in seq_along(pages)){
      print(i)
      WA_link<-paste0("https://www.worldathletics.org/records/toplists/sprints/100-metres/outdoor/women/senior/2021?page=",pages[i])
      WA_page<-read_html(WA_link)
    
      WA_list[[i]] <- WA_page  %>% html_nodes("table.records-table") %>%
        html_table() %>% . [[1]]
      WA_table <- dplyr::bind_rows(WA_list) # this is a crude solution to creating a data frame while allowing the loop to stop when the max page has been reached. ideally, there would be a logical here for when no data is retrieved on pages[i]
    }
    

    注意:希望有人可以编辑此答案以在 WA_page %&gt;% html_nodes("table.records-table") %&gt;% html_table() %&gt;% . [[1]] 中不存在数据的 i 处退出循环。然后,此解决方案会将bind_rows() 移动到循环之后以防止冗余进程。

    【讨论】:

    • 非常感谢杰西卡。无需输入即可知道要导入多少页是完美的,但这种方式效果很好。
    • 您可以将页面大小增加到比预期大得多的值。例如,您的示例页面有 37 页。您最多可以扫描 100 页。如果页面没有数据,则不会加载任何内容。处理时间会更长一些。我已经更新了我的答案以包含这个可能的解决方案。
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多