You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:55:54