R科研作图学习小组

http://group.keyangou.com/RGraph
组长: 管理员:
  • 访问次数:22648
  • 小组等级:9
  • 话题:593
  • 回答:39
  • 签到:408
  • 小组排名:
  • 【源码参考】第二期二阶段任务1——R语言读取Pubmed接口获得初步数据

    真·科研狗 发布于:2018.01.18
    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


     
    0条评论 267浏览 邀请回答
    沙发空缺中~

    小组告示

    科研狗 2012-2016 京ICP备16006621 科研好助手,专业的科研社交共享平台