在R中使用JSON API抓取和编译数据:所有可能的数据ID号

时间:2019-07-24 20:17:14

标签: r api

我正在尝试编译https://www.mountainproject.com/中的所有攀登路线信息,他们为此提供了https://www.mountainproject.com/data的API,但是您需要知道特定的路线标识号,即(({https://www.mountainproject.com/data/get-routes?routeIds=IDNUMBER&key=PERSONAL-API-KEY “)

没有ID号列表,但它们似乎都落在105,000,000:118,000,000之内。总共应该有20万左右。

我需要一种方法来遍历所有可能的路线ID号,找出哪些是真实路线,下载数据,并将其添加到数据集(csv)

我编写了一个函数和循环来执行此操作,并且该函数和循环适用于少量可能的ID,但是对于所有13,000,000个可能的ID编号,我计算将需要一个月才能运行。

我无法以向量化的方式进行此操作,但我认为这可能是解决方案。

    library(jsonlite)

    #create the function to download the data

    getRouteData<-function(routeID){
      y<-paste0("https://www.mountainproject.com/data/get-routes?routeIds=",routeID,"&key=PERSONAL_API_KEY")
      y<-as.data.frame(fromJSON(y))
#delete some unnecessary columns 
      y[,-(c(9:13,16))]

    }

    #Make an empty data frame

    df <- data.frame(matrix(ncol = 10, nrow = 0))
    colnames(df) <- c("routes.id","routes.name","routes.type",
                      "routes.rating","routes.stars","routes.starVotes",
                      "routes.pitches","routes.location", 
                      "routes.longitude","routes.latitude" )

    #try for just 50 possible IDs

    for(i in 105759900:105759950){

      try(df<-rbind(getRouteData(i),df))

    }

    #that works but is slow
    df

那很好,但是真的很慢。感谢以其他方式来整理无关数字或加快流程的任何帮助!

1 个答案:

答案 0 :(得分:0)

Mountain Project提供了sitemap.xml,其中列出了一组文件(sitemap0.xml.gzsitemap1.xml.gzsitemap2.xml.gz等),这些文件包含其网站上的所有有效链接。您可以下载这些文件并遍历有效链接以提取所需的路径ID。每个路由链接的格式为https://www.mountainproject.com/route/######/route-name-here,其中######是查找路由ID的位置。