从R中的aspx网页下载文档

时间:2015-08-21 04:24:45

标签: html r web-scraping html-parsing

我正在尝试自动下载Oil&来自科罗拉多州石油和天然气保护委员会(COGCC)的气井使用R中的“rvest”和“下载器”包。

包含特定油井文件的表格/表格的链接是; http://ogccweblink.state.co.us/results.aspx?id=12337064

“id = 12337064”是井

的唯一标识符

可以通过单击下载表单页面上的文档。 一个例子如下。 http://ogccweblink.state.co.us/DownloadDocument.aspx?DocumentId=3172781

“DocumentID = 3172781”是要下载的文档的唯一文档ID。在这种情况下,是一个xlsm文件。文档页面上的其他文件格式包括PDF和xls。

到目前为止,我已经能够编写代码来下载任何文档,但它仅限于第一页。大多数井都有多页文件,我无法在第1页以外的页面上下载文件(所有文件页面都有类似的URL)

## Extract the document id for document to be downloaded in this case "DIRECTIONAL DATA". Used the SelectorGadget tool to extract the CSS path
library(rvest)
html <- html("http://ogccweblink.state.co.us/results.aspx?id=12337064")
File <- html_nodes(html, "tr:nth-child(24) td:nth-child(4) a")
File <- as(File[[1]],'character')
DocId<-gsub('[^0-9]','',File)
DocId
[1] "3172781"

## To download the document, I use the downloader package
library(downloader)
linkDocId<-paste('http://ogccweblink.state.co.us/DownloadDocument.aspx DocumentId=',DocId,sep='')
download(linkDocId,"DIRECTIONAL DATA" ,mode='wb')

    trying URL 'http://ogccweblink.state.co.us/DownloadDocument.aspx?DocumentId=3172781'
Content type 'application/octet-stream' length 33800 bytes (33 KB)
downloaded 33 KB

有谁知道如何修改我的代码以便在其他页面上下载文档?

非常感谢!

EM

1 个答案:

答案 0 :(得分:0)

您必须为第二个查询使用相同的cookie,并传递视图状态和验证字段。快速举例:

  1. 加载RCurl并加载网址并保留Cookie:

    url   <- 'http://ogccweblink.state.co.us/results.aspx?id=12337064'
    library(RCurl)
    curl  <- curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = getCurlHandle())
    page1 <- getURL(url, curl = curl)
    
  2. 解析HTML后提取VIEWSTATEEVENTVALIDATION值:

    page1 <- htmlTreeParse(page1, useInternal = TRUE)
    viewstate  <- xpathSApply(page1, '//input[@name = "__VIEWSTATE"]', xmlGetAttr, 'value')
    validation <- xpathSApply(page1, '//input[@name = "__EVENTVALIDATION"]', xmlGetAttr, 'value')
    
  3. 使用保存的Cookie再次查询相同的网址,提取隐藏的INPUT值,并要求提供第二页:

    page2 <- postForm(url, curl = curl,
             .params = list(
                 '__EVENTARGUMENT'   = 'Page$2',
                 '__EVENTTARGET'     = 'WQResultGridView',
                 '__VIEWSTATE'       = viewstate,
                 '__EVENTVALIDATION' = validation))
    
  4. 从第二页上显示的表格中提取网址:

    page2 <- htmlTreeParse(page2, useInternal = TRUE)
    xpathSApply(page2, '//td/font/a', xmlGetAttr, 'href')