使用 rvest 抓取可折叠表的问题

Posted

技术标签:

【中文标题】使用 rvest 抓取可折叠表的问题【英文标题】:Issue scraping a collapsible table using rvest 【发布时间】:2021-09-19 02:34:17 【问题描述】:

我正在尝试从名为 APIS 的网站的多个可折叠表格中抓取信息。 我试图收集的一个例子是这里http://www.apis.ac.uk/select-feature?site=1001814&SiteType=SSSI&submit=Next

理想情况下,我希望能够让下拉标题后跟下面的信息,但在使用 rvest 时,我似乎无法从 html 中选择正确的部分。

我对 R 相当陌生,这是我通过观看一些关于抓取的视频所得到的:

link = "http://www.apis.ac.uk/select-feature?site=1001814&SiteType=SSSI&submit=Next"
page = read_html(link)

name = page %>% html_nodes(".tab-tables :nth-child(1)") %>% html_text()

“名称”值显示“字符(空)”

这可能是因为我是新手,并且有一个非常明显的答案,但我们将不胜感激

【问题讨论】:

【参考方案1】:

每个选项卡的数据来自您可以在按 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)

【讨论】:

以上是关于使用 rvest 抓取可折叠表的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 rvest 在 Twitter 中抓取用户视频

使用 rvest 迭代地抓取许多链接时找到标签的替代版本

rvest - 在 1 个标签中抓取 2 个类

使用RVest从网站抓取表格

Rvest 和 Google 新闻网页抓取:不起作用

用rvest抓取时没有数据