Rvest,要在页面上的各个元素之间循环以便在每个元素上都遵循一个链接?

时间:2018-08-19 18:28:54

标签: r database web-scraping data-science rvest

因此,我正在尝试从一个包含我学校俱乐部数据的站点中收集数据。我有一个很好的脚本,可以从站点上抓取表面水平面数据,但是,我可以通过单击每个俱乐部的“更多信息”链接(指向俱乐部的个人资料页面)来获得更多数据。我想从该页面(特别是facebook链接)中抓取数据。

在下面,您将看到我目前的尝试。

url <- 'https://uws-community.symplicity.com/index.php?s=student_group'
page <- html_session(url)

get_table <- function(page, count) {
  #find group names
  name_text <- html_nodes(page,".grpl-name a") %>% html_text()
  df <- data.frame(name_text, stringsAsFactors = FALSE)

  #find text description
  desc_text <- html_nodes(page, ".grpl-purpose") %>% html_text()
  df$desc_text <- trimws(desc_text)

  #find emails
  #  find the parent nodes with html_nodes
  #  then find the contact information from each parent using html_node
  email_nodes<-html_nodes(page, "div.grpl-grp") %>% html_node( ".grpl-contact a") %>% html_text()
  df$emails<-email_nodes

  category_nodes <- html_nodes(page, "div.grpl-grp") %>% html_node(".grpl-type") %>% html_text()
  df$category<-category_nodes

  pic_nodes <-html_nodes(page, "div.grpl-grp") %>% html_node( ".grpl-logo img") %>% html_attr("src")
  df$logo <- paste0("https://uws-community.symplicity.com/", pic_nodes)

  more_info_nodes <- html_nodes(page, ".grpl-moreinfo a") %>% html_attr("href")
  df$more_info <- paste0("https://uws-community.symplicity.com/", more_info_nodes)

  sub_page <- page %>% follow_link(css = ".grpl-moreinfo a")

  df$fb <- html_node(sub_page, xpath = '//*[@id="dnf_class_values_student_group__facebook__widget"]') %>% html_text()

  if(count != 44) {
    return (rbind(df, get_table(page %>% follow_link(css = ".paging_nav a:last-child"), count + 1)))
  } else{
    return (df)
  }
}


RSO_data <- get_table(page, 0)

我当前遇到的错误是:

Error in `$<-.data.frame`(`*tmp*`, "logo", value = "https://uws-community.symplicity.com/") : 
  replacement has 1 row, data has 0 

我知道我需要创建一个将通过每个元素并遵循链接的函数,然后将该函数映射到数据帧df。但是我不知道该如何使该功能正常运行。

2 个答案:

答案 0 :(得分:1)

您的错误表明您正在尝试组合两个不同的维度...页面变量已经具有一个维度,第二个维度为0。page <- html_session(url)将其添加到函数中。

答案 1 :(得分:0)

这是您的错误消息的可复制示例。

x = data.frame()
x[1] <- c(1)

我没有检查您的代码,但是错误在那里,您必须逐步检查代码。您会发现错误,您在其中创建了一个空的data.frame,然后尝试为其分配值。 祝你好运