从动态网站提取所有实例的数据

时间:2019-10-11 13:42:28

标签: r web-scraping rvest httr

我正在尝试从https://www.xercise4less.co.uk/find-a-gym/抓取所有健身房位置的数据。

在开发人员工具中,我找到了指向Web API URL的指针,该URL应该在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"))

关于如何解决这个问题的任何想法?

或者,我可以(几乎)通过

访问所有健身房ID。
library(rvest)
library(magrittr)

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

但是我仍然不确定如何遍历所有ID以获得完整的坐标/位置列表。 感谢您的指导。

2 个答案:

答案 0 :(得分:2)

您几乎就在那儿,只需要设置服务器期望的正确请求标头,即可获取所有体育馆的所有信息。

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 :(得分:1)

此代码应该为您提供所需的东西,或者至少接近您的需求。我背负着你的第二个例子。我可能会删除第一行。

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