【发布时间】:2018-09-25 23:07:34
【问题描述】:
我是网络抓取的新手,我想获取这个网页的数据:http://www.neotroptree.info/data/countrysearch
在此链接中,我们看到四个字段(国家、域、州和站点)。
我有一个带有站点名称的数据框,我使用以下代码进行了抓取:
ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg))
install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}
ipak(c("rgdal", "tidyverse"))
#> Loading required package: rgdal
#> Loading required package: sp
#> rgdal: version: 1.3-4, (SVN revision 766)
#> Geospatial Data Abstraction Library extensions to R successfully loaded
#> Loaded GDAL runtime: GDAL 2.2.2, released 2017/09/15
#> Path to GDAL shared files: /usr/share/gdal/2.2
#> GDAL binary built with GEOS: TRUE
#> Loaded PROJ.4 runtime: Rel. 4.9.2, 08 September 2015, [PJ_VERSION: 492]
#> Path to PROJ.4 shared files: (autodetected)
#> Linking to sp version: 1.3-1
#> Loading required package: tidyverse
#> rgdal tidyverse
#> TRUE TRUE
download.file(url = "http://www.neotroptree.info/files/Neotropicos.kmz",
destfile = "neotroptree-site.kmz",
quiet = FALSE)
rgdal::ogrListLayers("neotroptree-site.kmz")
#> [1] "Neotropicos"
#> [2] "Jubones, Quito, Pichincha, Ecuador"
#> attr(,"driver")
#> [1] "LIBKML"
#> attr(,"nlayers")
#> [1] 2
ntt <- rgdal::readOGR("neotroptree-site.kmz", "Neotropicos")
#> OGR data source with driver: LIBKML
#> Source: "/tmp/Rtmppf54qE/neotroptree-site.kmz", layer: "Neotropicos"
#> with 7504 features
#> It has 11 fields
ntt.df <- data.frame(site = ntt@data$Name,
long = ntt@coords[, 1],
lat = ntt@coords[, 2]) %>%
.[order(.$site), ] %>%
mutate(., ID = rownames(.)) %>%
mutate(., site = as.character(site))
ntt.df <- ntt.df[, c("ID", "site", "long", "lat")]
glimpse(ntt.df)
#> Observations: 7,504
#> Variables: 4
#> $ ID <chr> "2618", "2612", "3229", "2717", "2634", "4907", "3940", "...
#> $ site <chr> "Abadia, cerrado", "Abadia, floresta semidecidual", "Abad...
#> $ long <dbl> -43.15000, -43.10667, -48.72250, -45.52493, -45.27417, -4...
#> $ lat <dbl> -17.690000, -17.676944, -16.089167, -19.111667, -19.26638...
手动,我需要:
- 用数据框站点列中的每个名称填写“站点”字段,获取结果,然后转到“站点详细信息”链接
- 从“下载站点详细信息”链接获取数据。
我的第一次尝试是使用rvest 包,但它无法在网页内找到表单字段。
if(!require("rvest")) install.packages("rvest")
#> Loading required package: rvest
#> Loading required package: xml2
url <- "http://www.neotroptree.info/data/countrysearch"
webpage <- html_session(url)
webpage %>%
html_form()
#> list()
对如何迭代这个过程有什么想法吗?
【问题讨论】:
-
由于您需要同时选择站点详细信息和下载按钮,我建议使用 RSelenium。
-
RSelenium 对这个 IMO 来说是一个严重的过度杀伤
标签: r web-scraping rvest