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() | 针对<form>表单,提交表单 |
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()
网友评论