selenium网络爬虫实际操作网页页面(实战演练篇)

2021-02-04 05:44 admin
生信小白团 留言板留言参加探讨,或是关心同名的手机微信微信公众号biotrainee

前边大家碰到了一个网络爬虫难点:网络爬虫最怕碰到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仿真模拟点一下网页页面: