前边大家碰到了一个网络爬虫难点:网络爬虫最怕碰到JavaScript依靠性的动态性网页页面,挑选了在R里边配备selenium网络爬虫自然环境,只是是安裝和配备好啦在R里边应用selenium网络爬虫,开启一个JavaScript操纵的动态性网页页面只是是网络爬虫的刚开始,接下去必须跟这一网页页面开展各种各样的互动。最先释放一些学习培训连接:
tutorials/rselenium_tutorial/ 2019/01/22/tutorial-web-scraping-rselenium/ 查询源码假如你应用Google访问器自主开启网页页面:plasmid/template/
会发觉它的源码里边压根就沒有各种各样的下一页等按键,所有被掩藏在了以下所显示的JavaScript脚本制作里边:
script type="text/javascript" document.write(' script src="../../js/common/base.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8" \/script '); document.write(' script src="../../js/util/jump.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8" \/script '); document.write(' script src="../../mon_methods.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8" \/script '); document.write(' script src="../../js/common/parts.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8" \/script '); document.write(' script src="../../js/plasmid/plasmid_list.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8" \/script '); document.write(' script src="../../js/plasmid/plasmid_list_mobile.js?v='+new Date().getTime()+'" type="text/javascript" charset="utf-8" \/script '); /script
可是这种JavaScript脚本制作是网页页面开发设计者其实不会公布的,因此大家没法去查询他们里边的涵数。
可是可使用selenium网络爬虫开启的网页页面,编码以下:
library(RSelenium) library(rvest) library(stringr) ################启用R包######################################### library(rvest) # 以便read_html涵数 library(RSelenium) # 以便应用JavaScript开展网页页面爬取 ###############联接Server并开启访问器############################ remDr - remoteDriver(remoteServerAddr = "127.0.0.1" , port = 4444 , browserName = "chrome")#联接Server remDr$open() #开启访问器 remDr$navigate("plasmid/template/") #开启网页页面查询新的源码
这一情况下查询源码里边就会有一些內容了,必须关键关心的便是“下一页”,必须对HTML有一点认知能力,了解 id,class,css,name的差别:
div id="pages" div id="layui-laypage-1" a href="javascript:;" data-page="0" 上一页 /a span em /em em 1 /em /span a href="javascript:;" data-page="2" 2 /a span … /span a href="javascript:;" title="" data-page="3396" 3396 /a a href="javascript:;" data-page="2" 下一页 /a /div /div寻找下一页而且传送电脑鼠标点一下实际操作
编码十分简易,几句话便可以了:
# a href="javascript:;" data-page="2" 下一页 /a /div /div # 分析上边的html源码 webElem - remDr$findElement(using = 'class', value = "layui-laypage-next") webElem$clickElement()
运作R编码的同时,你要能看到访问器的转变。
我的要求是取得所有links这一网页页面每一次只是是更新一部分plasmid出去,因此必须先后循环系统3396次,取得所有plasmid信息内容,获得其超级链接接url。
编码以下:
# Extracting links links=remDr$getPageSource()[[1]] % % read_html() % % html_nodes("a") % % html_attr("href") links while(i 3396){ i=i+1 webElem - remDr$findElement(using = 'class', value = "layui-laypage-next") webElem$clickElement() lks=remDr$getPageSource()[[1]] % % read_html() % % html_nodes("a") % % html_attr("href") print(lks) links=c(links,lks) links=unique(links) links save(links,file = 'plasmid_detail_links.Rdata')
自然了,取得的links自身,还需开展二次浏览,再次摘取里边的信息内容。
第二次浏览实际每一个网页页面前边的links自变量里边存储了所有的plasmid的详细介绍网页页面的url,接下去就循环系统浏览每一个plasmid网页页面获得信息内容,编码以下:
load(file = 'plasmid_detail_links.Rdata') links ',links) links=links[kp] length(links) remDr - remoteDriver(remoteServerAddr = "127.0.0.1" , port = 4444 , browserName = "chrome")#联接Server remDr$open() #开启访问器 for (i in 1:5000) { print(i) url=links[i] remDr$navigate(url) #开启网页页面 Sys.sleep(0.5) print(remDr$getCurrentUrl()) htmls=remDr$getPageSource()[[1]] # div bodys - htmls % % read_html() % % html_nodes('.panel-body') c1 - bodys[[1]] % % html_text() c2 - bodys[[2]] % % html_text() c3 - bodys[[3]] % % html_text() c1=gsub('\t','',c1);c1=gsub('\n','',c1); c2=gsub('\t','',c2);c2=gsub('\n','',c2); c3=gsub('\t','',c3);c3=gsub('\n','',c3); # id="plasmidName" plasmidName - htmls % % read_html() % % html_nodes('#plasmidName') % % html_text() # id="plasmid_identification" plasmid_identification - htmls % % read_html() % % html_nodes('#plasmid_identification') % % html_text() info=data.frame(plasmidName,plasmid_identification,c1,c2,c3) rm(htmls) ,file = 'info1.txt', col.names = F,row.names = F, append = T)更繁杂的应用RSelenium+rvest抓取动态性或需登陆网页页面实例教程
参照:
p/e5b252c90e0d qq_/article/details/ p/1fc6a6817160其他网络爬虫基本专业知识:
xpath搜索连接点:txwen/ 有关GET和POST的趣味的表述:p/ RCurl分析:kMD8d5R/article/details/ html文档及http基础知识: post/get文件格式化工厂具://weixu22/article/details/ rvest仿真模拟点一下网页页面: