R 编写一个函数,用于刮取仅在键入值并单击按钮后显示的数据集

R 编写一个函数,用于刮取仅在键入值并单击按钮后显示的数据集,r,http,web-scraping,sas,R,Http,Web Scraping,Sas,我正在尝试编写一个函数,该函数将获取一个日期列表并检索在上找到的数据集 我在SAS中使用PROC IML来执行R代码(因为我更熟悉R) 我的问题是在R内,是由于该网站 首先,我知道有一个API,但这是一个我非常想学习的练习,因为许多站点没有API 有人知道如何检索数据集吗 我听说: 使用RSelenium对单击进行编程。RSelenium最近被从存档中删除,所以这不是一个选项(甚至从以前的版本下载它也会引起问题) 当我在Chrome中单击“提交”按钮时,查看XML url的变化。但是,“网络”选

我正在尝试编写一个函数,该函数将获取一个日期列表并检索在上找到的数据集

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

我的问题是在R内,是由于该网站

首先,我知道有一个API,但这是一个我非常想学习的练习,因为许多站点没有API

有人知道如何检索数据集吗

我听说:

  • 使用RSelenium对单击进行编程。RSelenium最近被从存档中删除,所以这不是一个选项(甚至从以前的版本下载它也会引起问题)

  • 当我在Chrome中单击“提交”按钮时,查看XML url的变化。但是,“网络”选项卡中的XML没有显示任何内容,而在其他具有不同搜索方法的网站上则显示


  • 我一整天都在寻找解决办法,但都没有用!请帮助

    首先,您需要阅读条款和条件,并确保在进行刮削时没有违反规则

    接下来,如果有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)
    最重要的是,请不要违反我读到的规则,这不应该是一个问题……我应该在请求中添加延迟,以防万一吗?不确定这里特别关注的是什么法律问题!