我正试图从互联网上获取有关企业的一些信息。大部分信息都位于此页面中:http://appscvs.supercias.gob.ec/portalInformacion/sector_societario.zul,页面如下所示:
在此页面中,我必须单击选项卡Busqueda de Companias
,然后开始有趣的一面。当我点击时,我会看到下一个屏幕:
在这个页面中,我必须设置选项Nombre
,然后我必须插入一个带有名称的字符串。例如,我将添加字符串PROAÑO & ASOCIADOS CIA. LTDA.
,我将进入下一个屏幕:
在此屏幕中,我有此企业的信息。然后,我必须单击选项卡Informacion Estados Financieros
,我将进入下一个屏幕:
在此最终屏幕中,我必须点击标签Estado Situacion
,我将从Codigo de la cuenta contable
,Nombre de la cuenta contable
和Valor
列中获取企业的信息。我想将这些信息保存在数据框中。我发现的大部分复杂方面都是在我必须设置元素Nombre
,插入字符串,然后Buscar
并点击直到找到标签Informacion Estados Financieros
时开始的。我尝试使用html_session
包中的html_form
和rvest
但元素为空。
你能帮我解决一下这个问题吗?
答案 0 :(得分:5)
这是一个独立的代码示例,使用问题中引用的网站。
为什么?让1k Stack用户访问网站是DDOS攻击。
下面的代码将安装RSelenium,然后运行您需要的代码:
以下代码会将您从第二页[http://appscvs.supercias.gob.ec/portaldeinformacion/consulta_cia_param.zul]转到您感兴趣的信息的最后一页......
如果您对使用RSelenium感兴趣,我强烈建议您阅读以下参考资料,感谢 John Harrison 开发RSelenium软件包。
- RSelenium基础知识
- RSelenium无头浏览
- RSelenium Vignette
https://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-basics.html
# We want to make this as easy as possible to use
# So we need to install required packages for the user...
#
if (!require(RSelenium)) install.packages("RSelenium")
if (!require(XML)) install.packages("XML")
if (!require(RJSONIO)) install.packages("RSJONIO")
if (!require(stringr)) install.packages("stringr")
# Data
#
mainPage <- "http://appscvs.supercias.gob.ec/portalInformacion/sector_societario.zul"
businessPage <- "http://appscvs.supercias.gob.ec/portaldeinformacion/consulta_cia_param.zul"
# StartServer
# We assume RSelenium is not setup, so we check if the RSelenium
# server is available, if not we install RSelenium server.
checkForServer()
# OK. now we start the server
RSelenium::startServer()
remDr <- RSelenium::remoteDriver$new()
# We assume the user has installed Firefox and the Selenium IDE
# https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/
#
# Ok we open firefix
remDr$open(silent = T) # Open up a firefox window...
# Now we open the browser and required URL...
# This is the page that matters...
remDr$navigate(businessPage)
# First things first on the first page, lets get the id's for the radio_button,
# name Element, and button. We need all three.
#
radioButton <- remDr$findElements(using = 'css selector', ".z-radio-cnt")
nameElement <- remDr$findElements(using = 'css selector', ".z-combobox-inp")
searchButton <- remDr$findElements(using = 'css selector', ".z-button-cm")
# Optional: we can highlight the radio elements returned
# lapply(radioButton, function(x){x$highlightElement()})
# Optional: we can highlight the nameElement returned
# lapply(nameElement, function(x){x$highlightElement()})
# Optional: we can highlight the searchButton returned
# lapply(searchButton, function(x){x$highlightElement()})
# Now we can select and press the third radio button
radioButton[[3]]$clickElement()
# We fill in the required name...
nameElement[[1]]$sendKeysToElement(list("PROAÑO & ASOCIADOS CIA. LTDA."))
# This is subtle but required the page triggers a drop down list, so rather than
# hitting the searchButton, we first select, and hit enter in the drop down menu...
selectElement <- remDr$findElements(using = 'css selector', ".z-comboitem-text")
selectElement[[1]]$clickElement()
# OK, now we can click the search button, which will cause the next page to open
searchButton[[1]]$clickElement()
# New Page opens...
#
# Ok, so now we first pull the list of buttons...
finPageButton <- remDr$findElements(using = 'class name', "m_iconos")
# Now we can press the required button to open the page we want to get too...
finPageButton[[9]]$clickElement()
# We are now on the required page.
我们现在在目标页面上[见图片]
下一步是提取表值。为此,我们提取.z-listitem
css-selector
数据。现在我们可以检查以确认我们是否看到了数据行。我们这样做,所以我们现在可以提取返回的值并填充列表或数据帧。
# Ok, now we need to extract the table, we identify and pull out the
# '.z-listitem' and assign to modalWindow
modalWindow <- remDr$findElements(using = 'css selector', ".z-listitem")
# Now we can extract the lines from modalWindow... Now that each line is
# returned as a single line of text, so we split into three based on the
# line marker "/n'
lineText <- str_split(modalWindow[[1]]$getElementText()[1], '\n')
lineText
这里是结果:
> lineText <- stringr::str_split(modalWindow[[1]]$getElementText()[1], '\n')
> lineText
[[1]]
[1] "10"
[2] "OPERACIONES DE INGRESO CON PARTES RELACIONADAS EN PARAÍSOS FISCALES, JURISDICCIONES DE MENOR IMPOSICIÓN Y REGÍMENES FISCALES PREFERENTES"
[3] "0.00"
Selenium WebDriver和RSelenium只与网页的可见元素进行交互。如果我们尝试读取整个表,我们将只返回可见(未隐藏)的表项。
我们可以通过滚动到表格底部来解决此问题。由于滚动操作,我们强制表填充。然后我们可以提取完整的表格。
# Select the .z-listbox-body
modalWindow <- remDr$findElements(using = 'css selector', ".z-listbox-body")
# Now we tell the window we want to scroll to the bottom of the table
# This triggers the table to populate all the rows
modalWindow[[1]]$executeScript("window.scrollTo(0, document.body.scrollHeight)")
# Now we can extract the complete table
modalWindow <- remDr$findElements(using = 'css selector', ".z-listitem")
lineText <- stringr::str_split(modalWindow[[9]]$getElementText(), '\n')
lineText
上面的代码示例是自包含的。我的意思是它应该安装你需要的一切,包括所需的包。一旦从属R软件包安装,R代码将调用checkForServer()
,如果未安装Selenium,则调用将安装它。 这可能需要一些时间
我的建议是你逐步完成代码,因为我没有包含任何延迟(在你想要的制作中),请注意我还没有针对速度进行优化,而是为了一点清晰[从我的角度来看] ......
该代码显示可用于:
答案 1 :(得分:2)
首先,安装RSelenium并使用上面链接的插图来熟悉基础知识
然后参加本次网络研讨会,了解如何使用RSelenium,逐步完成一些详细的抓取工作,非常容易理解: http://johndharrison.blogspot.hk/2014/05/orange-county-r-users-group-oc-rug.html