从 RSelenium 中的嵌套节点获取数据

问题描述 投票:0回答:1

我正在做文献综述,所以我试图获取谷歌学术中某些搜索词下的论文列表。我无法获取可用的 PDF 链接。有些参考文献有 PDF,有些没有,还有的最多有两个。我只对第一个感兴趣。

带有 PDF 的节点位于此处“.gs_or_ggsm a”,问题是当我尝试使用以下方式获取此类信息时:

PDFs <- page %>% html_nodes(".gs_or_ggsm a")%>%  html_attr("href")

PDFs <- page %>% rvest::html_nodes(".gs_or_ggsm a") %>%
        rvest::html_attr("href") %>% 
        .[startsWith(., "https://")] %>%
        .[!startsWith(., "/scholar?")]

...我得到的行数与参考文献的数量不匹配。有没有办法让没有 PDF 的参考文献获得 NA,而其他人只收集第一个?

下图中是完整参考的示例。请注意节点的嵌套性,以及末尾如何有两个 href。我只需要蓝色的。

library(tidyverse)
library(RSelenium)
library(rvest)
library(httr)
library(netstat)

TERM="Eriophyidae"

rD <- rsDriver(browser = "firefox",
           chromever = NULL,
           port = free_port())
remDr <- rD$client

# Function to extract data from a page
extract_data <- function(page_source) {
  page <- read_html(page_source)
  titles <- page %>% html_nodes(".gs_rt") %>% html_text()
  authors <- page %>% html_nodes(".gs_a") %>% html_text()
  years <- str_extract(authors, "\\d{4}")
  authors <- str_replace(authors, "\\d{4}", "")
  urls <- page %>% html_nodes(".gs_rt a") %>% html_attr("href")

 # PDFs <- page %>% html_nodes(".gs_or_ggsm a")%>%  html_attr("href") #This is the line with a problem

  data.frame(Title_name = titles, Author_Names = authors, Year_Publication = years, Title_URL = urls )#, PDF=PDF)
}


# Function to search for a specific term on Google Scholar
search_google_scholar <- function(term) {
  tryCatch({
    remDr$navigate("https://scholar.google.com/")
    search_box <- remDr$findElement("css", "#gs_hdr_tsi")
    search_box$sendKeysToElement(list(term, key="enter"))
    Sys.sleep(5) # Allow time for page to load

    pages <- 2 # Number of pages to scrape 
    results <- data.frame()

    for (page in 1:pages) {
      page_source <- remDr$getPageSource()[[1]]
      page_data <- extract_data(page_source)
      results <- rbind(results, page_data)
  
      next_button <- remDr$findElement("css", "#gs_n a")
      if (length(next_button) == 0) {
        break
      } else {
        next_button$clickElement()
        Sys.sleep(5) # Allow time for page to load
      }
    }

    return(results)
  }, error = function(e) {
    message("An error occurred: ", conditionMessage(e))
    NULL
  })
}


search_results <- search_google_scholar(TERM)

# Close the browser
remDr$close()

# Stop the Selenium server
rD$server$stop()
json web-scraping rvest rselenium jsonlite
1个回答
0
投票

我想出了一个解决办法。基本上循环遍历每个参考文献并获取 PDF,如果不可用则返回 NA。

AllPDFs <- page %>% rvest::html_nodes(".gs_r.gs_or.gs_scl") 

PDFs=c()
for (i in 1: 10){
    P1=AllPDFs[i]
    PDFi= P1 %>% rvest::html_nodes(".gs_or_ggsm a")  %>%  rvest::html_attr("href") %>% 
      .[startsWith(., "https://")] %>%
      .[!startsWith(., "/scholar?")]
    if(length(PDFi)==0) {PDFi=NA}
    PDFs=c(PDFs,PDFi ) 
  }
© www.soinside.com 2019 - 2024. All rights reserved.