使用R从Reptile数据库抓取数据时如何提取目标物种页面链接
问题原因
现有代码无法提取到目标链接的核心原因有两个:
- 错误设置请求编码为
json:该站点高级搜索接口仅支持标准表单格式(application/x-www-form-urlencoded)提交参数,JSON格式的请求体不会被服务端识别,相当于提交了空的搜索请求 - 未开启重定向跟随:合法搜索请求提交后,服务端会返回302状态码跳转到结果页,默认
POST配置不会自动跳转,拿到的响应只是中间跳转页内容,自然找不到目标物种链接
修正代码
需要先安装依赖包rvest用于HTML内容解析,完整可运行代码如下:
library(httr) library(rvest) library(tidyverse) # 提交搜索请求 res <- POST( url = "http://reptile-database.reptarium.cz/advanced_search", encode = "form", body = list( genus = "Chamaeleo", species = "dilepis", submit = "Search" ) ) # 跟随重定向到结果页 res <- GET( url = headers(res)$location, config = set_cookies(res$cookies) ) # 解析页面提取物种详情链接 page <- read_html(res) target_link <- page %>% html_element(xpath = "//a[contains(@href, 'species?genus=Chamaeleo&species=dilepis')]") %>% html_attr("href") %>% paste0("https://reptile-database.reptarium.cz/", .)
优化建议
- 批量爬取时不需要每次走高级搜索接口,可以直接按照
species?genus=[属名]&species=[种名]的格式拼接目标详情页URL,请求效率更高 - 控制请求频率,单次请求后添加
Sys.sleep(2)间隔2秒,避免触发站点反爬限制 - 提取图片时直接解析详情页内的
<img>标签,筛选和物种相关的图片资源地址即可,注意补全相对路径为完整可访问链接
内容的提问来源于stack exchange,提问作者Agus camacho
相关产品推荐
相关产品推荐

