参见:https://docs.ropensci.org/RSelenium/articles/basics.html

关于基本的配置,参见:

03. R 获取动态网站

除了自行下载java 文件外,也可以通过docker 容器安装:

  1. docker run -d -p 4445:4444 selenium/standalone-firefox:2.53.1

总的来说,就把RSelenium 的操作想像成真实人类的操作。只不过,它比我们更有耐心,也更灵巧(你让它访问一千个网页,也是洒洒水啦~)。

先启动一下:

  1. library(RSelenium)
  2. remDr <- remoteDriver(
  3. remoteServerAddr = "localhost",
  4. port = 4444L,
  5. browserName = "chrome"
  6. )

1. 基本浏览

有以下函数:

  • remDr$open() 打开浏览器
  • remDr$getStatus() 查看状态
  • remDr$navigate(“http://www.google.com/ncr”)) 打开选定网页
  • remDr$goBack()/goForward() 上一页/下一页
  • remDr$getCurrentUrl() 返回当前网址
  • remDr$refresh() 刷新页面

2. 选择页面中的元素

以HTML 界面为例,网页信息存储的格式,一般是HTML、XHTML、XML…

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>My First Heading</h1>
  5. <p>My first paragraph.</p>
  6. </body>
  7. </html>

其实我们并不需要掌握具体的语法逻辑,现在的浏览器检查功能,可以帮助我们非常好的获取相关的内容信息:

04. 结构化学习R动态爬虫-RSelenium - 图1

对应的参数选项:

04. 结构化学习R动态爬虫-RSelenium - 图2

比如下面这段标签:

  1. <input spellcheck="false" dir="ltr" style="border: medium none; padding: 0px; margin: 0px; height: auto; width: 100%; background: transparent url(&quot;data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D&quot;) repeat scroll 0% 0%; position: absolute; z-index: 6; left: 0px; outline: medium none;" aria-autocomplete="both" role="combobox" aria-haspopup="false" class="gsfi" id="lst-ib" maxlength="2048" name="q" autocomplete="off" title="Search" value="" aria-label="Search" type="text">

以XPath 为例:

  1. webElem <- remDr$findElement(using = "xpath", "//input[@id = 'lst-ib']")

接下来,我们可以通过该标签,获得其其他的属性:

  1. webElem$getElementAttribute("name")
  2. ## [[1]]
  3. ## [1] "q"
  • webElem$compareElements(webElem2)

比较两个标签元素是否相同。

  • webElems$getElementText()

3. 与界面交互

输入文本

比如我们通过findElement 函数获得了搜索框元素,接着就可以通过sendKeysToElement 函数以列表的格式向其输入内容:

  1. remDr$navigate("http://www.baidu.com/")
  2. remDr$getCurrentUrl()
  3. webElem <- remDr$findElement(using = "xpath", '//*[@id="kw"]')
  4. webElem$highlightElement("sad")
  5. webElem$sendKeysToElement(list("R Cran"))

04. 结构化学习R动态爬虫-RSelenium - 图3

如果我们需要确认搜索内容的话:

  1. # utf-8 format
  2. webElem$sendKeysToElement(list("R Cran", "\uE007"))
  3. # human word format
  4. webElem$sendKeysToElement(list("R Cran", key = "enter"))

鼠标点击

  • sebElem$clickElement

04. 结构化学习R动态爬虫-RSelenium - 图4

获得坐标与移动鼠标

  • getElementLocation 获得元素所在坐标:
  1. > webElem[[1]]$getElementLocation()[c("x","y")]
  2. $x
  3. [1] 402.2656
  4. $y
  5. [1] 535
  • 移动+点击
  1. remDr$mouseMoveToLocation(webElement = webElems[[1]]) # move mouse to the element we selected
  2. remDr$click(2) # 2 indicates click the right mouse button

获得浏览器窗口信息

  • 获得浏览器handle 信息:

04. 结构化学习R动态爬虫-RSelenium - 图5

  • 获得标题remDr$getTitle()

4. 批量操作

  • findElements 批量获取全部的元素
  1. webElem <- remDr$findElements(using = "partial link text", '京')

其返回一个列表,列表中的每一个元素,就是findElement 所有匹配的标签对象。

我们可以使用循环函数处理它们,比如高亮:

  1. sapply(webElem, function(x){x$highlightElement(1)})

5. 高级技巧:使用javascript

y1s1,如果真的要花式玩转网页,还真得要点JS 功夫。

主要是通过remDr$executeScript 执行。

作者举了两个栗子。

  • 隐藏图片

首先检查goople 主图标有无隐藏。

04. 结构化学习R动态爬虫-RSelenium - 图6

接着是隐藏它:

  1. script <- "document.getElementById('hplogo').hidden = true;
  2. return document.getElementById('hplogo').hidden;"
  3. remDr$executeScript(script, args = list())
  4. ## [[1]]
  5. ## [1] TRUE

获得元素,类似remDr$findElement:

04. 结构化学习R动态爬虫-RSelenium - 图7

  • 以及异步(async)操作:

04. 结构化学习R动态爬虫-RSelenium - 图8

其他骚操作

  • webElem$highlightElement() (通过remDr$findElement)

说明书写的是,会在网页中高亮出标签,可实际操作并未发生任何反应。

西卡西!

非常骚的是,当我在括号中随便打了串数字之后:

  1. remDr$navigate("http://www.baidu.com/")
  2. remDr$getCurrentUrl()
  3. webElem <- remDr$findElement(using = "xpath", '//*[@id="form"]/span[1]')
  4. webElem$highlightElement("sad")

04. 结构化学习R动态爬虫-RSelenium - 图9

别说,还挺好看~

  • 截图

设置全尺寸+ 截图:

  1. remDr$maxWindowSize()
  2. remDr$screenshot(display = TRUE)
  • 不完全匹配查找
  1. remDr$navigate("http://www.baidu.com/")
  2. remDr$getCurrentUrl()
  3. webElem <- remDr$findElement(using = "partial link text", 'Cookie')
  4. webElem$highlightElement("sad")

04. 结构化学习R动态爬虫-RSelenium - 图10

这些文字匹配不就得了?这还要学html 语法干啥?