【问题标题】:rvest not able to grab html table using html_nodes("table"), despite table being on page尽管表格在页面上,rvest 无法使用 html_nodes("table") 抓取 html 表格
【发布时间】:2021-07-22 08:50:21
【问题描述】:

我们正在努力抢占this fangraphs link 的主桌。使用rvest:

url = 'https://www.fangraphs.com/leaders/splits-leaderboards?splitArr=1&splitArrPitch=&position=B&autoPt=false&splitTeams=false&statType=team&statgroup=2&startDate=2021-07-07&endDate=2021-07-21&players=&filter=&groupBy=season&sort=9,1'
table_nodes = url %>% read_html() %>% html_nodes('table')
table_nodes

 table_nodes
{xml_nodeset (7)}
[1] <table class="menu-standings-table"><tbody><tr>\n<td>\r\n                                            <div class="menu-sub-header">AL East</div>\r\n                       ...
[2] <table class="menu-team-table">\n<tr>\n<td>\r\n                                        <div class="menu-sub-header">AL East</div>\r\n                                     ...
[3] <table class="menu-team-table">\n<tr>\n<td>\r\n                                        <div class="menu-sub-header">AL East</div>\r\n                                     ...
[4] <table>\n<tr>\n<td><a href="http://www.fangraphs.com/blogs/top-45-prospects-baltimore-orioles">BAL</a></td>\n<td><a href="http://www.fangraphs.com/blogs/top-34-prospects ...
[5] <table>\n<tr>\n<td><a href="http://www.fangraphs.com/blogs/top-30-prospects-atlanta-braves">ATL</a></td>\n<td><a href="http://www.fangraphs.com/blogs/top-49-prospects-ch ...
[6] <table>\n<tr>\n<td><a href="http://www.fangraphs.com/blogs/top-40-prospects-baltimore-orioles">BAL</a></td>\n<td><a href="http://www.fangraphs.com/blogs/top-38-prospects ...
[7] <table>\n<tr>\n<td><a href="http://www.fangraphs.com/blogs/top-27-prospects-atlanta-braves">ATL</a></td>\n<td><a href="http://www.fangraphs.com/blogs/top-41-prospects-ch ...

这 7 个表格都不是包含所有不同球队统计数据的 URL 上的主表格。 url %&gt;% read_html() %&gt;% html_nodes('div.table-scroll') 返回一个空的节点集,div.table-scroll 是主表所在的包装 div。

编辑:我猜这是网络请求,但仍然不确定如何从中获取 API 调用。如何查看完整的 API 调用?

【问题讨论】:

  • 页面加载后,该表看起来是由 javascript 填充的(带有单独的请求)。没有对rvest 做太多事情,但我怀疑它可能无法处理动态内容。
  • 似乎确实如此。我在 Chrome 开发人员工具 > 网络 > XHR 中四处寻找,试图查看是否可以在其中找到一些东西来抓取该表,但找不到该表的数据来自哪里。
  • 我在页面源中看不到表格。 ps:表格右上角有一个Export Data按钮。
  • 是的,导出数据按钮很方便,但是我们正在寻找一种程序化的方法来抓取这个表格并在 R 中进行一些分析。我们正在尝试删除手动方面(还有其他表格可以抓取以及)。

标签: r web-scraping rvest


【解决方案1】:

从 API 调用中动态检索数据。当您需要发出包含开始/结束日期的 POST 请求时,切换到 httr。此外,在返回尽可能多的数据和尽可能少的调用方面切换到无限。

您想将以下内容转换为某种形式的接受日期参数的自定义函数。

library(httr)
library(purrr)

headers = c(
  'user-agent' = 'Mozilla/5.0',
  'content-type' = 'application/json;charset=UTF-8'
)

data = '{"strPlayerId":"all","strSplitArr":[1],"strGroup":"season","strPosition":"B","strType":"2","strStartDate":"2021-07-07","strEndDate":"2021-07-21","strSplitTeams":false,"dctFilters":[],"strStatType":"team","strAutoPt":"false","arrPlayerId":[],"strSplitArrPitch":[]}'

r <- httr::POST(url = 'https://www.fangraphs.com/api/leaders/splits/splits-leaders', httr::add_headers(.headers=headers), body = data) %>% content()

df <- map_df(r$data, data.frame)

【讨论】:

  • 谢谢,这太棒了。你怎么知道要发出这个特定的POST 请求?
  • 在按 F5 刷新页面时,我使用了浏览器网络选项卡 (F12 Chrome) 来监控网络流量。然后我在记录的活动中搜索分裂领导者,并使用预览响应来检查正确的请求。
  • 顺便说一句,您不需要引用标头。实际上只需要内容类型。
  • 好的,谢谢。我编辑了问题以快速显示 2 个屏幕截图。我找到了split-leaders 的网络请求,但不确定如何“使用预览响应检查正确的请求”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多