29-RSelenium包使用方法总结

作者: wonphen | 来源:发表于2020-01-31 16:44 被阅读0次

    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()
    

    相关文章

      网友评论

        本文标题:29-RSelenium包使用方法总结

        本文链接:https://www.haomeiwen.com/subject/kzvgthtx.html