########################################################
-------------------------------------------------------
Topic:Pubmed爬虫
Author:
Date:Sat Mar 07 22:18:33 2020
Mail:
-------------------------------------------------------
#########################################################
-------------------------------------------------------
Function1:模拟浏览器进行ncbi访问
-------------------------------------------------------
getNCBIsession<-function(){
library(rvest)
library(xml2)
library(stringr)
url<-"http://www.baidu.com"#注意:此处的链接中不能用https,不然一律失败!
session<-html_session(url)
form<-html_form(session)[[1]]
form<-set_values(form,wd="NCBI")
Sys.sleep(10)
session<-submit_form(session,form)
session<-follow_link(session,"NCBI")
print(session_history(session))#注:此时的url是https,貌似是可以继续运行的 https://www.ncbi.nlm.nih.gov/
return(session)
}
-------------------------------------------------------
Function2:模拟浏览器获取进入pubmed页面
-------------------------------------------------------
getpubmedsession<-function(session,keyword){
session<-session
keyword<-keyword
form<-html_form(session)[[1]]
form<-set_values(form,term=keyword)
intersession<-submit_form(session,form)
pubmedsession<-follow_link(intersession,"PubMed")
print(pubmedsession)
session=pubmedsession
web<-read_html(session)
pagenum<-html_node(web,xpath = '//h3[@class="page"][1]/input')
pagenum<-html_attr(pagenum,"last")
pagenum<-as.numeric(pagenum)
print(pagenum)
return(list(session=session,pagenum=pagenum))
}
-------------------------------------------------------
Function:获取pumed网页中的标题等信息
-------------------------------------------------------
getpubmedinfo<-function(session){
session=session
info<-list(
title<-'//div[@id="maincontent"]/div//div[@class="rprt"]/div[2]/p/a[contains(@href,"pubmed")][1]',
author<-'//div[@id="maincontent"]/div//div[@class="rprt"]/div[2]//p[@class="desc"]',
journal<-'//div[@id="maincontent"]/div//div[@class="rprt"]/div[2]//p[@class="details"]/span[@class="jrnl"]',
detail<-'//div[@id="maincontent"]/div//div[@class="rprt"]/div[2]//p[@class="details"]',
pubmedid<-'//div[@id="maincontent"]/div//div[@class="rprt"]//dl'
)
node<-lapply(info,function(x){x=html_nodes(session,xpath = x);return(x)})
node<-sapply(node,html_text)
node<-data.frame(title=node[,1],journal=node[,3],author=node[,2],pumedid=node[,5],detail=node[,4])
return(node)
}
-------------------------------------------------------
Function:汇总
-------------------------------------------------------
getpubmedinformation<-function(keyword){
session<-getNCBIsession()
session<-getpubmedsession(session,keyword)
table<-getpubmedinfo(session[[1]])
return(table)
}
table<-getpubmedinformation("heart")
#########################################################
-------------------------------------------------------
本爬虫使用rvest中的html_session、html_form、set_values、submit_form、follow_link等函数模拟浏览器查询信息
之后通过read_html,html_nodes,html_text等函数进行节点集获取、节点获取及文本提取过程
缺点:1、获得的网页无法进行翻页,无法获取摘要信息(其网页结构中摘要和翻页貌似是由代码控制,不是简单的url)
2、速度较慢,因为百度网站限制爬虫的频率,所以只能间隔10s爬取,不过可以直接从www.ncbi.nlm.nih.gov/进入。
注意:1、https不能使用html_session读取,会出现读取错误但不会报错!
2、read_nodes可以读取read_html的结果,也可以直接读取session!
3、本节参考链接
https://blog.csdn.net/Joyliness/article/details/78722317
https://blog.csdn.net/weixu22/article/details/79237512
-------------------------------------------------------
#########################################################