我正在做文献综述,所以我试图获取谷歌学术中某些搜索词下的论文列表。我无法获取可用的 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()
我想出了一个解决办法。基本上循环遍历每个参考文献并获取 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 )
}