使用R爬取Google Scholar遇问题,求代码修改方案
原代码问题分析
- 路径参数错误:将Chrome路径写在
firefoxpath参数中,且Windows路径的反斜杠未转义(需用\\替代\)。 - 正则转义错误:R中字符串里的
\d需写成\\d,否则会被识别为无效转义字符。 - 节点选择不稳定:
cited_by的选择器.gs_fl a:nth-child(3)依赖固定位置,易失效;下一页按钮选择器#gs_n a会选中多个按钮,无法精准定位"下一页"。 - 数据拼接风险:循环用
rbind拼接数据框,若某页字段数量不一致会直接报错。 - 冗余配置:同时指定
chromever和geckover,属于无效参数组合。
修改后的RSelenium代码
修复上述问题,优化数据处理逻辑:
# 安装必要包(首次运行执行) # install.packages(c("RSelenium", "rvest", "stringr", "dplyr")) library(RSelenium) library(rvest) library(stringr) library(dplyr) # 启动Chrome浏览器:修正参数配置 rD <- rsDriver( browser = "chrome", chromever = "latest", port = 4445L, verbose = FALSE, check = TRUE ) remDr <- rD$client # 搜索关键词 search_terms <- "((COVID OR COVID-19))" # 单页数据提取函数:修正正则与节点选择,处理缺失值 extract_data <- function(page_source) { page <- read_html(page_source) # 提取标题 titles <- page %>% html_nodes(".gs_rt") %>% html_text() # 提取作者与年份:修正正则转义 authors_years <- page %>% html_nodes(".gs_a") %>% html_text() years <- str_extract(authors_years, "\\d{4}") authors <- str_replace(authors_years, "\\d{4}", "") %>% str_trim() # 提取标题链接:补全无链接条目 urls <- page %>% html_nodes(".gs_rt a") %>% html_attr("href") urls <- ifelse(length(urls) < length(titles), c(urls, rep(NA, length(titles)-length(urls))), urls) # 提取引用数:用包含"Cited by"的节点,提升稳定性 cited_nodes <- page %>% html_nodes(".gs_fl a:contains('Cited by')") %>% html_text() cited_by <- str_extract(cited_nodes, "\\d+") %>% as.integer() cited_by <- ifelse(length(cited_by) < length(titles), c(cited_by, rep(NA, length(titles)-length(cited_by))), cited_by) # 返回结构化数据 tibble( Title_name = titles, Author_Names = authors, Year_Publication = years, Title_URL = urls, cited_by = cited_by ) } # 多页爬取函数:修正下一页按钮定位 search_google_scholar <- function(term, pages = 2) { tryCatch({ # 访问Google Scholar主页 remDr$navigate("https://scholar.google.com/") Sys.sleep(3) # 定位搜索框并执行搜索 search_box <- remDr$findElement("css", "#gs_hdr_tsi") search_box$clearElement() search_box$sendKeysToElement(list(term, key = "enter")) Sys.sleep(5) results_list <- list() for (i in 1:pages) { # 提取当前页数据 page_source <- remDr$getPageSource()[[1]] page_data <- extract_data(page_source) results_list[[i]] <- page_data # 点击下一页:定位到最后一个分页按钮(适配英文界面,中文界面替换为"下一页") try({ next_button <- remDr$findElement("css", "#gs_n td:last-child a") next_button$clickElement() Sys.sleep(5) }, silent = TRUE) } # 合并所有页数据 bind_rows(results_list) }, error = function(e) { message("错误信息: ", conditionMessage(e)) NULL }) } # 执行爬取 search_results <- search_google_scholar(search_terms) # 关闭浏览器与服务器 remDr$close() rD$server$stop() # 查看结果 print(search_results)
替代方案:使用scholar包(无需浏览器自动化)
scholar包专为Google Scholar爬取设计,配置简单,适合小规模数据获取:
# 安装包(首次运行执行) # install.packages("scholar") library(scholar) # 搜索关键词,获取2页数据 search_results <- get_scholar_articles(search_terms, pages = 2) # 整理所需字段 final_data <- search_results %>% select( Title_name = title, Author_Names = authors, Year_Publication = year, Title_URL = url, cited_by = cites ) # 查看结果 print(final_data)
注意事项
- Google Scholar有反爬机制,频繁请求可能触发IP封禁,建议添加合理延迟,必要时使用代理。
scholar包的搜索结果与网页版可能存在细微差异,若需完全匹配网页内容,优先选择RSelenium方案。
内容的提问来源于stack exchange,提问作者Prajwal Mani Pradhan
相关产品推荐
相关产品推荐

