使用 R 抓取带有动态表的页面

问题描述 投票:0回答:1

我正在尝试使用 R (rvest) 从下一页抓取表格

https://www.nba.com/stats/players/passing?DateFrom=02/07/2024&DateTo=02/07/2024&dir=1

但是我注意到表格本身有 3 页,但是当我单击第二页和第三页时,URL 根本没有改变。

有人知道如何使用 R 从表中抓取 147 行吗?

我尝试了以下方法,但没有成功

page <- read_html("https://www.nba.com/stats/players/passing?DateFrom=02/07/2024&DateTo=02/07/2024&dir=1")
  
contentnodes <-page %>% html_nodes ("div.l-content.pre-quench") %>% 
    html_attr("q-data") %>% jsonlite::fromJSON()

提前致谢

r web-scraping rvest
1个回答
0
投票

我开始研究如何使用

rvest
实现这一点,但凭直觉,因为我确信 NBA.com 有一个 API,所以我寻找了一个使用该 API 的 R 包。我找到了一个,但每个函数都会给我一个错误。然而,它为你完成了 99% 的工作,所以即使它出错了......它也非常有用。

这是BLUF(底线,预先)......或者更流行的说法是什么?画一个空白...

我将从非常简短的答案开始,然后我将详细解释答案。

虚张声势

使用 NBAr 中的包和库,调用函数

get_tracking
。我使用了您在问题中使用的 URL 中的日期作为参数。

devtools::install_github("PatrickChodowski/NBAr")
library(NBAr)

# capture out - captures URL and error message
gimme <- capture.output(get_tracking(season = 2023, type = "Player", measure_type = "Passing", 
                                     date_from = "02/07/2024", date_to = "02/07/2024"))

接下来,我提供了一个取自背后代码的函数

get_tracking
(更多详细信息请参见“完整解释”)。

res <- rawToChar(GET(gimme[1], 
                     add_headers(.headers = c(
  'Referer' = 'http://google.com', 
  "User-Agent" = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
  'connection' = 'keep-alive',
  'Accept' = 'application/json',
  'Host' = 'stats.nba.com',
  'x-nba-stats-origin'= 'stats')))$content) %>% fromJSON()
df1 <- res$resultSets$rowSet %>% as.data.frame() %>% 
  setNames(tolower(unlist(res$resultSets$headers[1])))

df1
包含您想要抓取的 URL 中的全部 147 行。

完整解释

安装库和/或调用库。

devtools::install_github("PatrickChodowski/NBAr")
library(NBAr)

我使用了功能

get_tracking

当我调用它时,我使用了你问题中的url中的参数:

gimme <- capture.output(get_tracking(season = 2023, type = "Player", measure_type = "Passing", 
                                     date_from = "02/07/2024", date_to = "02/07/2024"))

该函数返回的是一个非常长 URL 和 [1]“无法将

replace
转换为匹配
data
的类型。”

该错误来自包内部名为

check_if_numeric
的函数。在包装方面并不是很难解决的问题,但没有必要回答你的问题。

result_sets_df
内部的对象
index
dataset
get_tracking
合并为我命名的
res
df1

调用

get_tracking
- 无参数、无括号或转到 Github 代码 将让您了解此函数的幕后情况。

res <- rawToChar(GET(gimme[1],    # code taken from `get_tracking`
                     add_headers(.headers = c(
  'Referer' = 'http://google.com', 
  "User-Agent" = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
  'connection' = 'keep-alive',
  'Accept' = 'application/json',
  'Host' = 'stats.nba.com',
  'x-nba-stats-origin'= 'stats')))$content) %>% fromJSON()
df1 <- res$resultSets$rowSet %>% as.data.frame() %>% 
  setNames(tolower(unlist(res$resultSets$headers[1])))

这返回了一个包含 147 行、18 个变量的数据集,与您问题中的 URL 中所需的数据相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.