微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 purrr:map 循环浏览网页以使用 Rselenium

如何解决使用 purrr:map 循环浏览网页以使用 Rselenium

我有一个基本的 R 脚本,我使用 Rselenium 将它拼凑在一起,它允许我登录网站,一旦我的脚本通过身份验证,然后转到感兴趣的第一页并从页面提取 3 段文本。

对我来说幸运的是,URL 的创建方式使我可以将数字向量传递给 URL 以将我带到感兴趣的下一页,因此使用了 map()。

在每个页面上,我想从页面上刮下相同的 3 个元素并将它们存储在主数据框中以供以后分析。

我希望使用 map 函数系列以便更熟悉它们,但我真的很难让它们工作,有人能告诉我我哪里出错了吗?

这是我代码的主要部分(访问网站并登录

library(RSelenium)
# https://stackoverflow.com/questions/55201226/session-not-created-this-version-of-chromedriver-only-supports-chrome-version-7/56173984
rd <- rsDriver(browser = "chrome",chromever = "88.0.4324.27",port = netstat::free_port())

remdr <- rd[["client"]]

# url of the site's login page
url <- "https://www.myWebsite.com/"

# Navigating to the page
remdr$navigate(url)

# Wait 5 secs for the page to load
Sys.sleep(5)

# Find the initial login button to bring up the username and password fields
loginbutton <- remdr$findElement(using = 'css selector','.plain')

# Click the initial login button to bring up the username and password fields
loginbutton$clickElement()

# Find the username Box
username <- remdr$findElement(using = 'css selector','#username')

# Find the password Box
password <- remdr$findElement(using = 'css selector','#password')

# Find the final login button
login <- remdr$findElement(using = 'css selector','#btnLoginSubmit1')

# Input the username
username$sendKeystoElement(list("myUsername"))

# Input the password
password$sendKeystoElement(list("myPassword"))

# Click login
login$clickElement()

嘿,我们来了!

现在我的代码将我带到感兴趣的初始页面(索引 = 1)

我在上面提到我希望通过每个页面递增,我可以通过将一个整数替换到 rcId 元素的 URL 中来实现这一点,见下文

#remdr$navigate("https://myWebsite.com/rc_redesign/#/layout/jcard/drugCard?accountId=XXXXXX&rcId=1&searchType=R&reimbCode=&searchTerm=&searchTexts=*") # 导航到页面

对于 1:9999 中的每个 rcId,我希望获取以下 3 个元素并将它们存储在数据框中

hcpcs_info <- remdr$findElement(using = 'class','is-jcard-heading')

hcpcs <- hcpcs_info$getElementText()[[1]]

hcpcs_description <- remdr$findElement(using = 'class','is-jcard-desc')

hcpcs_desc <- hcpcs_description$getElementText()[[1]]

tc_info <- remdr$findElement(using = 'css selector','.col-12.ng-star-inserted')

therapeutic_class <- tc_info$getElementText()[[1]]

我曾尝试创建一个单独的函数并传递给 map,但我还不够先进,无法将它们拼凑在一起,下面是我尝试过的。

my_function <- function(index) {
  remdr$navigate(sprintf("https://rc2.reimbursementcodes.com/rc_redesign/#/layout/jcard/drugCard?accountId=113479&rcId=%d&searchType=R&reimbCode=*&searchTerm=*&searchTexts=*",index)
                 Sys.sleep(5)
                 hcpcs_info[index] <- remdr$findElement(using = 'class','is-jcard-heading')
                 hcpcs[index] <- hcpcs_info$getElementText()[index][[1]])
}

x <- 1:10 %>% 
map(~ my_function(.x))

任何帮助将不胜感激

解决方法

尝试以下操作:

library(RSelenium)

purrr::map_df(1:10,~{
          remdr$navigate(sprintf("https://rc2.reimbursementcodes.com/rc_redesign/#/layout/jcard/drugCard?accountId=113479&rcId=%d&searchType=R&reimbCode=*&searchTerm=*&searchTexts=*",.x))
          Sys.sleep(5)
          hcpcs_info <- remdr$findElement(using = 'class','is-jcard-heading')
          hcpcs <- hcpcs_info$getElementText()[[1]]
          hcpcs_description <- remdr$findElement(using = 'class','is-jcard-desc')
          hcpcs_desc <- hcpcs_description$getElementText()[[1]]
          tc_info <- remdr$findElement(using = 'css selector','.col-12.ng-star-inserted')
          therapeutic_class <- tc_info$getElementText()[[1]]
          tibble(hcpcs,hcpcs_desc,therapeutic_class)
          }) -> result
result

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。