r语言 - 使用purrr:map在网页中循环使用Rselenium进行抓取



我有一个基本的R脚本,我使用Rselenium拼凑在一起,它允许我登录到一个网站,一旦认证,我的脚本就会转到感兴趣的第一页,并从页面中提取3段文本。

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

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

我希望使用函数的映射家族,这样我就可以变得更加熟悉它们,但我真的很难让这些工作,谁能告诉我我在哪里出错?

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

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()

然后我们就进去了!

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

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

# remdr导航美元("https://myWebsite.com/rc_redesign//布局/jcard/drugCard ? accountId = XXXXXX&rcId = 1&searchType=R& rebcode =&searchTerm=& searchtext =*") #导航到页面

对于每个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

最新更新