使用 R 模拟“点击”网页上的下载文件按钮
Using R to mimic “clicking” a download file button on a webpage
我在本练习中探索了 2 种方法,我的问题分为 2 个部分,但是我成功了 none。如果有人能帮助我,我将不胜感激。
[第 1 部分:]
我正在尝试从新加坡证券交易所 https://www2.sgx.com/derivatives/negotiated-large-trade 的网页中抓取数据,其中包含存储在 table 中的数据。我有一些使用(rvest)抓取数据的基本知识。但是,在 chrome 上使用 Inspector,html 层次结构比我预期的要复杂得多。我可以看到我想要的数据隐藏在 < div class= "table-container" > 下,这是我绑定的内容:
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")
但是,代码没有发现任何内容,我怀疑我是否正确使用了这些代码。
[第 2 部分:]
据我所知,页面上有一个 "download" 小按钮,可以准确下载我想要的 .csv 格式数据文件。所以我想写一些代码来模仿下载按钮,我发现了这个问题 ,但我无法通过对该代码进行一些修改来让它工作。
网页上有一些过滤器,大多数我会感兴趣的是下载特定工作日的数据,同时将其他过滤器留空,所以我尝试编写以下函数:
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 = NULL" 开始假设它不做任何过滤。然而,结果仍不尽如人意。文件下载基本上是空的,出现以下错误:
Request Rejected
The requested URL was rejected. Please consult with your administrator.
Your support ID is: 16783946804070790400
内容是从返回 json 的 API 调用动态加载的。您可以通过开发工具在网络选项卡中找到它。
以下returns即内容。我找到了结果的总页数,并循环将每次调用返回的数据帧组合成一个包含所有结果的最终数据帧。
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)
}
}
我在本练习中探索了 2 种方法,我的问题分为 2 个部分,但是我成功了 none。如果有人能帮助我,我将不胜感激。
[第 1 部分:]
我正在尝试从新加坡证券交易所 https://www2.sgx.com/derivatives/negotiated-large-trade 的网页中抓取数据,其中包含存储在 table 中的数据。我有一些使用(rvest)抓取数据的基本知识。但是,在 chrome 上使用 Inspector,html 层次结构比我预期的要复杂得多。我可以看到我想要的数据隐藏在 < div class= "table-container" > 下,这是我绑定的内容:
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")
但是,代码没有发现任何内容,我怀疑我是否正确使用了这些代码。
[第 2 部分:]
据我所知,页面上有一个 "download" 小按钮,可以准确下载我想要的 .csv 格式数据文件。所以我想写一些代码来模仿下载按钮,我发现了这个问题
网页上有一些过滤器,大多数我会感兴趣的是下载特定工作日的数据,同时将其他过滤器留空,所以我尝试编写以下函数:
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 = NULL" 开始假设它不做任何过滤。然而,结果仍不尽如人意。文件下载基本上是空的,出现以下错误:
Request Rejected
The requested URL was rejected. Please consult with your administrator.
Your support ID is: 16783946804070790400
内容是从返回 json 的 API 调用动态加载的。您可以通过开发工具在网络选项卡中找到它。
以下returns即内容。我找到了结果的总页数,并循环将每次调用返回的数据帧组合成一个包含所有结果的最终数据帧。
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)
}
}