【问题标题】:Using R to mimic “clicking” a download file button on a webpage使用 R 模拟“点击”网页上的下载文件按钮
【发布时间】:2019-07-08 07:32:20
【问题描述】:

当我在本练习中探索了 2 种方法时,我的问题有 2 个部分,但是我没有成功。如果有人可以帮助我,将不胜感激。

[第 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")

但是,代码没有发现任何内容,我怀疑我是否正确使用了这些代码。

[第 2 部分:]

我意识到页面上有一个小的“下载”按钮,可以准确地下载我想要的 .csv 格式的数据文件。所以我想写一些代码来模仿下载按钮,我发现了这个问题Using R to "click" a download file button on a webpage,但我无法通过对该代码进行一些修改来让它工作。

网页上有一些过滤器,主要是我有兴趣下载特定工作日的数据,而其他过滤器留空,所以我尝试编写以下函数:

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

【问题讨论】:

    标签: r post web-scraping httr rselenium


    【解决方案1】:

    内容是从返回 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)
      }
    }
    

    【讨论】:

    • 这段代码对我来说看起来很陌生,我不确定 JSON 是什么,你有什么建议我应该从哪里开始学习这些东西?谢谢
    • 嗨 QHarr,我意识到即使我将“pageSize = 250”更改为更大的数字,这段代码也只能抓取前 250 行数据,你有什么快速解决方案吗?谢谢!
    • This 解释 json。它基本上是一种文件格式。以及必填链接:json.org
    • 您好 QHarr,感谢您的 cmets,我肯定会接受您的回答。对不起,我在这里有点慢,因为我是这个网站的新手。可能只是最后一个问题,你是如何找到 api 链接“api.sgx.com/negotiatedlargetrades/v1.0?.....”的?因为我有从其他页面裁剪数据的问题:www2.sgx.com/derivatives/…。我非常想知道如何自己找到 API 链接。再次感谢
    • 请看我的描述herehere
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多