RSelenium基本用法总结

有些数据在script标签里面的js动态脚本中,普通请求器如RCurl和httr没有权限办到(少了中介浏览器引擎来渲染这些HTML源文档。因此请求到的HTML文档是静态的,不包括HTML文档中那些重要的嵌套在script标签中的数据)

RSelenium和Rwebdriver都是通过调用Selenium Sever来模拟浏览器环境,Selenium是一个用于网页测试的Java开源软件,可以模拟浏览器的点击、滚动、滑动以及文字输入等操作。使用之前必须为计算机设置Java环境

1.RSelenium包和Rwebdriver包的下载安装

library(devtools)     
install_github(repo="Rwebdriver",username="crubba")
devtools::install_github("ropensci/RSelenium")

2.Java环境设置

理论上讲,调用Java程序安装JRE即可,但推荐安装JDK,JDK中包含JRE模块

3.selenium及浏览器驱动的下载和运行

1.下载selenium,地址http://www.seleniumhq.org/download/

2.下载浏览器驱动,需要注意浏览器的版本,如果使用chrome可参考chromedriver与chrome版本映射表

           https://blog.csdn.net/huilan_same/article/details/51896672

          Chrome驱动:http://npm.taobao.org/mirrors/chromedriver

          Firefox驱动:http://github.com/mozilla/geckodriver/releases

3.打开cmd运行selenium和浏览器驱动(如果两者不是放在Java的默认目录下,需要引用绝对路径)

java -Dwebdriver.chrome.driver="F:\...\SeleniumSever\chromedriver.exe" 
java -jar F:\...\SeleniumSever\selenium-server-standalone-3.8.1.jar

注1:在R语言调用RSelenium包和Rwebdriver包时,cmd不要关闭

注2:将下载完成的chromedriver.exe文件复制到C:\Program Files (x86)\Google\Chrome\Application路径下,并配置系统环境变量如下

C:\Program Files (x86)\Google\Chrome\Application

4.简单功能列举+常用函数

#使用RSelenium包控制浏览器主要依靠remoteDriver系列函数
remoteDriver(remoteServerAddr,port,browserName,path,version,platform,javascript,nativeEvents,serverURL,sessionInfo)
参数remoteServerAddr,表示远程服务器IP地址,默认值是本机地址,character型
参数port,表示远程服务器连接端口,numeric型
参数browserName,浏览器名称-chrome、firefox、htmlunit、internetexplorer或iphone,character型
参数path,远程服务器上命令的基本URL路径前缀,默认值是“/wd/hub”
参数version,浏览器版本character型
参数platform,浏览器运行系统,WINDOWS、XP、VISTA、MAC、LINUX或UNIX,character型
参数javascript,会话是否支持在当前页面的上下文中执行用户提供的JavaScript,logical型
参数nativeEvents,会话是否支持本地事件,logical型
参数serverURL,JSON请求发送到的远程服务器的URL,character型
参数sessionInfo,会话相关信息,list型
通常情况下,只要设置browserName就可以对浏览器进行操作,返回值是一系列函数
library(RSelenium)
remDr<-remoteDriver(browserName="chrome",remoteServerAddr="localhost",port=4444L)
#打开浏览器  
remDr$open()
#关闭浏览器  
remDr$quit()     #直接退出
remDr$close()    #close用于关闭当前会话,也可以用作关闭浏览器
#打开网页  
url<-'http://news.baidu.com/'  
remDr$navigate(url)
#关闭网页
remDr$closeWindow()
###################################################################
#定位元素
findElement(using,value)其中using可以取"xpath","css selector","id","name","tag name","class name","link text"或"partial link text",value是其相应的值
#移动鼠标
mouseMoveToLocation(x=NA_integer_,y=NA_integer_,webElement=NULL)用指定元素的偏移量移动鼠标,其中x和y是坐标值
#单击
click(buttonId=0) buttonId=0单击左键,1单击滚动条,2单击右键,单击某个元素也可以直接使用clickElement()函数

###########举例
#定位
xpath<-'//*[contains(concat( " ", @class, " " ), concat( " ", "hdline1", " " ))]//a' 
btn<-remDr$findElement(using='xpath',value=xpath)
#移动鼠标至该元素
remDr$mouseMoveToLocation(webElement=btn)
remDr$click()
btn$clickElement()  #不需要鼠标定位,直接单击元素
#################################################################
#双击+在文本框中输入数据
doubleclick(buttonId=0),用法与单击一样
sendKeysToElement(sendKeys)用于在指定元素中输入文本,sendKeys必须是list型数据,在网页输入文本的步骤为,首先找到文本框元素的位置,然后输入文本
url<-'http://www.baidu.com'
remDr$navigate(url)
#定位文本框
xpath<-'//*[(@id = "kw")]'
btn<-remDr$findElement(using='xpath',value=xpath)
#输入文本,只是输入文本(并没有进行搜索)
text<-list('学习')
btn$sendKeysToElement(text)
#输入文本并按回车
text<-list('学习',key='enter')
btn$sendKeysToElement(text)
###另一个函数sendKeysToActiveElement(sendKeys)用于在当前活动元素中输入文本,相当于先输入文本,并enter

#窗口最大化
remDr$maxWindowSize()
#截图
remDr$screenshot(display=F,useViewer=T,file=NULL) #file是截图后的存放路径,png格式
#抓取经浏览器渲染后的页面
remDr$getPageSource()
#模拟滚动条下拉过程,将整个界面加载出来,再分别提取所需信息
#执行JavaScript片段,单位拉取长度=页面剩余高度,循环拉取,每次拉取都记录新的总高度,直至总高度不在发生变化,则停止下拉
last_height = 0
repeat {
remDr$executeScript("window.scrollTo(0,document.body.scrollHeight);", list(remDr$findElement("css","body")))
Sys.sleep(2) 
new_height=remDr$executeScript("return document.body.scrollHeight", list(remDr$findElement("css","body")))
if(unlist(last_height) == unlist(new_height)) {break} else 
{last_height = new_height} 
}
#关于RSelenium的页面操作
remDr$goBack()    ##返回上一页
remDr$refresh()   ##刷新页面
webElem2<-remDr$findElement("css","body")
webElem2$sendKeysToElement(list(key="end"))   ##滚动条拉到当前可见的最底部(只加载一轮信息)
webElem2$sendKeysToElement(list(key="home"))  ##不论页面加载了多少轮,返回最顶部
#关于RSelenium的页面操作
remDr$goBack()    ##返回上一页
remDr$refresh()   ##刷新页面
webElem2<-remDr$findElement("css","body")
webElem2$sendKeysToElement(list(key="end"))   ##滚动条拉到当前可见的最底部(只加载一轮信息)
webElem2$sendKeysToElement(list(key="home"))  ##不论页面加载了多少轮,返回最顶部

 

你可能感兴趣的:(爬虫,R,RSelenium,Selenium,爬虫,R)