首页 > 解决方案 > 在 R 中使用 JSON API 抓取和编译数据:所有可能的数据 ID 号

问题描述

我正在尝试从https://www.mountainproject.com/编译所有攀登路线信息,他们提供了一个 API 用于执行此操作https://www.mountainproject.com/data,但您需要知道具体的路线标识号即(“ https://www.mountainproject.com/data/get-routes?routeIds=IDNUMBER&key=PERSONAL-API-KEY ”)

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

我需要一种方法来遍历所有可能的路线 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

这工作正常,但真的很慢。任何以不同方式整理不相关数字或加快流程的帮助将不胜感激!

标签: rapi

解决方案


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


推荐阅读