我正在尝试自动下载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
答案 0 :(得分:0)
您必须为第二个查询使用相同的cookie,并传递视图状态和验证字段。快速举例:
加载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)
解析HTML后提取VIEWSTATE
和EVENTVALIDATION
值:
page1 <- htmlTreeParse(page1, useInternal = TRUE)
viewstate <- xpathSApply(page1, '//input[@name = "__VIEWSTATE"]', xmlGetAttr, 'value')
validation <- xpathSApply(page1, '//input[@name = "__EVENTVALIDATION"]', xmlGetAttr, 'value')
使用保存的Cookie再次查询相同的网址,提取隐藏的INPUT
值,并要求提供第二页:
page2 <- postForm(url, curl = curl,
.params = list(
'__EVENTARGUMENT' = 'Page$2',
'__EVENTTARGET' = 'WQResultGridView',
'__VIEWSTATE' = viewstate,
'__EVENTVALIDATION' = validation))
从第二页上显示的表格中提取网址:
page2 <- htmlTreeParse(page2, useInternal = TRUE)
xpathSApply(page2, '//td/font/a', xmlGetAttr, 'href')