【问题标题】:Passing correct params to RCurl/postForm将正确的参数传递给 RCurl/postForm
【发布时间】:2016-12-28 07:59:55
【问题描述】:

我正在尝试通过RCurl 从国家信息中心下载 pdf,但遇到了一些麻烦。对于这个例子URL,我想要与默认设置对应的pdf,除了“报告格式”应该是“PDF”。当我运行以下脚本时,它会保存与选择其他按钮相关的文件(“...的父级”/HMDA - 不是默认值)。我尝试将这些输入元素添加到params,但它没有改变任何东西。有人可以帮我找出问题吗?谢谢。

library(RCurl)
curl = getCurlHandle()
curlSetOpt(cookiejar = 'cookies.txt', curl = curl)
params = list(rbRptFormatPDF = 'rbRptFormatPDF')

url = 'https://www.ffiec.gov/nicpubweb/nicweb/OrgHierarchySearchForm.aspx?parID_RSSD=2162966&parDT_END=99991231'
html = getURL(url, curl = curl)
viewstate = sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html)
event = sub('.*id="__EVENTVALIDATION" value="([0-9a-zA-Z+/=]*).*', '\\1', html)
params[['__VIEWSTATE']] = viewstate
params[['__EVENTVALIDATION']] = event
params[['btnSubmit']] = 'Submit'
result = postForm(url, .params=params, curl=curl, style='POST')

writeBin( as.vector(result), 'test.pdf')

【问题讨论】:

    标签: r web-scraping rcurl httr


    【解决方案1】:

    这是否提供了正确的 PDF?

    library(httr)
    library(rvest)
    library(purrr)
    
    # setup inane sharepoint viewstate parameters
    res <- GET(url = "https://www.ffiec.gov/nicpubweb/nicweb/OrgHierarchySearchForm.aspx",
               query=list(parID_RSSD=2162966, parDT_END=99991231))
    
    # extract them
    pg <- content(res, as="parsed")
    hidden <- html_nodes(pg, xpath=".//form/input[@type='hidden']") 
    params <- setNames(as.list(xml_attr(hidden, "value")), xml_attr(hidden, "name"))
    
    # pile on more params
    params <- c(
      params, 
      grpInstitution = "rbCurInst", 
      lbTopHolders = "2961897", 
      grpHMDA = "rbNonHMDA", 
      lbTypeOfInstitution = "-99", 
      txtAsOfDate = "12/28/2016", 
      txtAsOfDateErrMsg = "", 
      lbHMDAYear = "2015", 
      grpRptFormat = "rbRptFormatPDF", 
      btnSubmit = "Submit"
    )
    
    # submit the req and save to disk
    POST(url = "https://www.ffiec.gov/nicpubweb/nicweb/OrgHierarchySearchForm.aspx",
         query=list(parID_RSSD=2162966, parDT_END=99991231),
         add_headers(Origin = "https://www.ffiec.gov"), 
         body = params, 
         encode = "form", 
         write_disk("/tmp/output.pdf")) -> res2
    

    【讨论】:

    • 是的,这行得通——谢谢!我猜你确实需要明确指定所有参数,即使它们显示为默认值
    • 看来lbTopHolderslbHMDAyear 没有必要
    • 隐藏的“API”真的很可怕 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多