peerJ期刊探索

开放获取的期刊--PeerJ由Peter Binfield(曾在PLOS ONE任职)和Jason Hoyt(曾为Mendeley的首席科学家)于2012年6月份正式创立。

编辑阵容。其实一个期刊的论文质量,很大程度上取决于编辑的阵容。PeerJ目前的1619位编辑(截止至2018/02)队伍,的确堪称豪华,其中亦不乏诸多诺贝尔得主。

公开审稿过程。我认为这一点是除了较低的发表费用外,PeerJ胜过PLOS ONE的另一大举措。PeerJ官网介绍超过80%的作者选择公开审稿过程,即读者可以浏览下载该论文从投稿、修改、编辑意见、审者意见和作者回复信等所有有关审稿过程的内容。

使用爬虫批量解析发表的所有文章

其发表的所有文章的url很有规律

https://peerj.com/articles/1/
https://peerj.com/articles/2
····························
https://peerj.com/articles/4400
https://peerj.com/articles/4401(404 error)

首先看投稿,审稿,发表时间,的html源代码

<dl class="article-dates">
<dt>Published</dt>
<dd><time itemprop="datePublished">2013-02-12</time></dd>
<dt>Accepted</dt>
<dd><time data-itemprop="dateAccepted">2012-11-21</time></dd>
<dt>Received</dt>
<dd><time itemprop="dateCreated">2012-11-13</time></dd>
</dl>

然后看看文章所属领域及关键词的html源代码

<dl class="article-subjects">
<dt>Subject Areas</dt>
<dd>
<a class="subject" itemprop="about" href="/subjects/?filter=Biochemistry">Biochemistry</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Bioinformatics">Bioinformatics</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Biophysics">Biophysics</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Computational%20Biology">Computational Biology</a>
</dd>
<dt>Keywords</dt>
<dd>
<span class="kwd" itemprop="keywords">Protein structure</span>, <span class="kwd" itemprop="keywords">Protein loop</span>, <span class="kwd" itemprop="keywords">Protein structure prediction</span>, <span class="kwd" itemprop="keywords">Protein loop structure</span>, <span class="kwd" itemprop="keywords">Protein loop structure prediction</span>, <span class="kwd" itemprop="keywords">Protein</span>, <span class="kwd" itemprop="keywords">Loop stretch</span>, <span class="kwd" itemprop="keywords">Loop span</span>
</dd>
</dl>

还可以看看文章的作者列表,发现实在是太复杂了,懒得解析。就看看编辑列表的html源代码

<dl class="article-editors">
<dt>Academic Editor</dt>
<dd itemprop="editor" itemscope="itemscope" itemtype="http://schema.org/Person"><a itemprop="url" href="editor-1" class="contrib" data-jats-contrib-type="editor"><span class="name" itemprop="name"><span class="given-names" itemprop="givenName">Scotty</span> <span class="surname" itemprop="familyName">Butcher</span></span></a></dd>
</dl>

另外值得注意的URL,比如:

## 下面的url可以拿到所有发表文章的审稿细节
https://peerj.com/articles/89/reviews/ 这个就选择不公开review细节。
https://peerj.com/articles/1/reviews/  这个就公开了.
## 下面的url根据规律可以拿到所有文章的编辑
https://peerj.com/articles/4400/editor-1
https://peerj.com/articles/1/editor-1

投稿时间及接收时间可以看杂志社效率,领域分析可以保证自己没投错,关键词可以做词云。

首先一一访问每篇文章获取关键信息

看懂下面代码的前提是 了解基础R语言语法,以及 rvest的用法,了解html的DOM基本结构,以及提前查看了自己需要的信息情况。

library(rvest) 
peerData <- lapply(1:4000,function(i){
  url=paste('https://peerj.com/articles/',i,'/',sep="")
  cat(paste0('Now processing the number ',i,' articel.\n'))
  fit<-try(web <- read_html(url),silent=TRUE)
  if('try-error' %in% class(fit)){
    cat('HTTP error 404\n')
  }else{
    date <- web %>% html_nodes('dl.article-dates dd time') %>% html_text()
    editor_ <- web %>% html_nodes('dl.article-editors dd a span') %>% html_text()
    subject_ <- web %>% html_nodes('dl.article-subjects dd a') %>% html_text()
    editor = editor_[1]
    subject=paste(subject_,collapse=":")
    return(c(i,date,editor,subject))
  }
})
save(peerData,file = 'peerData-1-4000.Rdata')

这个代码写的有点粗糙,4000篇文章访问还是很慢的,约耗时3小时,可以加入并行的语法。

然后进行简单统计并且绘图

load(file = 'peerData-1-4000.Rdata')
dim(peerData)
## [1] 3383    6
colnames(peerData)=c('id','Pdate','Adate','Rdate','editor','subject')
peerData=as.data.frame(peerData) 
head(peerData)
##   id      Pdate      Adate      Rdate               editor
## 1  1 2013-02-12 2012-11-21 2012-11-13 Walter de Azevedo Jr
## 2  2 2013-02-12 2012-12-01 2012-11-13        Emanuele Paci
## 3  3 2013-02-12 2012-12-03 2012-11-13         Mark Mattson
## 4  4 2013-02-19 2012-12-04 2012-11-13           Dee Carter
## 5  5 2013-02-12 2012-12-05 2012-11-14     Annalisa Pastore
## 6  6 2013-02-12 2012-12-08 2012-11-13           Zhihong Xu
##                                                                          subject
## 1                   Biochemistry:Bioinformatics:Biophysics:Computational Biology
## 2 Biochemistry:Bioinformatics:Biophysics:Computational Biology:Molecular Biology
## 3                                                                   Neuroscience
## 4                                        Microbiology:Molecular Biology:Mycology
## 5                                                        Biochemistry:Biophysics
## 6                                                                   Soil Science
tail(peerData)
##        id      Pdate      Adate      Rdate                     editor
## 3378 3400 2017-05-31 2017-05-10 2017-01-20        Marion R<U+00F6>der
## 3379 3401 2017-05-30 2017-05-10 2016-12-19                Erika Braga
## 3380 3402 2017-05-30 2017-05-10 2016-10-17           Kenneth De Baets
## 3381 3403 2017-06-20 2017-05-10 2016-11-16           Hans-Dieter Sues
## 3382 3404 2017-05-30 2017-05-11 2017-03-17               Lydia Hopper
## 3383 3405 2017-06-27 2017-05-11 2016-10-17 Antonio Palaz<U+00F3>n-Bru
##                                                            subject
## 3378                         Bioinformatics:Genomics:Plant Science
## 3379                                 Ecology:Genetics:Parasitology
## 3380                               Entomology:Paleontology:Zoology
## 3381                             Evolutionary Studies:Paleontology
## 3382                          Animal Behavior:Conservation Biology
## 3383 Diabetes and Endocrinology:Evidence Based Medicine:Nephrology
editors <- as.data.frame(sort(table(peerData$editor),decreasing = T))
dim(editors)
## [1] 682   2
head(editors)
##                                  Var1 Freq
## 1 Mar<U+00ED>a <U+00C1>ngeles Esteban   93
## 2                      Jafri Abdullah   60
## 3                        James Reimer   56
## 4                       Robert Toonen   49
## 5                       Donald Kramer   42
## 6                        Dezene Huber   35
freqs=as.data.frame(sort(table(editors$Freq),decreasing = T))
dim(freqs)
## [1] 38  2
head(freqs)
##   Var1 Freq
## 1    1  203
## 2    2  134
## 3    3   82
## 4    4   53
## 5    5   41
## 6    6   34
library(ggplot2)
ggplot(freqs,aes(Var1,Freq)) + geom_bar(stat = "identity") + 
  labs(x = "number of papers edited by each editor", y = "number of editors") +
  theme(panel.background=element_rect(fill='transparent')) + 
  ylim(0,200) + 
  geom_text(mapping = aes(label = Freq),size=4,vjust=-1,color = "black")

img

可以看到,截止至 2017-06-27 ,已经有 682 个编辑已经干活了。在干活的这些编辑里面有少数几个特别勤奋,居然接近100篇了。

分析一下审稿速度

pd=as.Date(as.character(peerData$Pdate))
ad=as.Date(as.character(peerData$Adate))
rd=as.Date(as.character(peerData$Rdate))
plot(pd~rd)

img

# 可以看到只有极少数文章投稿后很久才得到被接受。
durDays=as.numeric(ad-rd)
fivenum(durDays)
## [1] -21  60  87 125 858
# 大部分文章在两三个月期间被审核完毕。
boxplot(durDays)

img

## 搞笑的是有两个文章还没投稿就被接受了,应该是数据库录入错误。
peerData[ad-rd < 1,]
##        id      Pdate      Adate      Rdate        editor
## 1102 1108 2015-08-04 2015-06-26 2015-06-26  Andrew Farke
## 1548 1554 2016-01-14 2015-12-11  2016-01-1 Mike Thompson
##                                                   subject
## 1102                                Paleontology:Taxonomy
## 1548 Clinical Trials:Health Policy:Translational Medicine

最后看一下领域分布

这里需要考虑是否把属于多个领域的同一篇文章的权重降低,比如一篇文章属于5个领域,那么每个领域就只分到了0.2个文章。 我这里就先探索一下不降低权重的方法。

为了保证绘图的美观,这里只展现排名前20的领域。

subjects <- as.data.frame(sort(table(strsplit(paste0(peerData$subject,collapse = ':'),':')[[1]]),decreasing = T))
subjects <- head(subjects,20)
head(subjects)
##                   Var1 Freq
## 1              Ecology  793
## 2              Zoology  516
## 3 Evolutionary Studies  452
## 4       Marine Biology  417
## 5         Biodiversity  414
## 6 Conservation Biology  337
library(ggplot2)
ggplot(subjects,aes(reorder(Var1,as.numeric(Freq)),Freq)) + 
  geom_bar(stat = "identity") + coord_flip() + 
  labs(x = "", y = "",title="Proportion of Subjects") +
  theme(panel.background=element_rect(fill='transparent')) + 
  geom_text(mapping = aes(label = Freq),size=3,hjust=1,color = "white")

img

写在最后

分析期刊其实是一件很有趣的事情,尤其是对初学者来说,可以学的非常多。

比如还可以在爬取数据的时候解析收集每篇文章被引用情况,这样就可以计算杂志的影响因子,然后所有的分析,都是可以根据年来区分开来,看看有没有时间尺度上的变化规律。而且可以爬取关键词和摘要来进行词云分析及可视化。当然了,开放性期刊全文都是公开的,也已爬取全文进行各种高级分析。这个时候,代码往往不是瓶颈。

这里面的代码都是可以复现的,欢迎大家深入挖掘和研究,跟我交流,我的邮箱是 jmzeng1314@163.com 期待你们的来信。

原文发布于微信公众号 - 生信技能树(biotrainee)

原文发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DevOps时代的专栏

「台湾精益老专家」实践一日 Sprint 的个人看板

? ? 实践一日 Sprint 的个人看板(一个人的敏捷开发) 【待办事项】 你的生活应该包含一大堆任务(或许你喜欢用工作、事务或是想做的事,任务这二个字只是...

3559
来自专栏牛客网

蚂蚁金服一面面经

本来以为自己的简历不可能跳过笔试,所以最近在刷笔试题,没有怎么复习安卓,在加之有些紧张,凉凉,呜呜呜~~~~~~~ 阿里不给通知,毫无预兆的打过来电话面试,面试...

3456
来自专栏编程微刊

【程序员交友】祈澈姑娘:假装文艺与代码齐飞的前端妹子

1453
来自专栏java一日一条

JAVA版孔乙己

听人家背地里谈论,孔乙己原来也是计算机硕士,但终究是因为打撸啊撸时间太长,忘了新生代和老年代的区别,去IT类培训学校做了一名学生

592
来自专栏程序人生

为什么我们要阅读源码?

程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些...

2968
来自专栏纯洁的微笑

提问的智慧

915
来自专栏WOLFRAM

Wolfram Language 快速编程入门

1252
来自专栏GopherCoder

专栏:FROM 爬虫 TO 数据科学专栏:FROM 爬虫 TO 数据科学0123

1717
来自专栏程序人生

走进 racket(lisp) 的世界

上周追着看了个大牛的好几篇文章,发现一个叫racket的语言出镜率颇高 —— 这已经是我十月来第三次从各种大牛的文章中接触这个词。就如「惊天魔盗团」里那个被催眠...

3513
来自专栏程序员互动联盟

学编程需要多高的机器配置?

疑惑一 学编程需要多高的机器配置? 很多准备学习编程的小伙伴开始下的决心很大,一定要买个牛一些的电脑,其实对于初学者来说个人觉得意义不是很大,要求电脑配置很高的...

3295

扫描关注云+社区