library(RSelenium)
library(stringr)
setwd("E:\\rwork\\Rselenium")
######## 初始化浏览器####
<- remoteDriver(
remDr browserName = "chrome", # 浏览器可以自己设置firefox、chrome、phantomjs(要配置)
remoteServerAddr = "localhost",
port = 4444L) # 默认情况下,Selenium Server侦听端口为4444
$open() # 打开浏览器
remDr
# remDr$getStatus() ## 使用该status方法查询远程服务器的状态。
="https://www.baidu.com/"
url$navigate(url) # navigate方法打开网页,url一定要完整
remDr## remDr$getCurrentUrl() # 获取当前页面的url
###########################进行搜索关键词
##### 按属性--属性值搜索 ,可以是css,xpath ,id ,属性等 对应值
<- remDr$findElement(using = 'css', "#kw") # 找到这个元素--进行搜索关键词
webElem $sendKeysToElement(list("京东",key="enter"))
webElem#### 获取当前页面的所有标题,每个链接的标题都包含在<h3 class = "t">标签中。我们将h3首先访问标题
#### 注意 findElements和 findElement方法是获取一个或者多个的区别
<- remDr$findElements(using = 'css', "h3.t")
webElems <- unlist(lapply(webElems, function(x){x$getElementText()})) #
resHeaders
resHeaders
######################## 鼠标点击事件
<-remDr$findElement(using = "css","#w-f80518 > div > h2 > a.rujtl6l-header-title")# 找到相应元素,直接点击
webElem$clickElement()
webElem##### 方法二:
### webElem=webElems[[min(which(resHeaders ==resHeaders[1]))]]# 根据返回的标题标签去重以后,找到相应位置点击
### webElem$clickElement()
######################### 在京东首页进行关键词搜索
###########窗口页面跳转
$getCurrentUrl()# 可以看出当前页面还是百度的页面,并没有跳转到京东页面
remDr$getCurrentWindowHandle()# 查看当前属于哪个窗口页面
remDr$getTitle()# 当前窗口页面的标题
remDr$getWindowHandles() # 获取当前浏览器所有的窗口页面
remDr## 现在进行页面跳转
<- remDr$getCurrentWindowHandle() # 当前窗口
currWin <- unlist(remDr$getWindowHandles()) # 所有窗口,这里只有两个
allWins <- allWins[!allWins %in% currWin[[1]]] # 排除当前窗口,获取其他窗口
otherWindow $switchToWindow(otherWindow)# 窗口跳转函数,若其他窗口有多个,需要指定一个
remDr$getCurrentUrl()
remDr$getTitle()# 跳转成功
remDr###########跳转成功后,进行京东关键词搜索
<- remDr$findElement(using = 'id', "key")
webElem $sendKeysToElement(list("笔记本电脑",key="enter"))
webElem
################### 选电脑有很多条件--现对条件进行限制
# #### 电脑贵重,选择京东自营
## 方法一:---选择元素
<- remDr$findElement(using = 'css', "#J_feature > ul > li:nth-child(1) > a")#找到这个京东自营元素--点击即可
webElem $clickElement()# 点击这元素
webElem## 方法二: 效果同上,---JavaScript脚本
# 可以看见 "京东自营"这个html元素标签里面有onclick="searchlog(1,0,0,43)"属性,<a data-field="wtype" data-val="1" class="selected" href="javascript:;" onclick="searchlog(1,0,0,43)"><i></i>京东物流</a>,对JavaScript不熟悉,操作不成功。
# remDr$executeScript(script = "searchlog(1,0,0,43)",args = list("dummy"))
# #### 选择其他条件---同上
######################## 页面拉到最下面 --JavaScript脚本, 因为在爬取数据的时候,当页面拉到最下面的时候,才有新数据产生
<- "window.scrollTo(0,document.body.scrollHeight)" # 页面拉到最下面,
scripts # document.body.scrollHeight是表示body标签最大可以滚动到的坐标,window.scrollTo(x,y),里面为坐标
$executeScript(script = scripts,args = list("dummy"))
remDrSys.sleep(3)
# ####################### # 页面拉到最上面---JavaScript
# scripts <- "window.scrollTo(0,0)" # 页面拉到最上面
# remDr$executeScript(script = scripts,args = list("dummy"))
# Sys.sleep(3)
######################## 页面拉到指定元素位置---javascript----这里可以循环两次
## 参考:http://www.w3school.com.cn/jsref/dom_obj_document.asp
# scripts <- 'window.scrollTo(0,document.getElementById("J_goodsList").scrollHeight)'
# remDr$executeScript(script = scripts,args = list("dummy"))
# Sys.sleep(3)
##################### 模拟点击下一页---css
# nextBtn <- remDr$findElement(using="css",value = "#J_bottomPage > span.p-num > a:nth-child(7)")
# nextBtn$clickElement()
#################### 模拟点击下一页 --JavaScript
=str_c("SEARCH.page(",i, ",true)") ## 可用str_c()字符串拼接而成
nextpage$executeScript(nextpage,args = list("dummy"))
remDr
############################ 此时可以获取当前页面的源代码,并提取相应的标题
$maxWindowSize()# 窗口最大化--有时要
remDr# webpage=remDr$getPageSource()[[1]][1] #获取当前页面的源代码
### 保存为本地文件
# con=file("test1.html",encoding = "utf-8")
# writeLines(webpage1,con)
# close(con)
###
######################### 结合rvest包操作提取 商品信息
library(rvest)
library(stringr)
=function(){
xinxi_page# 提取当前页面的源代码
=read_html(remDr$getPageSource()[[1]][1])
webpage# 提取商品价格
<- webpage %>% html_nodes("#J_goodsList .p-price") %>% html_text() %>% str_trim()
price # 提取商品的简介信息 ,若class属性有多个值时,只用一个即可
<- webpage %>% html_nodes("#J_goodsList .p-name") %>% html_text() %>% str_trim()
xinxi # 提取商品的商店信息
<- webpage %>% html_nodes("#J_goodsList .p-shop") %>% html_text() %>% str_trim()
shop if(identical(length(price),length(xinxi),length(shop))){
=data.frame(xinxi,price,shop)
dfelse {
}print("这一页提取有问题:")
print(remDr$getCurrentUrl()[[1]])
}
}$close()# 关闭浏览
remDr## 只需循环页面 提取信息,保存数据即可
完整代码
rm(list = ls())
gc()
library(RSelenium)
library(stringr)
setwd("E:\\rwork\\Rselenium")
######## 初始化浏览器####
<- remoteDriver(
remDr browserName = "chrome", # 浏览器可以自己设置firefox、chrome、phantomjs(要配置)
remoteServerAddr = "localhost",
port = 4444L) # 默认情况下,Selenium Server侦听端口为4444
$open() # 打开浏览器
remDr
="https://www.jd.com/?cu=true&utm_source=haosou-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_haosoupinzhuan&utm_term=0a875d61c5fe47d8bc48679132932d23_0_8f7391a4de7c48dc92723934bc4fd73d"
url$navigate(url) #直接打开京东
remDrSys.sleep(3)
$maxWindowSize()
remDrSys.sleep(3)
关键词搜索以及选择筛选条件
###########跳转成功后,进行京东关键词搜索
<- remDr$findElement(using = 'id', "key")
webElem $sendKeysToElement(list("笔记本电脑",key="enter"))
webElemSys.sleep(3)
################### 选电脑有很多条件--现对条件进行限制
# #### 电脑贵重,选择京东自营
## 方法一:---选择元素
<- remDr$findElement(using = 'css', "#J_feature > ul > li:nth-child(1) > a")#找到这个京东自营元素--点击即可
webElem $clickElement()# 点击这元素
webElemSys.sleep(3)
提取信息
library(rvest)
library(stringr)
library(data.table)
library(readr)
=function(){
xinxi_page# 提取当前页面的源代码
=read_html(remDr$getPageSource()[[1]][1])
webpage# 提取商品价格
<- webpage %>% html_nodes("#J_goodsList .p-price") %>% html_text() %>% str_trim()
price # 提取商品的简介信息 ,若class属性有多个值时,只用一个即可
<- webpage %>% html_nodes("#J_goodsList .p-name") %>% html_text() %>% str_trim()
xinxi # 提取商品的商店信息
<- webpage %>% html_nodes("#J_goodsList .p-shop") %>% html_text() %>% str_trim()
shop
<- webpage %>% html_nodes("#J_goodsList .p-name a") %>% html_attr("href")
link =str_c("https:",link)
link_finally
if(identical(length(price),length(xinxi),length(shop),length(link))){
=data.frame(xinxi,price,shop,link,link_finally)
dfreturn(df)
else {
}print("这一页提取有问题:")
print(remDr$getCurrentUrl()[[1]])
return(NULL)
}
}
=function(n,file="tiannao.csv"){# n代表页数
page_operationfor(i in 1:n) {
########页面拉到最下面 --JavaScript脚本
<- "window.scrollTo(0,document.body.scrollHeight)" # 页面拉到最下面,
scripts # document.body.scrollHeight是表示body标签最大可以滚动到的坐标,window.scrollTo(x,y),里面为坐标
$executeScript(script = scripts,args = list("dummy"))
remDrSys.sleep(3)
############ 提取商品信息
=data.frame()
dff=xinxi_page()
dffwrite_excel_csv(dff,file,append = TRUE)# 使用过fwrite(),和系统自带的write.csv()以及readr包的write_csv()都乱码
Sys.sleep(3)
#################### 模拟点击下一页 --JavaScript
=2*i+1
ii=str_c("SEARCH.page(",ii, ",true)") ##
nextpage$executeScript(nextpage,args = list("dummy"))
remDrSys.sleep(3)
Sys.sleep(3)
}
}
提取多少页
page_operation(20,"diannao2.csv")
$close()# 关闭浏览 remDr