【问题标题】:Extract data for all the instances from a dynamic website从动态网站中提取所有实例的数据
【发布时间】:2019-10-11 13:42:28
【问题描述】:

我正在尝试从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”的响应正文;字符集=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 以获得完整的坐标/位置列表。 感谢您的任何指点。

【问题讨论】:

    标签: r web-scraping rvest httr


    【解决方案1】:

    你几乎在那里,你只需要设置服务器期望的正确请求标头,然后你就可以获得所有健身房的所有信息。

    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)
    

    【讨论】:

    • 这太棒了,非常感谢!你是如何确定合适的标题的?我通常会选择'Accept'='application/json
    • 我在搜索特定健身房时通过开发工具观察了网络流量,然后尝试删除标题,直到获得绝对需要的标题。
    【解决方案2】:

    这段代码应该可以满足您的需求,或者至少更接近它。我捎带了你的第二个例子。我可能会删除第一行。

    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
    

    【讨论】:

    • 谢谢您,虽然不能完全回答我的问题,但此格式代码将来会很有用,干杯!
    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多