RSelenium中的循环和报废 [英] Looping in RSelenium and Scraping

查看:48
本文介绍了RSelenium中的循环和报废的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用RSelenium从网站上抓取数据.我可以逐个浏览下拉菜单,但是当我循环运行它们时会出错.

I'm trying to scrape data from website using RSelenium. I am able to navigate through drop downs individually but when I run them in loop I get error.

也选择了下拉菜单中的所有值之后,我想在表格中存储设施名称和联系方式.到目前为止我还无法做到.

Also after selecting all the values in the drop down I want to store the name of the facility and contact details in a table. Which I'm not able to do so far.

rm(list=ls())
setwd("D:\\work_codes\\kvk\\data")
getwd()

library(RSelenium)
library(rvest)
library(XML)
library(RCurl)
library(magrittr)
library(stringr)

rd<-rsDriver()
remDr<-rd[["client"]]

remDr$navigate("https://kvk.icar.gov.in/facilities_list.aspx")

remDr$refresh()

stateEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlState")
states<-stateEle$getElementText()[[1]] %>% strsplit(., '\\n') %>% unlist %>% setdiff(., ' --Select--')
states<-str_trim(states, 'left')
stateEle$clickElement()

for (i in 1:length(states)) {
  remDr$refresh()
  stateEle$clickElement()
  stateEle$sendKeysToElement(list(states[i]))
  stateEle$clickElement()
  districts<-NULL
  distEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlDistrict")
  districts<-distEle$getElementText()[[1]] %>% strsplit(., '\\n') %>% unlist %>% setdiff(., ' --Select--')
  districts<-str_trim(districts, 'left')
  for (j in 1:length(districts)) {
    distEle$clickElement()
    distEle$sendKeysToElement(list(districts[j]))
    distEle$clickElement()
    kvk<-NULL
    kvkEle<-remDr$findElement("id", "ContentPlaceHolder1_ddlKvk")
    kvk<-kvkEle$getElementText()[[1]] %>% strsplit(., '\\n') %>% unlist %>% setdiff(., ' --Select--')
    kvk<-str_trim(kvk, 'left')
    for (k in 1:length(kvk)) {
      kvkEle$clickElement()
      kvkEle$sendKeysToElement(list(kvk[[1]]))
      kvkEle$clickElement()
      submitEle<-remDr$findElement("id", "ContentPlaceHolder1_btnSubmit")
      submitEle$clickElement()
      doc<-remDr$findElement('id', 'ContentPlaceHolder1_rptfacility_f_name_1')
      doc$getElementText()
      doc$clickElement()
      remDr$findElement('class name','Contact details:')
    }
  }
}

推荐答案

library(rvest)
url<-"https://kvk.icar.gov.in/facilities_list.aspx"

page<-html_session(url)
form<-html_form(page)[[1]]

states<-html_nodes(page,css="#ContentPlaceHolder1_ddlState > option") %>% html_attr("value")
states<-states[-1]
states_name<-html_nodes(page,css="#ContentPlaceHolder1_ddlState > option") %>% html_text()
states_name<-states_name[-1]

final_df<-0
#### STATES LOOP ####
for(i in 1:length(states)){
  filled_form<-set_values(form,
                          "ctl00$ContentPlaceHolder1$ddlState"=states[i])
  page1<-submit_form(page,filled_form)
  district<-html_nodes(page1,css="#ContentPlaceHolder1_ddlDistrict > option") %>% html_attr("value")
  district<-district[-1]
  district_name<-html_nodes(page1,css="#ContentPlaceHolder1_ddlDistrict > option") %>% html_text()
  district_name<-district_name[-1]

  #### DISTRICT LOOP ####
  for(j in 1:length(district)){
    filled_form1<-set_values(html_form(page1)[[1]],
                            "ctl00$ContentPlaceHolder1$ddlState"=states[i],
                            "ctl00$ContentPlaceHolder1$ddlDistrict"=district[j])
    page2<-submit_form(page1,filled_form1)
    kvk<-html_nodes(page2,css="#ContentPlaceHolder1_ddlKvk > option") %>% html_attr("value")
    kvk<-kvk[-1]
    kvk_name<-html_nodes(page2,css="#ContentPlaceHolder1_ddlKvk > option") %>% html_text()
    kvk_name<-kvk_name[-1]

    #### KVK LOOP ####
    for(k in 1:length(kvk)){
      filled_form2<-set_values(html_form(page2)[[1]],
                               "ctl00$ContentPlaceHolder1$ddlState"=states[i],
                               "ctl00$ContentPlaceHolder1$ddlDistrict"=district[j],
                               "ctl00$ContentPlaceHolder1$ddlKvk"=kvk[k])
      page3<-submit_form(page2,filled_form2)
      contact_text<-gsub("[\r\n]","",html_nodes(page3,css=".panel-body") %>% html_text())
      if(length(contact_text) == 0){contact_text=""}
      df<-data.frame(cbind(states_name[i],district_name[j],kvk[k],contact_text))
      names(df)<-c("STATE","DISTRICT","KVK","CONTACT_TEXT")
      final_df[i*j*k] = list(df)
      ### WAITTIME TO AVOID HTTP 500 error - So the server is not overloaded
      sleep(5)
    }
  }
}


output_df<-data.table::rbindlist(final_df,fill=TRUE)

# After this perform some string operations to extract the exact information required from the CONTACT_TEXT variable

以上答案未使用任何RSelenium软件包,我认为这比RSelenium更值得信赖.

The above answer does not use any RSelenium package and I think this is more trustworthy than RSelenium.

这篇关于RSelenium中的循环和报废的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆