使用 RSelenium 通过 for 循环从 .asp 网页收集表数据

2024-01-09

我正在尝试收集印度村庄一级的人口普查数据http://www.censusindia.gov.in/Census_Data_2001/Village_Directory/View_data/Village_Profile.aspx http://www.censusindia.gov.in/Census_Data_2001/Village_Directory/View_data/Village_Profile.aspx

使用 RSelenium,我可以使用以下代码在四个下拉菜单中导航并选择不同的值:

require(RSelenium)
require(selectr)

#Setting up the proxy server
RSelenium::checkForServer()
RSelenium::startServer() # if needed
remDr <- remoteDriver$new()
remDr$open()
remDr$setImplicitWaitTimeout(3000)
remDr$navigate("http://www.censusindia.gov.in/Census_Data_2001/Village_Directory/View_data/Village_Profile.aspx")

#Finding and changing the menus
stateElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpState") 
stateElem$sendKeysToElement(list(key = "down_arrow", key = "enter"))

districtElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpDistrict") 
districtElem$sendKeysToElement(list(key = "enter"))
districtElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpDistrict") 
districtElem$sendKeysToElement(list(key = "down_arrow", key = "enter"))

subdistrictElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpSubDistrict") 
subdistrictElem$sendKeysToElement(list(key = "enter"))
subdistrictElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpSubDistrict")
subdistrictElem$sendKeysToElement(list(key = "down_arrow", key = "enter"))

villageElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpVillage") 
villageElem$sendKeysToElement(list(key = "enter"))
villageElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpVillage") 
villageElem$sendKeysToElement(list(key = "down_arrow", key = "enter"))

submitElem <- remDr$findElement(using = "name", "ctl00$Body_Content$btnSubmit") 
remDr$executeScript("arguments[0].click();", list(submitElem))

table <- readHTMLTable(remDr$getPageSource()[[1]], which=8)

更大的问题。我需要为印度的所有村庄(选定邦的井村)运行此代码。计算时间不是问题。我有一个指定的计算机库,并计划将其分解为多台机器。

但是,我需要弄清楚每个州有多少个区,每个区有多少个分区,每个分区有多少个村庄。所以我可以通过一个嵌套的 for 循环来运行它。

我想到的框架看起来像这样:

    num_states <- "code grabbing this from the options list"
    for(r in 1:length(num_states)){
      num_dist <- "code grabbing number of districts from the options list"
      stateElem_code_block[r]

      for(k in 1:length(num_dist)){
        num_subdist <- "code grabbing number of subdistricts from the options list" 
        districtElem_code_block[k]

        for(m in 1:length(num_subdist)){
         num_vill <- "code grabbing number of village from the options list" 
         subdistrictElem_code_block[m]

         for(i in 1:length(num_village)){
          villageElem_code_block[i]
          submitElem <- remDr$findElement(using = "name", "ctl00$Body_Content$btnSubmit") 
          remDr$executeScript("arguments[0].click();", list(submitElem))
          table <- readHTMLTable(remDr$getPageSource()[[1]], which=8)
          }
         tables <-rbind(tables, table) 
        }
      }
     }

对小说感到抱歉...我希望这是有道理的。任何帮助是极大的赞赏

编辑:我自己能够解决第一个问题......


首先,我将定义一个更改下拉列表的函数

changeFun <- function(value, elementName, targetName){
  changeElem <- remDr$findElement(using = "name", elementName)
  script <- paste0("arguments[0].value = '", value, "'; arguments[0].onchange();")
  remDr$executeScript(script, list(changeElem))
  targetElem <- remDr$findElement(using = "name", targetName) 
  target <- xmlParse(targetElem$getElementAttribute("outerHTML")[[1]])
  targetCodes <- sapply(querySelectorAll(target, "option"), xmlGetAttr, "value")[-1]
  target <- sapply(querySelectorAll(target, "option"), xmlValue)[-1]
  list(target, targetCodes)
}

此脚本设置下拉列表中的值并使用 JavaScript 触发 onchange 事件。这样,与站点的交互就降到了最低限度。另外,您可能想运行像 phantomJS 这样的无头浏览器,而不是 火狐浏览器RSelenium:驱动本地和远程操作系统/浏览器 http://rpubs.com/johndharrison/13885有关如何运行 phantomjs 的详细信息。

remDr <- remoteDriver$new()
remDr$open()
remDr$setImplicitWaitTimeout(3000)
remDr$navigate("http://www.censusindia.gov.in/Census_Data_2001/Village_Directory/View_data/Village_Profile.aspx")

#STATES
stateElem <- remDr$findElement(using = "name", "ctl00$Body_Content$drpState") 
states <- stateElem$getElementAttribute("outerHTML")[[1]]
stateCodes <- sapply(querySelectorAll(xmlParse(states), "option"), xmlGetAttr, "value")[-1]
states <- sapply(querySelectorAll(xmlParse(states), "option"), xmlValue)[-1]

state <- list()
for(x in seq_along(stateCodes)){
  district <- changeFun(stateCodes[[x]], "ctl00$Body_Content$drpState", "ctl00$Body_Content$drpDistrict")
  subdistrict <- lapply(district[[2]], function(y){
    subdistrict <- changeFun(y, "ctl00$Body_Content$drpDistrict", "ctl00$Body_Content$drpSubDistrict")
    village <- lapply(subdistrict[[2]], function(z){
      village <- changeFun(z, "ctl00$Body_Content$drpSubDistrict", "ctl00$Body_Content$drpVillage")
      village}
    )
    list(subdistrict, village)}
  ) 
  state[[x]] <- list(district, subdistrict)
}


#

state现在将包含所有州、地区、分区和村庄及其代码。 我只竞选x = 1,即安达曼和尼科巴群岛。作为一个例子,这里的数据是 尼科巴尔区。

> state[[1]][[2]][[2]]
[[1]]
[[1]][[1]]
[1] "Car Nicobar" "Nancowry"   

[[1]][[2]]
[1] "0001" "0002"


[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
 [1] "Arong"        "Big Lapati"   "Chuckchucha"  "IAF Camp"     "Kakana"      
 [6] "Kimois"       "Kinmai"       "Kinyuka"      "Malacca"      "Mus"         
[11] "Perka"        "Sawai"        "Small Lapati" "Tamaloo"      "Tapoiming"   
[16] "Teetop"      

[[2]][[1]][[2]]
 [1] "00036000" "00037000" "00036800" "00036300" "00036200" "00036100"
 [7] "00037200" "00036700" "00036400" "00035700" "00036500" "00035900"
[13] "00037100" "00036600" "00036900" "00035800"


[[2]][[2]]
[[2]][[2]][[1]]
  [1] "7 km Farm"                    "Akupa"                       
  [3] "Al-Hit-Touch/Balu Basti"      "Alexandera River"            
  [5] "Alhiat"                       "Alhitoth/Alhiloth"           
  [7] "Alipa/Alips"                  "Alkaipoh/Alkripoh"           
  [9] "Aloora"                       "Aloorang"                    
 [11] "Alreak"                       "Alsama"                      
 [13] "Altaful"                      "Altheak"                     
 [15] "Alukian/Alhukheck"            "Anul/Anula"                  
 [17] "Atkuna/Alkun"                 "Bahua"                       
 [19] "Banderkari/Pulu"              "Bengali"                     
 [21] "Berainak/Badnak"              "Bompoka Island"              
 [23] "Bumpal"                       "Campbell Bay"                
 [25] "Champin"                      "Chanel/Chanol"               
 [27] "Changua/Changup"              "Chaw Nallaha"                
 [29] "Chingen"                      "Chonghipoh"                  
 [31] "Chongkamong"                  "Chota Inak"                  
 [33] "Chukmachi"                    "Dairkurat"                   
 [35] "Dakhiyon (FC)"                "Danlet"                      
 [37] "Daring"                       "Dogmar River"                
 [39] "Elahi/Ilhoya"                 "Enam"                        
 [41] "Galathia River (FC)"          "Gandhi Nagar"                
 [43] "Govinda Nagar"                "Hakonhala"                   
 [45] "Halnatai/Hoinatai"            "Hin-Pou-Chi"                 
 [47] "Hindra"                       "Hinnunga"                    
 [49] "Hintona"                      "Hitlat"                      
 [51] "Hockook"                      "Hoin incl. Ikuia"            
 [53] "Hoipoh"                       "Hontona"                     
 [55] "Hutnyak"                      "In-Hig-Loi"                  
 [57] "Indira Point"                 "Inlock/Infock"               
 [59] "Inod"                         "Inroak/Chinlak"              
 [61] "Itoi"                         "Jansin"                      
 [63] "Jhoola"                       "Joginder Nagar"              
 [65] "Kakana"                       "Kalara"                      
 [67] "Kalasi"                       "Kamorta/Kalatapu"            
 [69] "Kamriak"                      "Kanahinot"                   
 [71] "Kapanga"                      "Kasintung"                   
 [73] "Katahu"                       "Katahuwa"                    
 [75] "Kavatinpeu/Karahinpoh"        "Kiyang"                      
 [77] "Knot"                         "Koe"                         
 [79] "Kokeon"                       "Kondul"                      
 [81] "Kopenheat"                    "Kuikua"                      
 [83] "Kuitasuk"                     "Kulatapangia"                
 [85] "Kumikia"                      "Kupinga"                     
 [87] "Lanuanga"                     "Lapat"                       
 [89] "Lawful"                       "Laxmi Nagar"                 
 [91] "Luxi"                         "Makhahu/Makachua"            
 [93] "Malacca"                      "Mapayala"                    
 [95] "Maru"                         "Masala Tapu"                 
 [97] "Mavatapis/Maratapia"          "Mildera"                     
 [99] "Minlana/Minlan"               "Minyuk"                      
[101] "Mohreak/Kohreakap"            "Munak incl. Ponioo/Moul"     
[103] "Mus"                          "Navy Dera"                   
[105] "Neang"                        "Neeche Tapu"                 
[107] "Not yet named (at 27.9 km)-A" "Nyicalang"                   
[109] "Olinchi/Bombay"               "Olinpon/Alhinpon"            
[111] "Ongulongho"                   "Patatiya"                    
[113] "Payak"                        "Payuha"                      
[115] "Pehayo"                       "Pilpilow"                    
[117] "Pulloullo/Puloulo"            "Pulobaha"                    
[119] "Pulobaha/Pathathifen"         "Pulobed"                     
[121] "Pulobed/Lababu"               "Pulobha/Pulobahan"           
[123] "Pulobhabi"                    "Pulokunji"                   
[125] "Pulomilo"                     "Pulopanja"                   
[127] "Pulopucca"                    "Pulotalia/Pulotohio"         
[129] "Raihion"                      "Ramzoo"                      
[131] "Ranganathan Bay"              "Reakomlong"                  
[133] "Renguang"                     "Safedbalu"                   
[135] "Safedbalu"                    "Sanaya"                      
[137] "Sastri Nagar"                 "Shompen hut"                 
[139] "Shompen Village-A"            "Shompen Village-B"           
[141] "Sonomkuwa"                    "Tahaila"                     
[143] "Tani"                         "Tapani/Tapainy"              
[145] "Tapiang"                      "Tapong incl. Kabila"         
[147] "Tavinkin/Tavakin"             "Tillang Chong Island"        
[149] "Tomae/Inmae"                  "Trinket"                     
[151] "Vijoy Nagar"                  "Vikas Nagar"                 
[153] "Vyavtapu"                     "W.B.Katchal/Hindra"          

[[2]][[2]][[2]]
  [1] "00053600" "00048500" "00043500" "00050800" "00037500" "00039800"
  [7] "00042600" "00039700" "00038000" "00037900" "00044200" "00042100"
 [13] "00041900" "00043400" "00046200" "00048300" "00041100" "00050300"
 [19] "00045700" "00038900" "00047000" "00039000" "00045000" "00054000"
 [25] "00043700" "00045400" "00046000" "00054400" "00052900" "00039500"
 [31] "00037400" "00046900" "00038400" "00050700" "00052400" "00051900"
 [37] "00045200" "00051400" "00050000" "00038100" "00053000" "00053200"
 [43] "00053900" "00041400" "00041800" "00052200" "00042800" "00043800"
 [49] "00044300" "00039300" "00047700" "00049200" "00040800" "00040500"
 [55] "00040200" "00052600" "00052800" "00048600" "00050100" "00044000"
 [61] "00044100" "00039200" "00039100" "00053500" "00047200" "00038300"
 [67] "00038800" "00046800" "00040100" "00038700" "00042200" "00051700"
 [73] "00050600" "00039900" "00042000" "00049000" "00046300" "00051800"
 [79] "00052300" "00050400" "00051500" "00047500" "00037600" "00040600"
 [85] "00040000" "00042300" "00043300" "00042700" "00054600" "00053300"
 [91] "00038200" "00048400" "00043600" "00040900" "00045300" "00046100"
 [97] "00039400" "00042400" "00048200" "00038600" "00047400" "00046600"
[103] "00042900" "00054500" "00043100" "00044600" "00053700" "00047300"
[109] "00049700" "00044900" "00040300" "00052100" "00043000" "00046500"
[115] "00050200" "00044500" "00049100" "00052700" "00048800" "00051000"
[121] "00050500" "00049400" "00052000" "00051100" "00048100" "00049900"
[127] "00052500" "00048700" "00037700" "00046700" "00054100" "00041500"
[133] "00051300" "00047600" "00038500" "00039600" "00053100" "00053800"
[139] "00051200" "00051600" "00041600" "00037300" "00041200" "00043900"
[145] "00047900" "00043200" "00041700" "00037800" "00045900" "00047800"
[151] "00053400" "00047100" "00040700" "00042500"

印度有 600,000 个村庄:O,所以最好将状态作为 for 循环。获得四个必要的代码后,您可以通过单独提交表格来获取村庄数据。例如,发布的部分表格用于获取村庄详细信息

国家: 安达曼和尼科巴群岛

区:尼科巴群岛

分区:卡尼科巴

村庄:阿荣

is

ctl00$Body_Content$btnSub...    Submit
ctl00$Body_Content$drpDis...    02
ctl00$Body_Content$drpSta...    35
ctl00$Body_Content$drpSub...    0001
ctl00$Body_Content$drpVil...    00036000

UPDATE:

出于兴趣,我在 x = 1 上使用 phantomJS 运行,这是安达曼和尼科巴群岛的状态,并稍加修改了changeFun

changeFun <- function(value, elementName, targetName){
  changeElem <- remDr$findElement(using = "name", elementName)
  script <- paste0("arguments[0].value = '", value, "'; arguments[0].onchange();")
  remDr$executeScript(script, list(changeElem))
  targetCodes <- c()
  while(length(targetCodes) == 0){
    targetElem <- remDr$findElement(using = "name", targetName) 
    target <- xmlParse(targetElem$getElementAttribute("outerHTML")[[1]])
    targetCodes <- sapply(querySelectorAll(target, "option"), xmlGetAttr, "value")[-1]
    target <- sapply(querySelectorAll(target, "option"), xmlValue)[-1]
    if(length(targetCodes) == 0){
      Sys.sleep(0.5)
    }else{
      out <- list(target, targetCodes)
    }
  }
  return(out)
}

获取数据需要 3 秒,而 Firefox 需要 43 秒才能获取相同的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 RSelenium 通过 for 循环从 .asp 网页收集表数据 的相关文章

随机推荐

  • MongoDB - 多对多关系?

    我很好奇如何构建一个具有多对多关系 可能有数万条记录的 MongoDB 假设您有一个餐厅数据库 可以跟踪大量餐厅以及所有入住过这些餐厅的人 因此 用户可能想要查找一个人并查看他们已签到的所有餐厅 而且还想查找一家餐厅并查看所有已签到的人 如
  • “react-native弹出”:无法识别的命令“弹出”

    我正在尝试为我的反应本机项目重新创建 ios 和 android 文件夹 据我所知 这是通过以下命令完成的 react native eject 但我收到错误 error Unrecognized command eject 我做错了什么吗
  • 从 ItemDataBound 事件中的转发器控件获取值

    如何在 ItemDataBound 事件中获取转发器控件的值 我写了下面的asp代码
  • 处理推文时使用 JSON 或正则表达式

    哪种方法更快 使用 JSON 解析器 python 2 6 或正则表达式来获取相关数据 由于数据量巨大 我认为使用一种方法与其他方法相比在时间上会有很大差异 假设你在问什么 我相信您会问 通过反序列化序列化 JSON 字符串或通过正则表达式
  • 返回 R 中别名系数的 VIF

    我想知道是否有人可以帮助我解决以下问题 当我在各种解释变量之间进行 VIF 分析时 会出现以下错误消息 test lt vif lm Spring Autumn Oct Nov Dec Jan Feb Mar Apr May Jun Jul
  • 重写 HashSet 的 Contains 方法

    有人能告诉我如何重写 HashSet 的 contains 方法以使用正则表达式匹配而不是仅使用 equals 吗 或者 如果不覆盖 我如何添加一个方法来使用正则表达式模式 基本上 我希望能够在包含字符串的 HashSet 上运行正则表达式
  • C# - 使用 HTMLAgilityPack 获取 JavaScript 变量值

    我目前有 2 个 JavaScript 变量 需要从中检索值 HTML 由一系列没有 id name 属性的嵌套 DIV 组成 是否可以使用 HTMLAgilityPack 从这些变量中检索数据 如果是这样 我将如何去做 如果不是需要什么
  • 如何在magento中添加密件抄送或抄送

    我不知道如何在以下编码中添加抄送或密件抄送 我尝试了密件抄送 但邮件无法发送 请有人帮忙 代码是 data array name gt username to user id gt to userid email gt email tele
  • 在 MyEclipse 中开发 Maven 战争应用程序值得吗?

    我的组织已做出上层决定 将 Maven 作为 Java 项目的标准构建工具 我的任务是帮助我们的本地团队将项目迁移到 Maven MyEclipse IDE 是正在发挥作用的核心工具之一 MyEclipse 似乎与 Maven 团队有着一段
  • 蟒蛇熊猫。日期对象由单独的列分割。

    我在Python pandas 中将日期写为 1 31 2010 为了应用线性回归 我想要 3 个单独的变量 天数 月数 年数 将 pandas 中包含日期的列分成 3 列的方法是什么 另一个问题是将天数相同但分为 3 组 1 10 11
  • 当测试一起运行时,所有测试中使用的外部库模拟补丁不起作用

    我正在使用 Python 的模拟库和单元测试 我正在为一个类编写单元测试 该类在其方法之一中使用外部库的函数 根据情况 该函数返回不同的值 假设我想测试 A 类 from external library import function f
  • Ubuntu 服务器上的 PHP PDO 到 MS SQL Server

    我正在尝试使用 PDO 连接到 MS SQL Server 我尝试过使用这个 db new PDO sqlsrv server server database databaseName username password 我读到不再支持 s
  • 如何将 jQuery 对象转换为字符串?

    如何将 jQuery 对象转换为字符串 我假设您需要完整的 HTML 字符串 如果是这样的话 类似这样的事情就可以解决问题 div append item of interest clone html 这有更深入的解释here http j
  • 为Excel饼图添加数据标签

    我正在绘制带有一些数据的饼图 private void DrawFractionChart Excel Worksheet activeSheet Excel ChartObjects xlCharts Excel Range xRange
  • java android - 如何将资源中的html设置为TextView?

    是否有可能将 html 从 res raw 加载到 TextView 中 我知道我可以使用 WebView 但是该死的透明度并不总是有效 并非在每个设备上 myTextView setText Html fromHtml readTxt 此
  • 开源的基于规则的模式匹配/信息提取框架? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在购买一个开源框架 用于编写自然语言语法规则 以通过注释进行模式匹配 您可以将其视为正则表达式 但
  • Docker Compose 复制一个文件夹,但不复制另一个文件夹

    我还在学习 Docker 这种情况让我很困惑 Docker 会将一个文件夹复制到映像 容器 但它会跳过另一个文件夹 我不明白为什么 Docker 桌面 4 X Ubuntu Linux 容器 NET 5 0 Blazor 应用程序 因此在应
  • 使用 Java 对所有字段进行 MongoDB 文本索引

    我想在 MongoDB 中的所有字段上创建文本索引 我知道可以这样做 db collection ensureIndex text name TextIndex 但我想在我的 Java 程序中创建这个索引 我尝试过这个 collection
  • 在 ICE 上指定最大高度的 Flexbox 子溢出父级

    我有一个父元素 其中包含两个子元素 这两个子元素使用 Flexbox 显示在彼此的顶部 该父元素的 max height 属性设置为某个值 因此 只要内容很短 父元素就应该保持很小 并且随着内容的增长 父元素也随之增长 直到达到其最大高度
  • 使用 RSelenium 通过 for 循环从 .asp 网页收集表数据

    我正在尝试收集印度村庄一级的人口普查数据http www censusindia gov in Census Data 2001 Village Directory View data Village Profile aspx http w