编写一个函数来擦除仅在键入值并单击按钮后才出现的数据集

时间:2018-05-16 00:33:18

标签: r http web-scraping sas

我正在尝试编写一个函数,该函数将获取日期列表并检索https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm上的数据集

我在SAS中使用PROC IML来执行R代码(因为我对R更熟悉)。

我的问题在R内,并且归功于网站。

首先,我知道有一个API,但这是一个我真正想要学习的练习,因为很多站点都没有API。

有谁知道如何检索数据集?

我听到的事情:

  1. 使用RSelenium对点击进行编程。 RSelenium最近从存档中删除了,因此这不是一个选项(即使从以前的版本下载它也会导致问题)。

  2. 点击Chrome中的“提交”按钮,查看XML网址更改。但是,“网络”选项卡中的XML不显示任何内容,而在其他具有不同搜索方法的网站上则显示。

  3. 我一直在寻找解决方案,但无济于事!请帮忙

2 个答案:

答案 0 :(得分:1)

首先,您需要阅读条款和条件,并确保在抓取时不违反规则。

接下来,如果有API,您应该使用它,以便他们可以更好地管理他们的数据使用和操作。

此外,您还应限制发出的请求数,以免服务器过载。如果我没有错,这与DNS拒绝服务攻击有关。

最后,如果满足上述条件,您可以使用Chrome上的检查器查看浏览这些网页时发出的HTTP请求。

在这种特殊情况下,您不需要RSelenium,只需要一个简单的HTTP POST

library(httr)

resp <- POST("https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm",
    body=list(
        priceDate.month=5,
        priceDate.day=15,
        priceDate.year=2018,
        submit="CSV+Format"
    ),
    encode="form")

read.csv(text=rawToChar(resp$content), header=FALSE)

答案 1 :(得分:0)

您可以使用Proc HTTP在SAS会话中执行相同的http处理。 CSV数据不包含标题行,因此XML格式可能更合适。 treasurydirect网站有几点需要注意。

  • 在发布数据下载请求之前,连接需要一些在GET请求期间分配的cookie。 Proc HTTP可以做到这一点。
  • XML包含一个额外的标记容器<bpd>,SAS XMLV2库引擎无法简单处理。可以使用一些DATA步骤处理删除此额外标记。

XML的示例代码

filename response TEMP;
filename respfilt TEMP;

* Get request sets up fresh session and cookies;
proc http
  clear_cache 
  method = "get"
  url ="https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
;
run;

* Post request as performed by XML format button;
* automatically utilizes cookies setup in GET request;
* in= can now directly specify the parameter data to post;

proc http 
  method = "post"
  in = 'priceDate.year=2018&priceDate.month=5&priceDate.day=15&submit=XML+Format'
  url ="https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
  out = response
;
run;

* remove bpd tag from the response (the downloaded xml);

data _null_;
  infile response;
    file respfilt;
  input;
  if _infile_ not in: ('<bpd', '</bpd');
  put _infile_;
run;

* copy data collections from xml file to tables in work library;

libname respfilt xmlv2 ;

proc copy in=respfilt out=work;
run;

参考资料

  

使用SAS®轻松实现REST:如何使用SAS获取REST   Joseph Henry,SAS Institute Inc.,Cary,NC
  http://support.sas.com/resources/papers/proceedings16/SAS6363-2016.pdf