html - 使用 R 和 rvest 抓取网页表
问题描述
我是使用 R 进行网络抓取的新手。我正在尝试抓取此链接生成的表格: https ://gd.eppo.int/search?k=saperda+tridentata 。在这种特定情况下,它只是表中的一条记录,但可能更多(我实际上对第一列感兴趣,但整个表都可以)。
我尝试遵循 Allan Cameron 在此处给出的建议(rvest, table with thead 和 tbody 标签),因为问题似乎完全相同,但可能因为我对网页的工作原理知之甚少而没有成功。我总是得到一个“无数据”表。也许我没有正确遵循建议的步骤“# Get the JSON as plain text from the link generated by Javascript on the page”。我在哪里可以得到这个链接?在这种特定情况下,我使用了“ https://gd.eppo.int/media/js/application/zzsearch.js?7 ”,是这个吗?
下面你有我的代码。先感谢您!
library(httr)
library(rlist)
library(rvest)
library(jsonlite)
library(dplyr)
pest.name <- "saperda+tridentata"
url <- paste("https://gd.eppo.int/search?k=",pest.name, sep="")
resp <- GET(url) %>% content("text")
json_url <- "https://gd.eppo.int/media/js/application/zzsearch.js?7"
JSON <- GET(json_url) %>% content("text", encoding = "utf8")
table_contents <- JSON %>%
{gsub("\\\\n", "\n", .)} %>%
{gsub("\\\\/", "/", .)} %>%
{gsub("\\\\\"", "\"", .)} %>%
strsplit("html\":\"") %>%
unlist %>%
extract(2) %>%
substr(1, nchar(.) -2) %>%
paste0("</tbody>")
new_page <- gsub("</tbody>", table_contents, resp)
read_html(new_page) %>%
html_nodes("table") %>%
html_table()
解决方案
数据来自刷新页面时您可以在网络选项卡中看到的另一个端点。您可以在参数中发送带有搜索短语的请求,然后从响应中提取所需的 json。
library(httr)
library(jsonlite)
params = list('k' = 'saperda tridentata','s' = 1,'m' = 1,'t' = 0)
r <- httr::GET(url = 'https://gd.eppo.int/ajax/search', query = params)
data <- jsonlite::parse_json(r %>% read_html() %>% html_node('p') %>%html_text())
print(data[[1]]$e)
推荐阅读
- signals - 如何在“信号”块中调用方法?
- c - C中的printf与具有较短初始化程序的字符串的行为很奇怪
- amazon-web-services - JanusGraph:从 EC2 访问 Amazon Managed Cassandra
- sql - SQL - 一起使用dense_rank和group by
- c++ - 无法在程序集中链接 c++ 函数
- google-compute-engine - 无法连接到我的 Compute Engine 实例 - IP 被阻止?
- typescript - Mongoose $push 打字稿错误
- reactjs - 如何解决“您可能需要适当的加载程序来处理此文件类型,目前没有配置加载程序来处理此文件。”?
- c# - 将 .Net Core 3.0.0 升级到 3.1.3 后 Startup.cs ConfigureServices 中的 BuildServiceProvider 警告
- docker - 从 docker 注册 gitlab-runner 到 gitlab