Извлечение данных для всех экземпляров с динамического сайта - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь очистить данные во всех местоположениях спортзала с https://www.xercise4less.co.uk/find-a-gym/.

В Инструментах разработчика я нашел указатель на URL-адрес Web API, который должен хранить эту информацию в https://www.xercise4less.co.uk/Umbraco/Api/FindAGymApi/GetAll, но когда я запускаю его в браузере, я получаю

Типу ObjectContent`1 не удалось сериализовать тело ответа для типа содержимого text / xml;charset = utf-8 '

Точно так же, если я запускаю следующий код:

# user_agent argument is optional here and results are the same whether I include it or not 
httr::GET('https://www.xercise4less.co.uk/Umbraco/Api/FindAGymApi/GetAll',  httr::user_agent("httr"))

Есть идеи, как это сделать?

В качестве альтернативы,Я могу (почти) получить доступ ко всем идентификаторам спортзала по

library(rvest)
library(magrittr)

url <- "https://www.xercise4less.co.uk/find-a-gym/"
my_pg <- read_html(url) 
my_pg %>% html_nodes('select > option')

Но тогда я все еще не уверен в том, как перебрать все идентификаторы, чтобы получить полный список координат / местоположений. Спасибо за любые указатели.

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Вы в значительной степени там, вам просто нужно установить правильный заголовок запроса, ожидаемый сервером, тогда вы получите всю информацию для всех спортивных залов.

library(httr)

headers = c('Accept'='application/json, text/javascript, */*; q=0.01')
r <- content(httr::GET(url = 'https://www.xercise4less.co.uk/Umbraco/Api/FindAGymApi/GetAll', httr::add_headers(.headers=headers)))
print(r)
1 голос
/ 11 октября 2019

Этот код должен дать вам то, что вам нужно, или, по крайней мере, ближе к нему. Я воспользовался твоим вторым примером. Я бы наверное удалил первый ряд.

final <- as.character(my_pg %>% html_nodes('select > option'))
df <- data.frame(do.call(rbind, strsplit(final, '>', fixed=TRUE)), stringsAsFactors = FALSE)
df$X1 <-sapply(strsplit(df$X1, '=', fixed=TRUE), "[", 2 )
df$X1 <- gsub('[\"]', '', df$X1)

df$X2 <-sapply(strsplit(df$X2, '<', fixed=TRUE), "[", 1 )


df = subset(df, select = -c(X3) )

выход

    X1                             X2
1 <NA>              Select a location
2 1104        Xercise4Less Bolton Gym
3 1248      Xercise4Less Bradford Gym
4 1249 Xercise4Less Brierley Hill Gym
5 1250       Xercise4Less Bristol Gym
6 1251       Xercise4Less Burnley Gym
...