每个选项卡的数据来自您可以在按 F5 刷新页面时在浏览器网络选项卡中找到的其他请求。例如,营养素信息来自:
http://www.apis.ac.uk/sites/default/files/AJAX/srcl_2019/apis_tab_nnut.php?ajax=true&site=1001814&BH=&populateBH=true
您可以更一般地认为是:
scheme='http'
netloc='www.apis.ac.uk'
path='/sites/default/files/AJAX/srcl_2019/apis_tab_nnut.php'
params=''
query='ajax=true&site=1001814&BH=&populateBH=true'
fragment=''
因此,您可以向您在网络选项卡中看到的那些网址发出请求。
如果您想动态确定这些 url,然后像您一样向登录页面发出请求,然后从响应文本中正则表达式输出 url 的路径 (见上文)。这可以使用以下模式url: "(\\/sites\\/default\\/files\\/.*?)" 来完成。
然后您需要将协议 + 域(scheme 和 netloc)添加到基于着陆页协议和域的返回匹配项中。
还有一些额外的查询字符串参数,位于? 之后,如果从响应文本中重构 url,也可以动态检索这些参数。您可以在页面源代码中看到这些:
您可能希望为 Ajax 请求提取每个数据参数规范,例如使用data:\\s\\((.*?)\\), 然后有一个自定义函数,它将匹配项转换为所需的查询字符串后缀,以添加到先前检索到的 url。
类似于以下内容:
library(rvest)
library(magrittr)
library(stringr)
get_query_string <- function(match, site_code) {
string <- paste0(
"?",
gsub("siteCode", site_code, gsub('["{}]', "", gsub(",\\s+", "&", gsub(":\\s+", "=", match))))
)
return(string)
}
link <- "http://www.apis.ac.uk/select-feature?site=1001814&SiteType=SSSI&submit=Next"
page <- read_html(link) %>% toString()
links <- paste0("http://www.apis.ac.uk", stringr::str_match_all(page, 'url: "(\\/sites\\/default\\/files\\/.*?)"')[[1]][, 2])
params <- stringr::str_match_all(page, "data:\\s\\((.*?)\\),")[[1]][, 2]
site_code <- stringr::str_match_all(page, 'var siteCode = "(.*?)"')[[1]][, 2]
params <- lapply(params, get_query_string, site_code)
urls <- paste0(links, params)