R语言动态网页数据爬取用法连载NO.02
selenium是一个开源的软件套件。selenium通过浏览器控制与网页进行交互,这样我们可以操作实时DOM树(浏览器窗口中视觉显示的方式)。
selenium可以控制浏览器实现文本输入、点击、滚动、滑动的操作。
使用selenium之前需要初始化selenium java server,server负责浏览器的启动与关闭。
使用Rselenium/Rwebdriver模拟浏览器操作抓取数据:
在Rstudio中通过selenium api打开一个新的firefox窗口:
remDr <- remoteDriver(browserName ="firefox")
system("java -jar \"D:/selenium-server-standalone-3.141.59.jar\"",wait = FALSE)
remDr$open()
关于Rwebdriver下载失败或者无法下载的问题,这里给出解决方案为:
首先你需要下载Rtools工具并安装,其次下载包不用install.packages,而是install_github,直接从github下载所需包,下载这个作者的install_github("crubba/Rwebdriver"),即可完美解决
library(Rwebdriver)
#打开浏览器之前先要启动selenium server
system("java -jar \"E:/selenium-server-standalone-3.141.59.jar\"",wait = FALSE)
#root为selenium java server的地址(默认地址如下),把firefox传递给参数browser是告诉服务器生成一个firefox浏览器窗口
start_session(root="http://localhost:4444/wd/hub/",browser="firefox")
Rwebdriver包中 | |||
star_session | 创建浏览器会话 | page_forward | 向前翻一个页面 |
quit_session | 关闭会话,退出浏览器 | page_refresh | 刷新当前页面 |
status | 可查询服务器当前状态 | page_source | 接收HTML源代码 |
active_sessions | 检索活跃会话中的信息 | page_title | 接受网页的标题字符串 |
post.url | 打开新的网址 | window_handle | 返回活跃窗口的句柄 |
get.url | 获取当前网页网址 | window_handles | 返回当前会话的所有窗口句柄 |
element_find | 通过by方法和value值查找元素 | window_change | 把焦点改到带有handle句柄的窗口 |
element_xpath_find | 查找对应path字符串value的元素 | window_close | 关闭带有handle句柄的窗口 |
element_ptext_find | 查找对应文本字符串value的元素 | get_window_size | 返回当前窗口大小的向量 |
element_css_find | 查找对应css选择器字符串value的元素 | post_window_size | 为handle窗口发布新的窗口大小size |
element_click(id,time,button) | 点击id元素 | get.window_position | 返回带有handle句柄的窗口的x、y坐标 |
element_clear | 清空id元素的文本域中输入的值 | post_window_position | 改变带有handle句柄窗口的坐标 |
page_back | 向后返回/退一个页面 | key | 生成键盘输入的term值 |
Rselenium包中 | |||
remoteDriver | 使用JsonWireProtocol与selenium服务器通信,建立连接 | getCurrentUrl | 获取当前网页网址 |
open | 打开浏览器 | getPageSource | 获取网页源码 |
navigate | 跳转至指定网页 | clickElement | 点击元素 |
findElement | 查找元素 | 更新中 |
#给定需要跳转的网址并前往
url <- 'https://www.baidu.com/'
remDr$navigate(url)
#进行指定内容搜索
# 定位文本框,可以用selectorgadget直接获取相应网页输入框的xpath
xpath <- '//*[@id="kw"]'
#通过findelement查找相应的元素
btn <- remDr$findElement(using = 'xpath', value = xpath)
# 输入文本并按回车
text <- list('leebelovedCSDN', key = 'enter')
btn$sendKeysToElement(text)
post.url(url="https://www.baidu.com/")
btn_id=element_xpath_find(value="//*[@id="kw"]")
#文本搜索后续补充
获取当前搜索结果的网页网址:
btn$getCurrentUrl()
spyder_url<-btn$getCurrentUrl()[[1]]
#用RCurl包对网页进行解析
lee_url<-getURL(spyder_url,httpheader=mheader,debugfunction=dg$update,verbose=TRUE)
lee_analysis<-htmlParse(lee_url,encoding ="UTF-8")
#获取搜索结果页面的信息名称、网址
article_name<-xpathSApply(lee_analysis,"//*/div/h3[@class='t']",xmlValue)
article_link<-xpathSApply(lee_analysis,"//*/h3[@class='t']/a",xmlAttrs,'href')
art_link<-article_link[2,]
############
#或者直接用html_source<-remDr$getPageSource()[[1]]直接得到DOM树,然后进一步解析、查找
art_item<-html_source%>% read_html() %>% xml_find_all("//*/h3[@class='t']/a")
art_link<-art_item %>%xml_attr("href")
#模拟点击下一页
remDr$findElement('xpath','//div[@id="page"]/a[last()]')$clickElement()
分享百科-松子