R网络抓取检测单个国家的最高数值GADM.org级别

R网络抓取检测单个国家的最高数值GADM.org级别,r,web-scraping,geospatial,R,Web Scraping,Geospatial,如果您浏览gadm.org/country,选择一个国家和R空间多边形作为数据类型,您将获得该特定国家的可用gadm.org管理级别的下载集。可用水平因国家而异 有没有一种方法可以在不下载文件的情况下,通过一项功能按国家/地区获取可用级别(或最低地理级别、最高数字级别)? 理想情况下,我会有这样的代码(组成函数,而不是工作): 我为什么要这样做: 我希望能够在我创建的一个单独的函数中下载和删除gadm文件,允许在大量不同国家/地区的数据集之间循环,而不会占用磁盘空间(即数据集最多可以访问100个

如果您浏览gadm.org/country,选择一个国家和R空间多边形作为数据类型,您将获得该特定国家的可用gadm.org管理级别的下载集。可用水平因国家而异

有没有一种方法可以在不下载文件的情况下,通过一项功能按国家/地区获取可用级别(或最低地理级别、最高数字级别)?

理想情况下,我会有这样的代码(组成函数,而不是工作):

我为什么要这样做: 我希望能够在我创建的一个单独的函数中下载和删除gadm文件,允许在大量不同国家/地区的数据集之间循环,而不会占用磁盘空间(即数据集最多可以访问100个或更多国家/地区)。我们的想法是,所有国家的gadm提取水平都相同,这是一个最高的数字通用水平。因此,在为任何单个国家下载文件之前,我需要一份集合中所有国家可供下载的级别列表,以确定集合中最高的数值通用级别(即数据集中整个国家集合通用的最高数值gadm层)。然后我可以下载并删除gadm文件,而不是一次保存所有文件以确定它们之间的最高公共级别

想法

数据集延迟加载:我可以下载整个世界,并使用
grepl
对ID_uuu列中的na值进行检查,以仅获取以ID_uu和
开头的列(is.na())
获取上一个可用ID_uu的列,而不是按国家列出的所有na。然后,我需要将数据集放在我正在构建的包中(小但繁琐),并在我的函数中调用它。这是迄今为止我想到的最好的方法,但听起来很乏味

Web scrape:gadm.org用户界面显然使用cookies滚动到下载页面(下载链接页面不是静态链接)。但是,实际下载链接是静态的:即海地4级是静态的 理论上,我可以检查链接是否有效并增加adm#直到它不起作用,然后取最后一个有效的链接并使用substr提取级别。这听起来也不好玩,而且听起来很慢

WebScrape2:httr和rvest通过并保存cookies以进入下载链接页面,保存下载链接。这将是相当复杂的,因为可能会有一个关于R数据类型和国家等的post请求(啊!),并且在html链接之前很慢地完成这三个页面


有更好的想法吗?

rvest可以处理相对简单的POST表单,如下图所示,因此您只需在下一页中删除表单的每个值和可能的级别选择,即可构建国家和级别的数据框架

首先,在表单页面上打开一个rvest会话,并解析选择值(国家)以迭代:

库(tidyverse)
图书馆(rvest)
gadm_搜索%
html\u attr('值')
准备并存储表单(预先设置数据格式选择,但如果愿意,您可以在迭代时执行此操作):

gadm_form%html_form()%%>%.[1]]%%>%set_值(thm=“rds#R data”)
…然后迭代:

gadm\u级别%
head()%>%#现在足够了
地图(~{
系统睡眠(10)#每http://gadm.org/robots.txt
数据帧(国家=.x,
url=gadm\U表单%>%
设置_值(cnt=.x)%>%
提交表格(gadm搜索),%>%
html_节点('BA')%>%
html_attr('href'))
})
由于这可以获得URL,为了获得最高级别,您需要对URL进行一些分析和总结,例如

gadm\u级别%>%
变异(管理员级别=解析编号(基本名称(url))%>%
按(国家)划分的组别%>%
顶级(1,管理级别)%>%
选择(-url)
#>#tibble:6 x 2
#>#群体:国家[6]
#>国家行政级别
#>                                
#>1阿富汗武装部队3 2。
#>2 XAD_Akrotiri和Dhekelia_2 1。
#>3阿拉奥兰2 1。
#>4阿尔巴尼亚4 3。
#>5 DZA_阿尔及利亚2。
#>美属萨摩亚群岛。
这样做表明,选择末尾的数字似乎是max level+1,这意味着您只需刮取它们,而不必进行迭代:

gadm_水平2%
读取html()%>%
html_节点('select[name=“cnt”]option')%>%
html_attr('value')%%>%
数据框(国家=)%>%
单独(国家,c('iso3c','country','level'),sep=''.',convert=TRUE)%>%
变异(级别=级别-1L)
gadm_水平2
#>#A tibble:254 x 3
#>iso3c国家级
#>                      
#>1阿富汗武装部队2
#>2 XAD Akrotiri和Dhekelia 1
#>3阿拉奥兰1
#>4阿尔巴尼亚3
#>5 DZA阿尔及利亚2
#>6美属萨摩亚3
#>7和安道尔1
#>8年前安哥拉3
#>9 AIA安圭拉0
#>10.0
#> # ... 还有244行

不过,您应该验证数据的真实性。

biogeo.ucdavis上的FYI-Robots.txt,edu禁止访问/datar中已经有一个软件包可以删除数据,并且声明学术用途是免费的。查看Cran上的GADMTools另外,数据链接甚至不在robots.txt网站上,请自行查看并匹配链接(),无数据链接禁止数据存在于biogeo.ucdavis服务器上,其中/data被禁止:查看:虽然robots.txt文件很重要,但这些URL仅用于个人下载数据(b)其预期目的
getGADMmaxlevel("Nigeria")
[1] 2

getGADMmaxlevel("Haiti")
[1] 4

getGADMmaxlevel("Philippines")
[1] 3