【源码参考】第二期二阶段任务1——R语言读取Pubmed接口获得初步数据

真·科研狗 2018-01-18 20:50:51 阅读: 1353
library(httr)
baseUrl="https://eutils.ncbi.nlm.nih.gov/"
pubmedAction=list(
  base="entrez/eutils/index.fcgi",
  search="entrez/eutils/esearch.fcgi", #搜索接口
  fetch="entrez/eutils/efetch.fcgi", #获取数据接口
  summary="entrez/eutils/esummary.fcgi" #获取数据接口(fetch可返回多种数据格式)
)
#搜索文章的参数
searchArticleParam=list(
  retstart=0, #起始位置
  retmax=20, #每次取的数量
  usehistory='Y',#是否使用历史搜索
  querykey='',
  webenv='',
  term='(cell[TA]) AND 2017[DP]',#提交pubmed的词, 
  total_num=0, #总记录
  total_page=1, #总页数
  page_size=20, #每页数目
  current_page=1 #当前所在页数
)
postSearchUrl=paste(baseUrl,pubmedAction$search,sep="") #拼接搜索地址
r <- POST(postSearchUrl, 
          body = list(
            db='pubmed',
            term=searchArticleParam$term,
            retmode='json',
            retstart=searchArticleParam$retstart,
            retmax=searchArticleParam$retmax,
            usehistory=searchArticleParam$usehistory,
            rettype='uilist'
          )
)

stop_for_status(r) #清除http状态字符串
data=content(r, "parsed", "application/json") 
#data里面存储了所有数据
esearchresult=data$esearchresult
# $count=562,$retmax=20, $retstart=0,$querykey=1, $webenv=NCID_1_30290513_130.14.18.34_9001_1515165012_617859421_0MetA0_S_MegaStore_F_1
count = esearchresult$count
print(count)



#获得title和abstract
#这里使用了上面搜索返回的querkey,webnv,可以加快速度。下面的POST中可以不加上这参数
searchArticleParam$total_num=esearchresult$count
searchArticleParam$querykey=esearchresult$querykey
searchArticleParam$webenv=esearchresult$webenv

pubmedidStr="29275861,29275860"; #多个pubmedid之间用“,”连接
postFetchUrl=paste(baseUrl,pubmedAction$fetch,sep="")
r2 <- POST(postFetchUrl, 
          body = list(
            db='pubmed',
            id=pubmedidStr,
            retmode='xml', #返回xml格式的,这个接口不支持json格式
            usehistory=searchArticleParam$usehistory,
            querykey=searchArticleParam$querykey,
            webenv=searchArticleParam$webenv
          )
)

stop_for_status(r2)

library(xml2)
data2=content(r2, "parsed", "application/xml")
article=xml_children(data2)
#xml_length(article)为里面文章的数量
count=length(article)
cnt=1
while(cnt<=count){ #循环将title和abstract输出
  title=xml_find_first(article[cnt],".//ArticleTitle") #找到第一个ArticleTitle节点
  abstract=xml_find_first(article[cnt],".//AbstractText")
  print(xml_text(title))
  print(xml_text(abstract))
  cnt = cnt + 1
}
#上面提供了两个pubmedid,因此将会打印出两个title和abstract


 
邀请讨论

附件

{{f.title}} 大小 {{f.file_size}} 下载 {{f.count_download}} 金币 {{f.count_gold}}
{{item.nick_name}} 受邀请回答 {{item.create_time}}
{{item.refer_comment.nick_name}} {{item.refer_comment.create_time}}

附件

{{f.title}} 大小 {{f.file_size}} 下载 {{f.count_download}} 金币 {{f.count_gold}}
切换到完整回复 发送回复
赞({{item.count_zan}}) 踩({{item.count_cai}}) 删除 回复 关闭
科研狗©2015-2024 科研好助手,京ICP备20005780号-1 建议意见

服务热线

178 0020 3020

微信服务号