如何用R实现BirdLife Data Zone物种信息的自动化提取?
R代码自动化提取BirdLife Data Zone物种数据
前置准备
先安装并加载所需R包:
install.packages(c("rvest", "dplyr", "openxlsx", "httr")) library(rvest) library(dplyr) library(openxlsx) library(httr)
核心代码实现
替换target_species为你的目标物种科学名列表,即可批量提取分布国家、海拔范围等信息:
# 目标物种科学名列表(示例) target_species <- c("Passer montanus", "Haliaeetus albicilla") # 初始化结果数据框 result_df <- data.frame( 物种科学名 = character(), 分布国家 = character(), 分布海拔 = character(), stringsAsFactors = FALSE ) # 遍历每个物种 for (sp in target_species) { # 构造物种页面URL(BirdLife物种页固定格式:替换科学名空格为横杠) sp_clean <- gsub(" ", "-", tolower(sp)) url <- paste0("http://datazone.birdlife.org/species/factsheet/", sp_clean) # 添加延迟避免触发反爬机制 Sys.sleep(2) tryCatch({ # 模拟浏览器请求页面 page <- read_html(GET(url, user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"))) # 提取分布国家(通过XPath定位元素,需注意页面结构可能更新) range_countries <- page %>% html_element(xpath = "//div[h3[text()='Distribution']]/following-sibling::div//ul[contains(@class, 'list-inline')]") %>% html_text(trim = TRUE) # 提取分布海拔信息 elevation <- page %>% html_element(xpath = "//div[h3[text()='Habitat and Ecology']]/following-sibling::div//li[contains(text(), 'Altitude')]") %>% html_text(trim = TRUE) # 将结果存入数据框 result_df <- result_df %>% add_row( 物种科学名 = sp, 分布国家 = ifelse(is.na(range_countries), "未获取到数据", range_countries), 分布海拔 = ifelse(is.na(elevation), "未获取到数据", elevation) ) message(sp, " 数据提取完成") }, error = function(e) { message(sp, " 提取失败:", e$message) result_df <- result_df %>% add_row( 物种科学名 = sp, 分布国家 = "提取失败", 分布海拔 = "提取失败" ) }) } # 导出结果到Excel write.xlsx(result_df, "BirdLife物种数据提取结果.xlsx", rowNames = FALSE)
关键提示
- 页面结构适配:若后续代码无法提取数据,需用浏览器开发者工具重新定位元素的XPath或CSS选择器(BirdLife页面结构可能更新)。
- 合规爬取:严格遵守BirdLife Data Zone的使用条款,避免高频请求,可适当延长
Sys.sleep()的间隔时间。 - 物种名准确性:必须使用准确的物种科学名(大小写、空格格式正确),否则无法定位到对应物种页面。
内容的提问来源于stack exchange,提问作者PowellHall
相关产品推荐
相关产品推荐

