使用R(使用包rvest
,jsonlite
和httr
时)尝试以编程方式下载以下网址提供的所有数据文件:
http://environment.data.gov.uk/ds/survey/index.jsp#/survey?grid=TQ38
我尝试使用Chrome并使用“Inspect”然后使用Source
获取下载选项,但它似乎使用ng tables
和AngularJS
作为检索最终结果的方法用于下载数据集的URL。 index.jsp
文件似乎引用了一个看似有价值的javascript文件downloads/ea.downloads.js
,但我不确定如何找到它以了解我需要调用哪些函数。
理想情况下,第一个结果是data.frame
或data.table
,其中一列包含Product,另一列包含要为每个文件下载的文件的URL。这将是有用的,以便我可以随后循环遍历表的行并下载每个zip文件。
我认为这个AngularJS问题类似于这个问题
但是无法锻炼我的代码应该如何针对这个例子进行调整。
答案 0 :(得分:2)
我相信有更好的解决方案。这不是最终解决方案,而是一个开始。您正在查找的数据似乎存储在与主页面关联的JSON文件中。下载该文件后,您可以对其进行处理,以确定要下载的文件。
library(httr)
library(jsonlite)
#base URL for JSON file (found by examining files downloaded by page load)
curl <-'http://www.geostore.com/environment-agency/rest/product/OS_GB_10KM/TQ28?catalogName=Survey'
datafile<-GET(curl)
#process file and flatten to dataframe.
output<- content(datafile, as="text") %>% fromJSON(flatten=FALSE)
#examine this dataframe to identified desired files.
#baseurl was determined by manually downloading 1 file
baseurl<- "http://www.geostore.com/environment-agency/rest/product/download/"
#sample on downloading the file given the base URL and guid.
#random selecting row 49 to test the download.
download.file(paste0(baseurl, output$guid[49]), output$fileName[49], method="auto")
该网站的命名方案令人困惑,我会将其留给专家来确定其含义。
答案 1 :(得分:2)
Dave2e的解决方案略有扩展,演示了如何使用splashr
获取XHR JSON资源:
library(splashr) # devtools::install_github("hrbrmstr/splashr)
library(tidyverse)
splashr
需要一个Splash服务器,而pkg提供了一种使用Docker启动服务器的方法。阅读github pg和pkg内部的帮助,了解如何使用它。
vm <- start_splash()
URL <- "http://environment.data.gov.uk/ds/survey/index.jsp#/survey?grid=TQ38"
这将检索页面加载的所有资源:
splash_local %>% render_har(URL) -> resources # get ALL the items the page loads
stop_splash(vm) # we don't need the splash server anymore
这会将背景XHR资源定位为catalogName
。你最初仍然需要寻找这个,但是一旦你知道这个模式,这就变成了其他网格点的通用操作。
map_chr(resources$log$entries, c("request", "url")) %>%
grep("catalogName", ., value=TRUE) -> files_json
files_json
## [1] "http://www.geostore.com/environment-agency/rest/product/OS_GB_10KM/TQ38?catalogName=Survey"
请阅读:
guids <- jsonlite::fromJSON(files_json)
glimpse(guids)
## Observations: 98
## Variables: 12
## $ id <int> 170653, 170659, 170560, 170565, 178307, 178189, 201556, 238...
## $ guid <chr> "54595a8c-b267-11e6-93d3-9457a5578ca0", "63176082-b267-11e6...
## $ pyramid <chr> "LIDAR-DSM-1M-ENGLAND-2003-EA", "LIDAR-DSM-1M-ENGLAND-2003-...
## $ tileReference <chr> "TQ38", "TQ38", "TQ38", "TQ38", "TQ38", "TQ38", "TQ38", "TQ...
## $ fileName <chr> "LIDAR-DSM-1M-2003-TQ3580.zip", "LIDAR-DSM-1M-2003-TQ3585.z...
## $ coverageLayer <chr> "LIDAR-DSM-1M-ENGLAND-2003-EA-MD-YY", "LIDAR-DSM-1M-ENGLAND...
## $ fileSize <int> 76177943, 52109669, 59326278, 18048623, 13204420, 11919071,...
## $ descriptiveName <chr> "LIDAR Tiles DSM at 1m spatial resolution 2003", "LIDAR Til...
## $ description <chr> "1m", "1m", "1m", "1m", "1m", "1m", "1m", "1m", "1m", "1m",...
## $ groupName <chr> "LIDAR-DSM-TIMESTAMPED-ENGLAND-2003-EA", "LIDAR-DSM-TIMESTA...
## $ displayOrder <int> -100, -100, -100, -100, -100, -100, -100, -100, -100, -100,...
## $ metaDataUrl <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "https://data.g...
其余的与其他答案类似:
dl_base <- "http://www.geostore.com/environment-agency/rest/product/download"
urls <- sprintf("%s/%s", dl_base, guids$guid)
善待您的网络及其服务器:
walk2(urls, guids$fileName, download.file)
如果您认为您的系统及其服务器可以同时处理98个70-100MB文件,请执行此操作
download.file(urls, guids$fileName)