发表论文一般需要三步,写,投,改。好不容易定好了题,好不容易算完了数据,好不容易改完了稿,却不知道如何选择最适合自己的期刊,实在有一些可惜。因此,对本领域发文情况做一次检索是非常必要的。
用Excel展示检索结果的期刊名,发文频次,期刊信息等。
SinoMed 由中国医学科学院医学信息研究所/图书馆开发研制。其涵盖资源丰富,能全面、快速反映国内外生物医学领域研究的新进展,功能强大,是集 检索、统计分析、免费获取、全文传递服务 于一体的生物医学中外文整合文献服务系统。
今天我们就用SinoMed进行相关领域文献检索(http://www.sinomed.ac.cn/index.jsp):
本次以( "肿瘤"[常用字段:智能] OR "癌"[常用字段:智能]) AND "生物信息学"[常用字段:智能] AND "网络药理学"[常用字段:智能]
为例.
检索结果可见有250
篇文献,其中207
篇为核心期刊文献。使用结果输出功能获得所有文献的论文标题和出处情况。
结果展示:
本地主要流程由RSelenium
完成, 同样的事情也可以用python
+Selenium
完成, 效果一致.
首先在工作目录中新建code
文件夹并创建prepare.R
以创建工作环境.
# !准备
# 清除当前环境中的除了root_dir的所有对象
setdiff(ls(), "root_dir")
# 设置文件路径
# root_dir <- paste("~", "Rstudio", "example", sep = '/')
# root_dir <- paste("/Volumes/ExYezi/RStudio", "CountryNatrue", sep = "/")
# 加载 librarian 包
library(librarian)
# 安装并载入 obgetDEGs 包
# //devtools::install_github('sandy9707/obgetDEGs')
# //shelf(sandy9707 / obgetDEGs, update_all = TRUE)
shelf(sandy9707 / obgetDEGs,
cran_repo = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"
)
# 设置输出目录
output_dir <- "output"
shelfEnvironment(output_dir, path = root_dir)
# 设置输入目录
imput_dir <- "imput"
shelfEnvironment(imput_dir, path = root_dir)
# 载入 openxlsx、dplyr 和 jsonlite 包
shelf(openxlsx, dplyr, jsonlite, tidyr, stringr,
cran_repo = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"
)
j <- 1
i <- 1
k <- 1
read_json <- function(json_file) {
tryCatch(
{
fromJSON(readLines(json_file), simplifyDataFrame = FALSE)
},
error = function(e) {
fromJSON("{}")
}
)
}
library(stringr)
trans_journal_names <- function(journal_names) {
sapply(journal_names, function(journal_name) {
if (str_detect(journal_name, "世界科学技术")) {
str_replace_all(journal_name, "\\·|(|)|\\(|\\)", "-")
} else {
str_replace_all(journal_name, "\\·|(|)|\\(|\\)", "")
}
})
}
创建一个可供控制的Selenium
网页, 这里使用的是火狐浏览器.
# ! 准备----
## 清除当前环境中的所有对象
rm(list = ls())
## 设置主文件夹路径, 并设置工作目录
(root_dir <- sub("/code.+", "", rstudioapi::getSourceEditorContext()$path))
source(paste(root_dir, "code", "prepare.R", sep = "/"))
# !main----
shelf(
vctrs, shiny, RCurl, XML, stringr,
dplyr, rvest, openxlsx, RSelenium, rvest
)
remDr <- remoteDriver(browserName = "firefox")
remDr$open()
remDr$navigate("https://navi.cnki.net/knavi/journals/JSYX/detail?uniplatform=NZKPT")
shelfEnvironment(paste(imput_dir, sep = "/"), path = root_dir)
paper_info <- read.xlsx(list.files(pattern = "xlsx")[1])
# journal_names <-
paper_info[, 2] <- trans_journal_names(paper_info[, 2])
journal_names <- paper_info[, 2] %>% unique()
自动导航到所需要的网页并使用搜索框进行搜索(循环内):
i <- 1
remDr$switchToWindow(remDr$getWindowHandles()[[1]])
journal_name <- journal_names[[i]]
print(paste(i, ": ", journal_name, sep = ""))
# 查找搜索框并填入搜索词
text_ele <- remDr$findElement(using = "css", value = "#txt_1_value1")
text_ele$clearElement()
text_ele$sendKeysToElement(list(journal_name))
# 点击搜索按扭
click_ele <- remDr$findElement(using = "css", value = "#btnSearch")
click_ele$clickElement()
Sys.sleep(3)
# 查看搜索结果并点击相应的条目
try(results_eles <- remDr$findElements("class", "detials"))
if (length(results_eles) == 0) {
next
}
try(result_num <- sapply(
results_eles, function(x) {
x$getElementText()
}
) %>%
unlist() %>%
trans_journal_names() %>%
grep(journal_name, .) %>%
as.numeric())
if (length(result_num) >= 1) {
results_eles[[result_num[1]]]$clickElement()
} else {
next
}
查看元素可知搜索结果包含在class="detials"
内, 所以获得所有class
为"detials"
的信息,然后如果比对和期刊名一样就点击进入。
Sys.sleep(3)
# 查看搜索结果并点击相应的条目
try(results_eles <- remDr$findElements("class", "detials"))
if (length(results_eles) == 0) {
next
}
try(result_num <- sapply(
results_eles, function(x) {
x$getElementText()
}
) %>%
unlist() %>%
trans_journal_names() %>%
grep(journal_name, .) %>%
as.numeric())
if (length(result_num) >= 1) {
results_eles[[result_num[1]]]$clickElement()
} else {
next
}
进入之后可以看到所有的信息都存储在相应的class
中, 分别确认相应的class
并获取信息。
Sys.sleep(3)
# 关闭前一窗口并重新聚焦于新窗口
remDr$closeWindow()
remDr$switchToWindow(remDr$getWindowHandles()[[1]])
try(remDr$findElement("class", "btn-stretch")$clickElement())
Sys.sleep(1)
current_journal_name_list <- sapply(
remDr$findElements("class", "titbox"), function(x) {
x$getElementText()
}
) %>%
strsplit(x = .[[1]], split = "\\\n")
database_sum_info <- sapply(
remDr$findElements("class", "journalType"), function(x) {
x$getElementText()
}
) %>%
unlist() %>%
paste(collapse = ";")
# 使用lapply获取database的文本内容
database_list <- sapply(
remDr$findElements("class", "database"), function(x) {
x$getElementText()
}
)
database_info <- database_list %>%
unlist() %>%
paste(collapse = ";")
# 使用lapply获取hostUnit的文本内容
hostunit_list <- lapply(
remDr$findElements("class", "hostUnit"),
function(x) {
x$getElementText()[[1]]
}
)
利用所有搜集到的信息输出成json
文件以便之后利用。将搜索过程和整理过程分开的好处在于之后可以任意调整所需要输出的数据格式,不需要再次获取数据本身。
# 将列表名和值拆分为列表的名称和值,并用setNames()给新列表命名
journalbaseinfo_list <- setNames(
lapply(hostunit_list, function(x) {
unlist(strsplit(x, ":"))[2]
}), lapply(hostunit_list, function(x) {
unlist(strsplit(x, ":"))[1]
})
)
journalinfo_obj <- setNames(list(journalbaseinfo_list %>%
append(setNames(lapply(current_journal_name_list, "[[", 1), "journal_name_zh")) %>%
append(setNames(lapply(current_journal_name_list, "[[", 2), "journal_name_en")) %>%
append(setNames(database_info, "database_info")) %>%
append(setNames(database_sum_info, "database_sum_info"))), current_journal_name_list[[1]][1])
# 写入json
json_file <- paste(root_dir, output_dir, "journal_info.json", sep = "/")
json_obj <- read_json(json_file)
json_obj <- append(json_obj, journalinfo_obj)
write_json(json_obj, json_file)
对需要的信息进行提取。
# ! 准备----
## 清除当前环境中的所有对象
rm(list = ls())
## 设置主文件夹路径, 并设置工作目录
(root_dir <- sub("/code.+", "", rstudioapi::getSourceEditorContext()$path))
source(paste(root_dir, "code", "prepare.R", sep = "/"))
# !main----
shelfEnvironment(paste(imput_dir, sep = "/"), path = root_dir)
paper_info <- read.xlsx(list.files(pattern = "xlsx")[1])
paper_info[, 2] <- trans_journal_names(paper_info[, 2])
pjournal_names <- paper_info[, 2]
# 读取json
json_file <- paste(root_dir, output_dir, "journal_info.json", sep = "/")
json_obj <- read_json(json_file)
# compare
extract_fac <- c(
"journal_name_zh", "journal_name_en",
"出版周期", "出版文献量", "总下载次数", "总被引次数",
"(2022)复合影响因子", "(2022)综合影响因子", "database_info", "database_sum_info"
)
pjournal_matrix <- matrix(
data = "",
nrow = length(pjournal_names),
ncol = length(extract_fac),
dimnames = list(pjournal_names, extract_fac)
) %>% as.data.frame()
# get base info
for (num_row in seq_along(pjournal_names)) {
pjournal_name <- pjournal_names[num_row]
for (i in seq_along(extract_fac)) {
if (extract_fac[i] %in% names(json_obj[[pjournal_name]])) {
pjournal_matrix[num_row, extract_fac[i]] <- json_obj[[
pjournal_name
]][[extract_fac[i]]]
}
}
}
output <- cbind(paper_info, pjournal_matrix)
# get if is core
output$is_core <- str_detect(output[,"database_sum_info"], "核心|CSCD")
# write xlsx
write.xlsx(output, paste(root_dir, output_dir, "pjournal_info.xlsx", sep = "/"))
# count num
journal_matrix <- table(output["出处"]) %>%
as.data.frame()
colnames(journal_matrix) <- c("journal_name_zh", "Freq")
journal_info <- dplyr::left_join(
journal_matrix,
output[, -grep(x = colnames(output), "标题")]
) %>%
arrange(desc(Freq)) %>%
distinct(journal_name_zh, .keep_all = TRUE)
nrow(journal_info)
# write xlsx
write.xlsx(journal_info, paste(root_dir, output_dir, "journal_info.xlsx", sep = "/"))
通过浏览器自动化获取信息可以有效的减轻工作压力并增加获取信息的准确性,值得一试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。