Web使用rvest从交互式网站中刮取表格

时间:2019-07-24 00:59:44

标签: python r web web-scraping rvest

我正在尝试在此交互式网页上刮擦桌子 https://games.crossfit.com/leaderboard/open/2019?country_champions=0&division=1&citizenship=US&citizenship_display=United+States&sort=0&scaled=0&page=1

下面是我的原始代码:

url='https://games.crossfit.com/leaderboard/open/2019?country_champions=0&division=1&citizenship=US&citizenship_display=United+States&sort=0&scaled=0&page=1'
US_male=read_html(url)%>%
  html_nodes('#leaderboard')%>%
  html_nodes('div.lb-main.container')%>%
  html_nodes('div table')

完成此操作后,它返回{xml_nodeset(0)},但是如果我将其缩短为

US_male=read_html(url)%>%
  html_nodes('#leaderboard')%>%
  html_nodes('div.lb-main.container')

它返回

{xml_nodeset (1)}
[1] <div class="lb-main container"></div>

如果您检查网页,则<tbody>下有表格主体<table class="desktop athletes">的标签。我不明白为什么表格内容没有显示,我应该如何正确刮取表格?

无论您是使用R还是python,我都可以了解它是否可行。我会很感激的!

1 个答案:

答案 0 :(得分:0)

更简单的方法:

使用Rselenium(R)或Selenium(Python)。这两个软件包都利用Selenium,您可以在其中模拟执行所有javascript和AJAX请求的浏览器。

然后,您可以下载已解析的页面源,并使用rvestBeautifulSoup来解析HTML。

更糟的方式

在浏览器中使用开发人员工具,然后在“网络”标签中检查XHR内容。

例如,您想要的表实际上是以JSON格式发送到浏览器的。

https://games.crossfit.com/competitions/api/v1/competitions/open/2019/leaderboards?country_champions=0&division=1&citizenship=US&citizenship_display=United+States&sort=0&scaled=0&page=1

您可以比较URL查询参数并直接使用API​​提出自己的请求。

library(rvest)
library(httr)
url <- "https://games.crossfit.com/competitions/api/v1/competitions/open/2019/leaderboards?country_champions=0&division=1&citizenship=US&citizenship_display=United+States&sort=0&scaled=0&page=1"
response <- httr::GET(url,user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"))
data <- content(response,type = "application/json",as = "parsed")

剩下的工作只是将列表转换为数据框。