【问题标题】:Rselenium Jsonlite scrapingRselenium Jsonlite 刮片
【发布时间】:2017-11-10 19:39:32
【问题描述】:

我是 Scraping 的新手。我正在尝试 scrape 出现在站点中的 table 并转换为 dataframe 但似乎我必须执行脚本。我正在使用 Rselenium 方法。可能 Jsonlite 效果更好,但我不知道如何。

# Running without problem
require(RSelenium)
rD <- rsDriver()
remDr <- rD[["client"]]
url <- "https://www.rad.cvm.gov.br/ENETCONSULTA/frmGerenciaPaginaFRE.aspx?NumeroSequencialDocumento=62839&CodigoTipoInstituicao=2"
remDr$navigate(url)

# Here is my problem
remDr$findElement('id', 'ctl00_cphPopUp_tbDados')$getElementText()[[1]]

【问题讨论】:

  • 似乎没有一种方法可以在不登录的情况下确定性地访问带有表格的页面(我们绝大多数人都做不到)。这是一个糟糕的 SharePoint 网站,它使用相当重量级的“查看状态”跟踪器来维护状态,因此您应该从开始页面开始,编排登录并可能编排按钮点击。最后,最后一页实际上是一个带有iframe 的页面,因此当您获取页面源时,您必须以iframe 为目标。希望有更多空闲时间的其他人可以提供具有代表性的代码示例。

标签: r web-scraping rselenium jsonlite


【解决方案1】:

这个页面有三个棘手的地方:1) 它是一个 iFrame,2) 访问“非框架”页面需要 cookie,3) 它是用 javascript 编写的,我觉得更难抓取。

如果您不介意,我使用 CVM 的页面而不是 BM&FBovespa 并使用 BRF 作为示例。 要查找损益表,请转到CVM's page >“Companhias”(在您的左侧)> 点击“Consulta de Documentos de Companhias Abertas”> 选择公司 > 点击 DFP > 最后选择上方的“Consulta”所需的文件。

u1是上述路径生成的url。使用 Chrome 的 SelectorGadget 或查看浏览器的开发工具,您会找到u2。就个人而言,我发现 SelectorGadget 更易于使用。当你启动它时,它会给你一个 url,让你在 iFrame 中进行选择。

u1 <- "https://www.rad.cvm.gov.br/enetconsulta/frmGerenciaPaginaFRE.aspx?CodigoTipoInstituicao=1&NumeroSequencialDocumento=62776"

u2 <- "https://www.rad.cvm.gov.br/enetconsulta/frmDemonstracaoFinanceiraITR.aspx?Informacao=2&Demonstracao=4&Periodo=0&Grupo=DFs+Consolidadas&Quadro=Demonstra%C3%A7%C3%A3o+do+Resultado&NomeTipoDocumento=DFP&Titulo=Demonstra%C3%A7%C3%A3o%20do%20Resultado&Empresa=BRF%20SA&DataReferencia=31/12/2016&Versao=1&CodTipoDocumento=4&NumeroSequencialDocumento=62776&NumeroSequencialRegistroCvm=1413&CodigoTipoInstituicao=1"

如果关闭浏览器并直接访问u2,网站将返回错误消息“对象引用未设置为对象的实例”。要摆脱这种情况,您需要将 cookie 从 u1 传递到 u2

r <- GET(u1)
biscoitos <-  cookies(r) #cookies de acesso para u2
page <- GET(u2, encoding = "utf-8",
               set_cookies("ASP.NET_SessionId" = biscoitos$value[1] , 
                           "BIGipServerpool_www.rad.cvm.gov.br_443" = biscoitos$value[2], 
                           "TS01871345" = biscoitos$value[3]))
pg_content <- content(page, "raw")

如果此页面是用 html 编写的,则可以使用#clt00_cphPopUp_tbDados 选择器。我发现这个奇怪的解决方法是 javascript。

writeBin(pg_content, "temp.txt")
html_page <- read_html("temp.txt", encoding = "utf-8")
write_html(html_page, "temp.html", encoding = "utf-8")
df <- readHTMLTable("temp.html", encoding = "utf-8")
df <- df$ctl00_cphPopUp_tbDados

This httr tutorial 帮我写了这段代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多