R 编写一个函数,用于刮取仅在键入值并单击按钮后显示的数据集
我正在尝试编写一个函数,该函数将获取一个日期列表并检索在上找到的数据集 我在SAS中使用PROC IML来执行R代码(因为我更熟悉R) 我的问题是在R内,是由于该网站 首先,我知道有一个API,但这是一个我非常想学习的练习,因为许多站点没有API 有人知道如何检索数据集吗 我听说:R 编写一个函数,用于刮取仅在键入值并单击按钮后显示的数据集,r,http,web-scraping,sas,R,Http,Web Scraping,Sas,我正在尝试编写一个函数,该函数将获取一个日期列表并检索在上找到的数据集 我在SAS中使用PROC IML来执行R代码(因为我更熟悉R) 我的问题是在R内,是由于该网站 首先,我知道有一个API,但这是一个我非常想学习的练习,因为许多站点没有API 有人知道如何检索数据集吗 我听说: 使用RSelenium对单击进行编程。RSelenium最近被从存档中删除,所以这不是一个选项(甚至从以前的版本下载它也会引起问题) 当我在Chrome中单击“提交”按钮时,查看XML url的变化。但是,“网络”选
我一整天都在寻找解决办法,但都没有用!请帮助首先,您需要阅读条款和条件,并确保在进行刮削时没有违反规则 接下来,如果有API,您应该使用它,以便他们能够更好地管理数据使用和操作 此外,还应限制请求的数量,以免服务器过载。如果我没有错的话,这与DNS拒绝服务攻击有关 最后,如果满足上述条件,您可以使用Chrome上的inspector查看在浏览这些网页时发出的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)
库(httr)
resp您可以使用Proc http
在SAS会话中执行相同的http处理。CSV数据不包含标题行,因此XML格式可能更合适。财政部直接网站有几个警告
- 在发布数据下载请求之前,连接需要一些在GET请求期间分配的cookie。Proc-HTTP可以做到这一点
- XML包含一个额外的标记容器,SAS XMLV2库引擎无法简单地处理该容器。这个额外的标签可以通过一些数据步骤处理删除
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;
filename响应温度;
文件名respfilt TEMP;
*获取请求设置新会话和cookie;
过程http
清除缓存
方法=“获取”
url=”https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
;
跑
*通过XML格式按钮执行Post请求;
*在GET请求中自动使用cookies设置;
*in=现在可以直接指定要发布的参数数据;
过程http
method=“post”
in='priceDate.year=2018&priceDate.month=5&priceDate.day=15&submit=XML+格式'
url=”https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
输出=响应
;
跑
*从响应中删除bpd标记(下载的xml);
数据为空;
填充反应;
文件重新过滤;
输入
如果_infle_uunot in:(“您仍然可以使用或使用,但通常如果有API,您应该使用API。感谢您为我指明了正确的方向!我必须看看我能用RSelenium做些什么。您可以使用httr::content
提取响应:httr::content(resp,type='text/csv',col name=FALSE)
最重要的是,请不要违反我读到的规则,这不应该是一个问题……我应该在请求中添加延迟,以防万一吗?不确定这里特别关注的是什么法律问题!