2017-02-13 22 views
1

Использование R (при использовании пакетов rvest, jsonlite и httr) пытаюсь программно загрузить все файлы данных, доступные по следующему адресу:Webscrape таблицы на веб-сайтах, которые используют AngularJS с помощью R

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

I попытались использовать Chrome и использовать «Inspect», а затем Source для параметров загрузки, но он, как представляется, использует ng tables и AngularJS в качестве метода для получения окончательного URL-адреса для загрузки набора данных. Файл index.jsp, похоже, ссылается на файл javascript downloads/ea.downloads.js, который выглядит ценным, но я не уверен, как его найти, чтобы понять, какие функции мне нужно вызвать.

В идеале первым результатом будет data.frame или data.table со столбцом, в котором есть Продукт и столбец с URL-адресами файлов, которые будут загружены для каждого. Это было бы полезно, чтобы впоследствии я мог прокручивать строки таблицы и загружать каждый zip-файл.

Я думаю, что этот вопрос AngularJS похож на эти вопросы

web scrape with rvest

Но не тренировки, как мой код должен быть отрегулирован для данного примера.

+1

пакет 'splashr' от @hrbrmstr может быть полезен. вот виньетка: https://rud.is/b/2017/02/09/diving-into-dynamic-website-content-with-splashr/ – chinsoon12

ответ

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") 

Схема именования с сайта запутанна, я оставлю это экспертам для определения значения.

+0

Спасибо @ Dave2e! Это выглядит очень хорошо. Для будущего обучения я могу получить дополнительную информацию о том, что вы специально сделали для получения базового URL-адреса, путем изучения файлов, загружаемых загрузкой страницы. (то есть, как вы это сделали), а затем, как вы узнали, чтобы создать baseurl из «http://www.geostore.com/environment-agency/rest/product/download/» –

+0

См. ссылку выше от chinsoon, ссылка является хорошей ссылкой, и автор очень активен здесь, в stackoverflow. Ищите его сообщение/ответы. До базового URL я просто щелкнул ссылку, чтобы загрузить файл вручную, и история загрузки моего браузера сохранила URL-адрес файла. – Dave2e

+0

Хорошая работа @ Dave2e! Вы можете упростить первый бит, просто используя 'jsonlite :: fromJSON()' (нет необходимости в 'GET' /' content'. Я бы предложил использовать 'purrr :: walk2' +' download.file', чтобы последовательно получить я обычно бы делал 'download.file (URLS, FILES, method =" libcurl ")', но это гигантские медленные файлы, и их 88, а libcurl - ресурс жадный. Awesome сеанс веб-страницы spelunking полностью »round thol – hrbrmstr

2

Небольшое расширение на решение Dave2e в демонстрации того, как получить ресурс XHR JSON с splashr:

library(splashr) # devtools::install_github("hrbrmstr/splashr) 
library(tidyverse) 

splashr требует сервера Всплеск и PKG обеспечивает способ начать один с Докер. Прочтите справочную информацию по 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) 

Сделайте это, если считаете, что ваша система и их служба er может обрабатывать 98 одновременных загрузок файлов 70-100 МБ

download.file(urls, guids$fileName) 

 Смежные вопросы

  • Нет связанных вопросов^_^