通过模拟浏览器方法爬取pubmed数据

########################################################

-------------------------------------------------------

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

-------------------------------------------------------

#########################################################

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容