29-RSelenium包使用方法总结

Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手)。也就是说 Selenium 2 是 Selenium 和 WebDriver 两个项目的合并,即 Selenium 2 兼容 Selenium,它既支持 Selenium API 也支持 WebDriver API。

1、安装RSelenium包

> library(devtools)
> install_github("ropensci/RSelenium")

2、Java环境设置

理论上讲,调用Java程序安装JRE即可,但推荐安装JDK,JDK中包含JRE模块。安装完成后一般会自动配置系统环境,如果没有,就手动配置:

单击“计算机-属性-高级系统设置”,单击“环境变量”。在“系统变量”栏下单击“新建”,创建新的系统环境变量。

(1)新建->变量名"JAVA_HOME",变量值"C:\Program Files\Java\jdk1.8.0_131"(即JDK的安装路径)
(2)编辑->变量名"Path",在原变量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
(3)新建->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”
安装完成后,cmd进入命令行,执行java -version能看到正确版本:

C:\Users\Admin>java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

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

1.下载selenium,地址:http://www.seleniumhq.org/download/
2.下载浏览器驱动,我使用的Firefox驱动:http://github.com/mozilla/geckodriver/releases
下载后解压放到Firefox的安装目录:C:\Program Files\Mozilla Firefox,并且在windows的环境变量中添加该路径。

4、打开cmd运行selenium,使用期间cmd不要关闭

> system("java -jar \"C:/Users/Admin/Documents/R/win-library/selenium-server-standalone-3.141.59.jar\"",wait = FALSE)
Result: [1] 0

或者打开cmd运行,爬取期间不要关闭:

> java -jar C:/Users/Admin/Documents/R/win-library/selenium-server-standalone-3.141.59.jar

5、RSelenium包常用函数

5.1 remoteDriver()函数及常用方法

函数 作用说明
remoteDriver(browserName = "firefox") 建立Firefox remoteDriver对象
1. 打开、浏览与关闭:
open() 打开浏览器
getPageSource() 获取网页源码
navigate() 跳转至指定网页
close() 关闭当前session
quit() 删除session并关闭浏览器
2. 获取状态信息:
getStatus() 获取Selenium server的状态
getCurrentUrl() 获取当前网页网址
getTitle() 获取当前页面的标题
getWindowHandles() 获取所有页面在Selenium中的window handle
getPageSource() 获取当前页面的源代码
3. 发送鼠标与键盘操作:
mouseMoveToLocation() 将鼠标移动至某一位置,参数x, y代表移动到相对现在鼠标位置的(x,y)距离的位置,参数webElement代表移至某一页面元素的正中位置。一般使用webElement参数更方便
click(buttontId = 0) 单击鼠标(buttonId = 0代表左键,1代表中间建,2代表右键)
doubleclick(buttonId = 0) 双击鼠标
clickElement() 点击元素
sendKeysToActiveElement(sendKeys) 在被激活的页面元素(一般为刚刚被点击的元素)中输入一系列文本或键盘操作。输入内容,必须是list,如果是键盘操作,则前面要注明key=。例如:remDr$sendKeysToActiveElement(list("数据分析", key="enter"))
4. 抓取页面元素(webElement)
findElement(using=…,value=…) 抓取单个元素。例如:remDr$findElement(using = "css", value = "#kw")。using代表定位方法:"xpath", "css", "id", "name", "tag name", "class name", "link text", "partial link text"; value代表要搜索的值
findElements(using=…,value=…) 抓取多个元素
5. 页面窗口操作
refresh() 刷新页面
screenshot() 截屏,如果display=FALSE, file非NULL,则将截屏保存至file指定路径。
goBack() 后退到上一页
goForward() 前进,与后退对应
maxWindowSize() 最大化当前窗口
closeWindow() 关闭当前窗口(但session还是活跃状态)
switchToWindow() 切换窗口,参数可以输入window handle
6. 插入JavaScript脚本来操作页面
executeScript() 插入同步js,参数sript即js脚本,args如果不需要特殊设定时 = 1:2即可)。例如:页面拉到最下面的js执行方式:remDr$executeScript("window.scrollTo(0,document.body.scrollHeight)", args = 1:2)
executeAsyncScipt() 插入异步js

5.2 webElement()函数及常用方法

函数 作用说明
webElem <- remDr$findElement(using =…, value = …) 抓取并创建页面元素
1. 获取元素信息
describeElement() 获取元素描述信息
getElemntText() 获取内部文本(获取数据的主要方法)
getElementAttribute(attrName) 获取元素属性(可用于爬取元素连接等)
isElementDisplayed() 元素是否被展示
isElementSelected() 元素是否被选中
compareElement(otherElem) 与另一元素对比,测试是否为同一元素
2. 发送鼠标与键盘操作:
clearElement() 针对文本输入框,清除内容
clickElement() 单击元素
highlightElement() 高亮闪烁元素,主要用于确认定位的元素是否正确
sendKeysToElement() 用法与remoteDriver函数中的sendKeysToActiveElement(sendKeys)方法相同
submitElement() 针对
表单,提交表单
setElementAttribute() *效用函数,设定元素属性
3. 抓取子页面元素:
findChildElement() 如果当前页面元素下还有子元素,则可以用此方法抓取单个子元素,用法与remDr$findElement()相同
findChildElements() 抓取多个子元素

5.1 打开浏览器

使用RSelenium包控制浏览器主要依靠remoteDriver系列函数,通常情况下,只要设置browserName就可以对浏览器进行操作:

> remoteDriver( 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型
> library(pacman)
> p_load(RSelenium,rvest)
> 
> # 连接并打开Firefox
> remDr <- remoteDriver(
+   browserName = "firefox",
+   remoteServerAddr = "localhost",
+   port = 4444L
+ )
> remDr$open(silent = T)

5.2 打开网页

> url <- "https://www.zhihu.com/search?type=content&q=%E5%8F%A3%E7%BD%A9%E5%A4%84%E7%90%86&utm_content=search_preset"
> 
> # 打开url
> remDr$navigate(url)
> 
> # 此时可配合rvest包一起使用
> # p_load(rvest)
> 
> # 获取当前搜索结果的网站源码
> # page <- remDr$getPageSource()[[1]]
> # webpage <- read_html(page)

5.3 定位元素

> # 定位到搜索框
> input <- remDr$findElement(using = "xpath",'//*[@id="Popover2-toggle"]')
> 
> # 单击输入框
> input$clickElement()

5.4 输入关键字并回车

> kw <- "新冠肺炎"
> 
> # 清除输入框原有内容
> input$clearElement()
> 
> # 填充文本并单击确定
> input$sendKeysToElement(list(kw,key="enter"))

5.5 窗口最大化

> remDr$maxWindowSize()

5.6 截图

截图使用screenshot(display = FALSE, useViewer = TRUE, file = NULL)函数,其中file是截图后存放的路径,截图是PNG格式

> remDr$screenshot(file = "./zhihu.png")

5.7 避免反爬,操作后休息一会儿

> # 单击后休息2S
> Sys.sleep(2)

5.8 高亮闪烁元素,确认定位元素是否正确

> input$highlightElement()

5.9 保存数据(基本语法)

data <- data.frame(t(sapply(temdata,c)),stringsAsFactors=F)
cilnames(data) <- c("A","B","C")
if(!file.exists("output)) dir.create("output")
write.csv(data,paste0("output/",kw,"_data.csv"),row.names=F)

5.10 关闭或退出浏览器

> # 直接退出浏览器
> remDr$quit()

> # 关闭当前会话,也可以用作关闭浏览器
> remDr$close() 

> # 关闭当前网页窗口
> remDr$closeWindow()

你可能感兴趣的:(29-RSelenium包使用方法总结)