首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何查找符合标准的投稿目标

如何查找符合标准的投稿目标

原创
作者头像
叶子Tenney
发布2023-04-01 14:11:26
发布2023-04-01 14:11:26
1.1K0
举报

引言

发表论文一般需要三步,写,投,改。好不容易定好了题,好不容易算完了数据,好不容易改完了稿,却不知道如何选择最适合自己的期刊,实在有一些可惜。因此,对本领域发文情况做一次检索是非常必要的。

效果展示

用Excel展示检索结果的期刊名,发文频次,期刊信息等。

期刊信息
期刊信息
论文数据
论文数据

过程

文献检索

SinoMed 由中国医学科学院医学信息研究所/图书馆开发研制。其涵盖资源丰富,能全面、快速反映国内外生物医学领域研究的新进展,功能强大,是集 检索、统计分析、免费获取、全文传递服务 于一体的生物医学中外文整合文献服务系统。

今天我们就用SinoMed进行相关领域文献检索(http://www.sinomed.ac.cn/index.jsp):

SinoMed高级检索界面
SinoMed高级检索界面

本次以( "肿瘤"[常用字段:智能] OR "癌"[常用字段:智能]) AND "生物信息学"[常用字段:智能] AND "网络药理学"[常用字段:智能]为例.

SinoMed检索词构建
SinoMed检索词构建

检索结果可见有250篇文献,其中207篇为核心期刊文献。使用结果输出功能获得所有文献的论文标题和出处情况。

SinoMed检索结果及信息获取选项
SinoMed检索结果及信息获取选项

结果展示:

输出文件处理后结果
输出文件处理后结果

期刊消息获取

本地主要流程由RSelenium完成, 同样的事情也可以用python+Selenium完成, 效果一致.

首先在工作目录中新建code文件夹并创建prepare.R以创建工作环境.

代码语言:txt
复制
# !准备
# 清除当前环境中的除了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网页, 这里使用的是火狐浏览器.

代码语言:text
复制
# ! 准备----
## 清除当前环境中的所有对象
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")
代码语言:text
复制
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()

自动导航到所需要的网页并使用搜索框进行搜索(循环内):

代码语言:text
复制
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"的信息,然后如果比对和期刊名一样就点击进入。

代码语言:text
复制
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并获取信息。

代码语言:text
复制
    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文件以便之后利用。将搜索过程和整理过程分开的好处在于之后可以任意调整所需要输出的数据格式,不需要再次获取数据本身。

代码语言:text
复制
    # 将列表名和值拆分为列表的名称和值,并用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)

期刊信息整理

对需要的信息进行提取。

代码语言:text
复制
# ! 准备----
## 清除当前环境中的所有对象
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 = "/"))

结论

通过浏览器自动化获取信息可以有效的减轻工作压力并增加获取信息的准确性,值得一试。

引用

  1. Package ‘RSelenium’ - Document
  2. Selenium 浏览器自动化项目 | Selenium

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 效果展示
  • 过程
    • 文献检索
    • 期刊消息获取
    • 期刊信息整理
  • 结论
  • 引用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档