使用R模仿“点击”网页上的下载文件按钮

时间:2019-07-08 07:32:20

标签: r post web-scraping httr rselenium

在本练习中探索2种方法时,我的问题有2部分,但是我没有成功。非常感谢有人可以帮助我。

[PART 1:]

我正在尝试从新加坡证券交易所https://www2.sgx.com/derivatives/negotiated-large-trade的网页上抓取包含存储在表格中的数据的数据。我有一些使用(rvest)抓取数据的基本知识。但是,在chrome上使用Inspector,html层次结构比我预期的要复杂得多。我可以看到我想要的数据隐藏在

下,这是我所绑定的:

library(rvest)
library(httr)
library(XML)
SGXurl <- "https://www2.sgx.com/derivatives/negotiated-large-trade"
SGXdata <- read_html(SGXurl, stringsASfactors = FALSE)
html_nodes(SGXdata,".table-container")

但是,代码没有任何东西,我怀疑我是否正确使用了这些代码。

[PART 2:]

当我意识到页面上有一个小的“下载”按钮时,它可以准确地下载我想要的.csv格式的数据文件。因此,我当时在考虑编写一些代码来模仿下载按钮,但我发现了这个问题Using R to "click" a download file button on a webpage,但是我无法使其对代码进行一些修改。

网页上有一些filtera,主要是我希望在特定工作日下载数据,而将其他过滤器留空,所以我尝试编写以下功能:

library(httr)
library(rvest)
library(purrr)
library(dplyr)

crawlSGXdata = function(date){

POST("https://www2.sgx.com/derivatives/negotiated-large-trade", 
     body = NULL
     encode = "form",
     write_disk("SGXdata.csv")) -> resfile
res = read.csv(resfile)
return(res) 
}

我本打算将函数输入“ date”放入“ body”自变量中,但是我无法弄清楚该怎么做,因此我以“ body = NULL”开始,假设它不起作用任何过滤。但是,结果仍然不能令人满意。文件下载基本上是空的,出现以下错误:

Request Rejected
The requested URL was rejected. Please consult with your administrator.
Your support ID is: 16783946804070790400

1 个答案:

答案 0 :(得分:0)

从返回json的API调用动态加载内容。您可以通过开发人员工具在“网络”标签中找到它。

以下内容返回该内容。我找到了结果的总页数,然后循环将每次调用返回的数据框组合成一个包含所有结果的最终数据框。

library(jsonlite)

url <- 'https://api.sgx.com/negotiatedlargetrades/v1.0?order=asc&orderby=contractcode&category=futures&businessdatestart=20190708&businessdateend=20190708&pagestart=0&pageSize=250'
r <-  jsonlite::fromJSON(url)
num_pages <- r$meta$totalPages
df <- r$data
url2 <- 'https://api.sgx.com/negotiatedlargetrades/v1.0?order=asc&orderby=contractcode&category=futures&businessdatestart=20190708&businessdateend=20190708&pagestart=placeholder&pageSize=250'

if(num_pages > 1){
  for(i in seq(1, num_pages)){
    newUrl <- gsub("placeholder", i , url2)
    newdf <- jsonlite::fromJSON(newUrl)$data
    df <- rbind(df, newdf)
  }
}