Tuesday, June 9, 2020

Extracting information from a dynamic webpage with RSelenium - II


From the experience of working with RSelenium for extracting information for the last two cases and case-1, the workflow for extracting information for all cases is:
(i) Create a text file of codes for identifying cases from the MOHS webpage.
(ii) Read-in the text file into R.
(iii) Create a vector of values for xpath locators using the imported case codes of (ii)
(iv) Create a list object into which the case information will be appeneded.
(v) Access the information for case-151 and 150 and append them first into the list.
(vi) Loop through all cases except case-151 and 150, and extract their information and populate the list of (iv), and it is done.

Create a text file of codes for cases

The page source of COVID-19 Contact Tracing and Reporting webpage is viewed with the Chrome browser and saved to disk. This file is opened with Notepad++ and column of codes was extracted and saved into a csv file with one column and column name = “ccode”.

Read caseCode csv file

xcc <- read.csv("caseCode.txt",encoding = "UTF-8")
There were 50 or more warnings (use warnings() to see the first 50)
str(xcc)
'data.frame':   142 obs. of  1 variable:
 $ ccode: chr  "10137" "10135" "10131" "10130" ...
head(xcc)
 
 
ccode
<chr>
110137
210135
310131
410130
510129
610128
tail(xcc)
 
 
ccode
<chr>
1378381
1384655
1396229
140817
1415037
142528

Create a vector of values for xpath locators

From my last post, the syntax for the location of case-1 was:
case_1 <- rD$findElement(using = 'xpath', "//*[@value = '528']")
So the vector of values for the xpath could be created as:
xps <- list("//*[@value = '", xcc$ccode, "']")
tmp0 <- do.call(paste0, xps)
tmp <- tmp0[-(1:2)]
head(tmp)
[1] "//*[@value = '10131']" "//*[@value = '10130']" "//*[@value = '10129']"
[4] "//*[@value = '10128']" "//*[@value = '10122']" "//*[@value = '10120']"
tail(tmp)
[1] "//*[@value = '8381']" "//*[@value = '4655']" "//*[@value = '6229']"
[4] "//*[@value = '817']"  "//*[@value = '5037']" "//*[@value = '528']" 

Retrieve information on case-151 and 150 and populate the list

RSelenium is started and Chrome browser will be used.
# Load the Library
library(RSelenium)
# start the server and browser(you can use other browsers here)
rD <- remoteDriver(remoteServerAddr = "localhost",
                      port = 4445L,
                      browserName = "chrome")
rD$open()
[1] "Connecting to remote server"
$acceptInsecureCerts
[1] FALSE

$browserName
[1] "chrome"

$browserVersion
[1] "81.0.4044.138"

$chrome
$chrome$chromedriverVersion
[1] "81.0.4044.138 (8c6c7ba89cc9453625af54f11fd83179e23450fa-refs/branch-heads/4044@{#999})"

$chrome$userDataDir
[1] "/tmp/.com.google.Chrome.C6kmZb"


$`goog:chromeOptions`
$`goog:chromeOptions`$debuggerAddress
[1] "localhost:41905"


$networkConnectionEnabled
[1] FALSE

$pageLoadStrategy
[1] "normal"

$platformName
[1] "linux"

$proxy
named list()

$setWindowRect
[1] TRUE

$strictFileInteractability
[1] FALSE

$timeouts
$timeouts$implicit
[1] 0

$timeouts$pageLoad
[1] 300000

$timeouts$script
[1] 30000


$unhandledPromptBehavior
[1] "dismiss and notify"

$`webauthn:virtualAuthenticators`
[1] TRUE

$webdriver.remote.sessionid
[1] "cf7eeac18a2643abc1143b414cc7e2ee"

$id
[1] "cf7eeac18a2643abc1143b414cc7e2ee"
# navigate to URL for MOHS contact tracing and reporting
rD$navigate("https://mohs.gov.mm/page/8509")
An empty list for storing the information on cases is created and populated first with the last two cases.
cseTexts <- c()

cse151 <- rD$findElement(using="css selector", ".nav-tabs > li:nth-child(1) > a:nth-child(1)")
cse151$clickElement()
t151 <- rD$findElement(using="css selector", "#Post_10137")
cseTexts <- append(cseTexts,t151$getElementText())
#cat(cseTexts[[1]])

cse150 <- rD$findElement(using="css selector", ".nav-tabs > li:nth-child(2) > a:nth-child(1)")
cse150$clickElement()
t150 <- rD$findElement(using="css selector", "#Post_10135")
cseTexts <- append(cseTexts,t150$getElementText())
#cat(cseTexts[[2]])

Retrieving information for all cases except case-151 and 150

To try retrieving information for other cases, I have to locate the “View More” tab, and click on it to open the select case dropdown list.
# find element view more
csey <- rD$findElement(using="css selector", "#recentcase li:nth-child(3) a")
# click view more and "select the case box" is opened
csey$clickElement()
# after clicking  view more  find "#select2-slcase-container"
cseM <- rD$findElement(using="css selector","#select2-slcase-container") 
cseM$clickElement()      # need to click caseM to open
Looping through all the cases to extract information:
Sys.sleep(2)
cseEle <- list()
N <- length(tmp)
system.time({
for (i in 1:N) {
    cseEle[[i]] <- rD$findElements(using = 'xpath', tmp[i])
    Sys.sleep(1)
}
})
   user  system elapsed 
   1.53    0.03  144.29 
cseEle.1 <- unlist(cseEle)
Sys.sleep(2)
system.time({
for(cse in cseEle.1){
  cse
  Sys.sleep(0.5)
  cse$clickElement()
  t <- rD$findElement(using = 'css selector', "#OtherCase_Info")
  Sys.sleep(0.5)
  t$clickElement()
  cseTexts <- append(cseTexts,t$getElementText()[[1]])
  Sys.sleep(1)
}
})
   user  system elapsed 
   3.58    0.04  295.89 
Selenium worked with the browser and the browser needs time to complete the work requested by Selenium. If it doesn’t get enough time get information for a case and the processin goes on to next step there will be errors. When I first run the above block of looping code, it took about five or six seconds to complete. But the problem is that I got a lot of duplicate cases. So I’ve to give time by adding system-sleep (time in seconds). Even with a total running time of 440 seconds for the loops, I got two of case-90, and missed case-7, and case-89!
knitr::include_graphics("cseTexts.png")
I checked to see that case-7 and case-89 exist:
case_89 <- rD$findElements(using = 'xpath', tmp[61])
case_89[[1]]$clickElement()
case89_text <- rD$findElement(using = 'css selector', "#OtherCase_Info")
cat(paste0(case89_text$getElementText()))
C - 89 ဓာတ်ခွဲအတည်ပြုလူနာ
အသက် - (၅၀) နှစ်၊ ကျား (C-47 ၏ ခင်ပွန်း)
နေရပ်လိပ်စာ - တောင်ဉက္ကလာပမြို့နယ်၊ ရန်ကုန်တိုင်းဒေသကြီး
ရောဂါလက္ခဏာဖြစ်ပွားခြင်း - မရှိ
ဓာတ်ခွဲအတည်ပြုလူနာနှင့်ထိတွေ့ခြင်း - C-47, C-90, C-91
အသွားအလာကန့်သတ်သည့်ရက်စွဲ - ၁၄-၄-၂၀၂၀
ဓာတ်ခွဲအတည်ပြုသည့်ရက်စွဲ - ၁၈-၄-၂၀၂၀
ပြည်ပခရီးသွားရာဇဝင် - မရှိ    
အတူနေမိသားစုဝင် - (၁၁) ဦး
ဓာတ်ခွဲအတည်ပြုစစ်ဆေးတွေ့ရှိပြီးချိန်မှစ၍ အဆိုပါလူနာအား ဝေဘာဂီအထူးကုဆေးရုံကြီးတွင် သီးခြားထားရှိကုသမှုပေးလျက်ရှိပါသည်။
(၇-၄-၂၀၂၀) ရက်နေ့မှ (၉-၄-၂၀၂၀) ရက်နေ့ထိ လူနာအမှတ်(၈၉)သည် ၎င်း၏ရုံးခန်းတွင် အစည်းအဝေးပြုလုပ်ခဲ့ကြောင်းသိရှိရပါသည်။
လူနာအမှတ် C-47 အားပိုးတွေ့လူနာအဖြစ် အတည်ပြုသတ်မှတ်ပြီးချိန်မှစ၍ သတ်မှတ်နေရာတွင် အသွားအလာကန့်သတ်၍ စောင့်ကြပ်ကြည်ရှုလျက်ရှိရာ ပြင်ပသို့ သွားလာခဲ့ခြင်းမရှိပါ။
Case 089 ၏ အတူနေမိသားစုဝင်များအား အသွားအလာပိတ်ပင်တားမြစ်၍ သီးခြားစောင့်ကြပ်ကြည့်ရှုမှုပြုလုပ်ခဲ့ပြီး မိသားစုဝင်(၂)ဦး (C-90, C-91) တွင်လည်း ရောဂါပိုး တွေ့ရှိခဲ့ပါသည်။
အခြားအနီးကပ်ထိတွေ့ခဲ့သူများအားလည်း အသွားအလာပိတ်ပင်တားမြစ်၍ သီးခြားစောင့်ကြပ်ကြည့်ရှုလျက်ရှိပါသည်။
case_7 <- rD$findElements(using = 'xpath', tmp[61])
case_7[[1]]$clickElement()
case7_text <- rD$findElement(using = 'css selector', "#OtherCase_Info")
cat(paste0(case7_text$getElementText()))
C - 89 ဓာတ်ခွဲအတည်ပြုလူနာ
အသက် - (၅၀) နှစ်၊ ကျား (C-47 ၏ ခင်ပွန်း)
နေရပ်လိပ်စာ - တောင်ဉက္ကလာပမြို့နယ်၊ ရန်ကုန်တိုင်းဒေသကြီး
ရောဂါလက္ခဏာဖြစ်ပွားခြင်း - မရှိ
ဓာတ်ခွဲအတည်ပြုလူနာနှင့်ထိတွေ့ခြင်း - C-47, C-90, C-91
အသွားအလာကန့်သတ်သည့်ရက်စွဲ - ၁၄-၄-၂၀၂၀
ဓာတ်ခွဲအတည်ပြုသည့်ရက်စွဲ - ၁၈-၄-၂၀၂၀
ပြည်ပခရီးသွားရာဇဝင် - မရှိ    
အတူနေမိသားစုဝင် - (၁၁) ဦး
ဓာတ်ခွဲအတည်ပြုစစ်ဆေးတွေ့ရှိပြီးချိန်မှစ၍ အဆိုပါလူနာအား ဝေဘာဂီအထူးကုဆေးရုံကြီးတွင် သီးခြားထားရှိကုသမှုပေးလျက်ရှိပါသည်။
(၇-၄-၂၀၂၀) ရက်နေ့မှ (၉-၄-၂၀၂၀) ရက်နေ့ထိ လူနာအမှတ်(၈၉)သည် ၎င်း၏ရုံးခန်းတွင် အစည်းအဝေးပြုလုပ်ခဲ့ကြောင်းသိရှိရပါသည်။
လူနာအမှတ် C-47 အားပိုးတွေ့လူနာအဖြစ် အတည်ပြုသတ်မှတ်ပြီးချိန်မှစ၍ သတ်မှတ်နေရာတွင် အသွားအလာကန့်သတ်၍ စောင့်ကြပ်ကြည်ရှုလျက်ရှိရာ ပြင်ပသို့ သွားလာခဲ့ခြင်းမရှိပါ။
Case 089 ၏ အတူနေမိသားစုဝင်များအား အသွားအလာပိတ်ပင်တားမြစ်၍ သီးခြားစောင့်ကြပ်ကြည့်ရှုမှုပြုလုပ်ခဲ့ပြီး မိသားစုဝင်(၂)ဦး (C-90, C-91) တွင်လည်း ရောဂါပိုး တွေ့ရှိခဲ့ပါသည်။
အခြားအနီးကပ်ထိတွေ့ခဲ့သူများအားလည်း အသွားအလာပိတ်ပင်တားမြစ်၍ သီးခြားစောင့်ကြပ်ကြည့်ရှုလျက်ရှိပါသည်။

No comments:

Post a Comment