R2-006 第二次作业

dean 2018-02-12 21:40:00 阅读: 412

part1

library(RMySQL)

help(package="RMySQL") #查看RMySQL的说明文档,里面有RMySQL所有可用的方法  

#创建数据库连接 ,localhost代表本机,dbname就是上面创建的Rdatabase,用户名一般是root

# password为空(如果你没设置的话一般都是这样的)

con <- dbConnect(MySQL(),host="localhost",dbname="Rdatabase",user="root",password="")

dbSendQuery(con,'SET NAMES utf8')

#获取连接信息,查看database下所有表

#summary(con)  

#dbGetInfo(con)  

#dbListTables(con)  

#dbRemoveTable(con,"test")


#数据库连接删除函数,每个任务之前最好先清理所有的连接,调用此函数就可以

killDbConnections <- function () {

  all_cons <- dbListConnections(MySQL())

  print(all_cons)

  for(con in all_cons)

    +  dbDisconnect(con)

  print(paste(length(all_cons), " connections killed."))

}

1.png


part2


library(DBI)


library(RMySQL)


con <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")


dbSendQuery(con,'SET NAMES utf8')


library(httr)


totalNum=562


pageSize=10


totalPage=ceiling(totalNum/pageSize) 

print(totalPage)


currentPage=1


term='(cell[TA]) AND 2017[DP]'


usehistory='Y'


querykey=''


webenv=''


postSearchUrl='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi'


while(currentPage<=totalPage){

  

  retstart=(currentPage-1)*pageSize

  

  r <- POST(postSearchUrl, 

            

            body = list(

              

              db='pubmed',

              

              term=term,

              

              retmode='json',

              

              retstart=retstart,

              

              retmax=pageSize,

              

              usehistory=usehistory,

              

              rettype='uilist'

              

            )

            

  )

  

  stop_for_status(r)

  

  data=content(r, "parsed", "application/json")

  

  esearchresult=data$esearchresult

  

  querykey=esearchresult$querykey

  

  webenv=esearchresult$webenv

  

  idlist =esearchresult$idlist

  

  n = length(idlist)

  

  pmid=c()

  

  i = 1

  

  while(i<=n){

    

    pmid=c(pmid, as.character(idlist[i][1]))

    

    i = i+1

    

  }

  

  article=data.frame('pmid'=pmid)

  

  dbWriteTable(con,"article",article,append=TRUE)

  

  currentPage = currentPage + 1

  

}


dbDisconnect(con)

2.png



part3


library(RMySQL)

library(xml2)

library(httr)

killDbConnections()

con <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")

dbSendQuery(con,'SET NAMES utf8')

rs <- dbSendQuery(con, "SELECT * FROM article WHERE isdone=0")

while (!dbHasCompleted(rs)) {

  chunk <- dbFetch(rs, 10)

  pmidStr=""

  i=1

  n=nrow(chunk) #获得总行数

  while (i<=n){

    pmidStr = paste(pmidStr,chunk[i,3],sep=",") #循环将各个pmid之间用逗号连接起来

    i = i + 1

  }

  pmidStr=substr(pmidStr,2,100000) #去掉pmid第一个逗号,从第2位起,到100000位,即到末尾

  #下面就是第一次作业里面获取title和abstract

  postFetchUrl='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi'

  r2 <- POST(postFetchUrl, 

             body = list(

               db='pubmed',

               id=pmidStr,

               retmode='xml'

             )

  )

  stop_for_status(r2) #clear http status

  data2=content(r2, "parsed", "application/xml")

  article=xml_children(data2)

  #xml_length(article)为里面文章的数量

  count=length(article)

  cnt=1

  while(cnt<=count){

    title=xml_text(xml_find_first(article[cnt],".//ArticleTitle")) #找到第一个ArticleTitle节点

    abstract=xml_text(xml_find_first(article[cnt],".//AbstractText"))

    pmid=xml_text(xml_find_first(article[cnt],".//PMID"))

    #更新数据库,首先去掉title和abstract里面的单引号,单引号会导致mysql更新出现问题

    title = gsub("'","",title)

    abstract = gsub("'","",abstract)#得到新的title和abstract(没有单引号)

    #构建mysql更新语句,R语言的字符串拼接不太好,不能使用"+",也不能使用点"."

    sql=paste("UPDATE article SET title='",title,"',abstract='",abstract,"',isdone=1"," where pmid='",pmid,"'",sep="")#设置isdone字段用于标记已经处理完的

    #执行,并新开通一个mysql连接

    con2 <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")

    dbSendQuery(con2,'SET NAMES utf8')

    dbSendQuery(con2,sql)

    dbDisconnect(con2)

    cnt = cnt + 1#延迟1秒运行,因为pubmed接口说明如果1秒内并发超过3次将会被封禁IP

    Sys.sleep(1)

  }

}

3.png

第三题出错~查找百度说是定义的字符串类型问题~但是大家别人的没错呀?求教……

 
请登录后再评论
| 注册
{{item.nickname}} {{item.create_time}} {{item.floor}}楼
{{item.re_nickname}} 写于 {{item.re_time}}
切换到完整回复
科研狗 2015-2020 京ICP备16006621 科研好助手,专业的科研社交共享平台