使用R使用AngularJS的网站上的Webscrape表

时间:2017-02-13 16:11:16

标签: angularjs r web-scraping rvest

使用R(使用包rvestjsonlitehttr时)尝试以编程方式下载以下网址提供的所有数据文件:

http://environment.data.gov.uk/ds/survey/index.jsp#/survey?grid=TQ38

我尝试使用Chrome并使用“Inspect”然后使用Source获取下载选项,但它似乎使用ng tablesAngularJS作为检索最终结果的方法用于下载数据集的URL。 index.jsp文件似乎引用了一个看似有价值的javascript文件downloads/ea.downloads.js,但我不确定如何找到它以了解我需要调用哪些函数。

理想情况下,第一个结果是data.framedata.table,其中一列包含Product,另一列包含要为每个文件下载的文件的URL。这将是有用的,以便我可以随后循环遍历表的行并下载每个zip文件。

我认为这个AngularJS问题类似于这个问题

web scrape with rvest

但是无法锻炼我的代码应该如何针对这个例子进行调整。

2 个答案:

答案 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)