【问题标题】:Get non html content from rvest_session object从 rvest_session 对象获取非 html 内容
【发布时间】:2022-01-19 18:44:03
【问题描述】:

我正在尝试从 URL 获取文本文件。从浏览器来看,它相当简单。我只需要将 URL 中的“另存为”,就可以得到我想要的文件。起初,我在使用 rvest 登录时遇到了一些问题(请参阅 [https://stackoverflow.com/questions/66352322/how-to-get-txt-file-from-password-protected-website-jsp-in-r] [1])(我在那里上传了几张可能有用的图片)。当我使用以下代码时:

fileurl <- "http://www1.bolsadecaracas.com/esp/productos/dinamica/downloadDetail.jsp?symbol=BNC&dateFrom=20190101&dateTo=20210101&typePlazo=nada&typeReg=T"
session(fileurl)

我得到以下信息(请注意我是如何被重定向到不同的 URL,当您尝试在没有首先登录的情况下访问文件 URL 时在浏览器中发生的情况):

<session> http://www1.bolsadecaracas.com/esp/productos/dinamica/downloadDetail.jsp?symbol=BNC&dateFrom=20190101&dateTo=20210101&typePlazo=nada&typeReg=T
  Status: 200
  Type:   text/html; charset=ISO-8859-1
  Size:   84

我设法使用以下代码登录:

#Define URLs
loginurl <- "http://www1.bolsadecaracas.com/esp/usuarios/customize.jsp"
fileurl <- "http://www1.bolsadecaracas.com/esp/productos/dinamica/downloadDetail.jsp?symbol=BNC&dateFrom=20190101&dateTo=20210101&typePlazo=nada&typeReg=T"

#Create session
pgsession <- session(loginurl)
pgform<-html_form(pgsession)[[1]]   #Get form

#Create a fake submit button as form does not have one
fake_submit_button <- list(name = NULL,
                           type = "submit",
                           value = NULL,
                           checked = NULL,
                           disabled = NULL,
                           readonly = NULL,
                           required = FALSE)
attr(fake_submit_button, "class") <- "input"    
pgform[["fields"]][["submit"]] <- fake_submit_button

#Create and submit filled form
filled_form<-html_form_set(pgform, login="******", passwd="******")
session_submit(pgsession, filled_form)

#Jump to new url
loggedsession <- session_jump_to(pgsession, url = fileurl)

#Output
loggedsession
  

在我看来登录是成功的,因为当我下载它并且我不再被重定向时,会话输出与 .txt 文件的大小完全相同。查看输出。

<session> http://www1.bolsadecaracas.com/esp/productos/dinamica/downloadDetail.jsp?symbol=BNC&dateFrom=20190101&dateTo=20210101&typePlazo=nada&typeReg=T
  Status: 200
  Type:   text/plain; charset=ISO-8859-1
  Size:   32193

但是,每当我尝试使用 read_html() 或类似方法提取会话内容时,都会收到以下错误:“错误:页面似乎不是 html。”。我不知道它是否与会话的“类型:文本/纯文本”有关。

当我跑步时

loggedsession[["response"]][["content"]]

我明白了

  [1] 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 7c 30 32 2f 30 31 2f 32 30 31 39 7c 52 7c 31 34 2c 39 30 7c 31 35 2c
  [34] 30 30 7c 31 37 2c 38 33 7c 31 33 2c 35 30 7c 39 7c 31 33 2e 35 33 33 7c 32 30 33 2e 30 36 30 2c 31
  [67] 39 7c 0a 7c 30 33 2f 30 31 2f 32 30 31 39 7c 52 7c 31 35 2c 30 30 7c 31 37 2c 39 38 7c 31 37 2c 39

关于如何提取文本文件的任何帮助???将不胜感激。

PS: 在某一时刻,仅仅使用函数我就设法得到了可以与 httr::: GET(fileurl) 一起使用的东西。那是在使用 rvest 功能并设法登录之后。但是,在关闭和打开 RStudio 之后,我无法使用该功能获得相同的输出。

【问题讨论】:

标签: r rvest httr


【解决方案1】:

因为rvest 在内部使用httr 包,您可以使用httrbase 来保存您的文件。解决方案的关键是您的response(就httr 包而言)在会话对象中:

library(rvest)
library(httr)

httr::content(loggedsession$response, as = "text") %>%
   cat(file = "your_file.txt")

更重要的是,如果您的文件是二进制文件(例如 zip 存档),您必须这样做:

library(rvest)
library(httr)

httr::content(loggedsession$response, as = "raw") %>%
    writeBin(con = 'your_file.zip')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多