RSelenium 和网页抓取
RSelenium & Web Scraping
我正在尝试抓取数据,但在抓取数据时遇到了问题。我可以使用 RSelenium 浏览网站。你可以在下面找到我的代码。我想从每个下拉列表中抓取名称,以便我可以将它们存储在一个对象中并 运行 一个循环。
library(RSelenium)
library(rvest)
library(XML)
library(RCurl)
rd<-rsDriver()
remDr<-rd[["client"]]
url<-"https://kvk.icar.gov.in/facilities_list.aspx"
jsScript <- "var element = arguments[0]; return element.outerHTML;"
webpage<-read_html(url)
remDr$navigate("https://kvk.icar.gov.in/facilities_list.aspx")
remDr$refresh()
#First drop down
stateEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlState")
#webElem <- remDr$findElement("id", "ContentPlaceHolder1_ddlDistrict")
stateHTML <- remDr$executeScript(jsScript, list(stateEle))[[1]]
statedoc <- htmlParse(appHTML)
states<-doc["//option", fun = function(x) xmlGetAttr(x, "name")]
stateEle$clickElement()
stateEle$sendKeysToElement(states[[30]])
stateEle$clickElement()
#Second drop down
distEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlDistrict")
distHTML <- remDr$executeScript(jsScript, list(distEle))[[1]]
distdoc <- htmlParse(appHTML)
districts<-doc["//option", fun = function(x) xmlGetAttr(x, "value")]
distEle$clickElement()
distEle$sendKeysToElement(list(distdoc[[2]]))
distEle$clickElement()
#Third drop down
kvkEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlKvk")
appHTML <- remDr$executeScript(jsScript, list(kvkEle))[[1]]
kvkdoc <- htmlParse(appHTML)
kvk<-doc["//option", fun = function(x) xmlGetAttr(x, "value")]
kvkEle$clickElement()
kvkEle$sendKeysToElement(list(kvk[[2]]))
kvkEle$clickElement()
#submitting the values
submitEle<-remDr$findElement("id", "ContentPlaceHolder1_btnSubmit")
submitEle$clickElement()
我还想将结果抓取到数据框中。
使用您的代码,
stateEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlState")
从这里开始,如果您想获取所有值来进行循环,请使用:
library(magrittr)
stateEle$getElementText()[[1]] %>% strsplit(., '\n')
这将提供一个文本元素列表,您可以在其中进一步删除 "--Select--"
选项:
stateEle$getElementText()[[1]] %>% strsplit(., '\n') %>% unlist %>% setdiff(., '--Select--')
对所有其他 select 列表重复此操作。
我正在尝试抓取数据,但在抓取数据时遇到了问题。我可以使用 RSelenium 浏览网站。你可以在下面找到我的代码。我想从每个下拉列表中抓取名称,以便我可以将它们存储在一个对象中并 运行 一个循环。
library(RSelenium)
library(rvest)
library(XML)
library(RCurl)
rd<-rsDriver()
remDr<-rd[["client"]]
url<-"https://kvk.icar.gov.in/facilities_list.aspx"
jsScript <- "var element = arguments[0]; return element.outerHTML;"
webpage<-read_html(url)
remDr$navigate("https://kvk.icar.gov.in/facilities_list.aspx")
remDr$refresh()
#First drop down
stateEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlState")
#webElem <- remDr$findElement("id", "ContentPlaceHolder1_ddlDistrict")
stateHTML <- remDr$executeScript(jsScript, list(stateEle))[[1]]
statedoc <- htmlParse(appHTML)
states<-doc["//option", fun = function(x) xmlGetAttr(x, "name")]
stateEle$clickElement()
stateEle$sendKeysToElement(states[[30]])
stateEle$clickElement()
#Second drop down
distEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlDistrict")
distHTML <- remDr$executeScript(jsScript, list(distEle))[[1]]
distdoc <- htmlParse(appHTML)
districts<-doc["//option", fun = function(x) xmlGetAttr(x, "value")]
distEle$clickElement()
distEle$sendKeysToElement(list(distdoc[[2]]))
distEle$clickElement()
#Third drop down
kvkEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlKvk")
appHTML <- remDr$executeScript(jsScript, list(kvkEle))[[1]]
kvkdoc <- htmlParse(appHTML)
kvk<-doc["//option", fun = function(x) xmlGetAttr(x, "value")]
kvkEle$clickElement()
kvkEle$sendKeysToElement(list(kvk[[2]]))
kvkEle$clickElement()
#submitting the values
submitEle<-remDr$findElement("id", "ContentPlaceHolder1_btnSubmit")
submitEle$clickElement()
我还想将结果抓取到数据框中。
使用您的代码,
stateEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlState")
从这里开始,如果您想获取所有值来进行循环,请使用:
library(magrittr)
stateEle$getElementText()[[1]] %>% strsplit(., '\n')
这将提供一个文本元素列表,您可以在其中进一步删除 "--Select--"
选项:
stateEle$getElementText()[[1]] %>% strsplit(., '\n') %>% unlist %>% setdiff(., '--Select--')
对所有其他 select 列表重复此操作。