【问题标题】:stumped on how to scrape the data from this site (using R)不知道如何从这个网站上抓取数据(使用 R)
【发布时间】:2015-06-08 12:28:42
【问题描述】:

我正在尝试使用 R 从该站点抓取数据: http://www.soccer24.com/kosovo/superliga/results/#

我可以做到以下几点:

library(rvest)
doc <- html("http://www.soccer24.com/kosovo/superliga/results/")

但我不知道如何实际获取数据。这是因为网站上的实际数据似乎是由 Javascript 生成的。我能做的是

html_text(doc)

但这给出了很长一段奇怪的文本(其中确实包括数据,但散布着奇怪的代码,我完全不清楚我将如何解析它。

我要提取的是所有比赛的比赛数据(日期、时间、球队、结果)。不需要此站点的其他数据。

谁能提供一些关于如何从该站点提取数据的提示?

【问题讨论】:

  • 这是一次性的,还是需要定期进行?似乎复制/粘贴到文本编辑器中并进行一些小的修改可以让您滚动得更快,而不是深入研究代码。
  • 我会为此选择 RSelenium 路线。它将呈现页面,然后您可以直接访问 DOM 元素,而不是尝试在 &lt;div id="tournament-page-data-results"&gt; 中解码该数据块
  • @JasonV 这将定期进行。我想参加多项比赛,并且需要随着时间的推移保持最新状态。所以我绝对更喜欢非手动的解决方案。

标签: r web-scraping rvest rselenium


【解决方案1】:

Seleniumphantomjs 一起使用

library(RSelenium)
pJS <- phantom()
remDr <- remoteDriver(browserName = "phantomjs")
appURL <- "http://www.soccer24.com/kosovo/superliga/results/#"
remDr$open()
remDr$navigate(appURL)

如果你想按下更多数据按钮直到它不可见(所有匹配都假定显示):

webElem <- remDr$findElement("css", "#tournament-page-results-more a")
while(webElem$isElementDisplayed()[[1]]){
  webElem$clickElement()
  Sys.sleep(5)
  webElem <- remDr$findElement("css", "#tournament-page-results-more a")
}
doc <- htmlParse(remDr$getPageSource()[[1]])

删除不需要的圆形数据并使用XML::readHTMLTable为简单起见

# remove unwanted rounds html. Sometimes there are end of season extra games.
# These are presented in a seperate table.
invisible(doc["//table/*/tr[@class='event_round']", fun = removeNodes])
appData <- readHTMLTable(doc, which = seq(length(doc["//table"])-1), stringsAsFactors = FALSE, trim = TRUE)
if(!is.data.frame(appData)){appData <- do.call(rbind, appData)}
row.names(appData) <- NULL
names(appData) <- c("blank", "Date", "hteam", "ateam", "score")
pJS$stop()
> head(appData)
blank         Date           hteam            ateam score
1       01.04. 18:00     Ferronikeli          Ferizaj 4 : 0
2       01.04. 18:00          Istogu         Hajvalia 2 : 1
3       01.04. 18:00 Kosova Vushtrri Trepca Mitrovice 1 : 0
4       01.04. 18:00       Prishtina          Drenica 3 : 0
5       31.03. 18:00       Besa Peje            Drita 1 : 0
6       31.03. 18:00       Trepca 89       Vellaznimi 2 : 0

> tail(appData)
    blank         Date            hteam     ateam score
115       17.08. 22:00        Besa Peje Trepca 89 3 : 3
116       17.08. 22:00      Ferronikeli  Hajvalia 2 : 5
117       17.08. 22:00 Trepca Mitrovice   Ferizaj 1 : 0
118       17.08. 22:00       Vellaznimi   Drenica 2 : 1
119       16.08. 22:00  Kosova Vushtrri     Drita 0 : 1
120       16.08. 22:00        Prishtina    Istogu 2 : 1

根据需要进行进一步的格式化。

【讨论】:

  • 谢谢!代码的“remDr$getPageSource()”部分给出了一个错误(“fromJSON 中的错误(内容,处理程序,default.size,深度,allowComments,:无效的 JSON 输入”)。知道发生了什么吗?
  • 尝试安装RSelenium的开发版。 devtools::install_github("ropensci/RSelenium").
  • 嗨,约翰,效果很好!您如何如此快速而优雅地解决了这个问题,我完全惊呆了。一个快速的附加问题:如何让 RSelenium 激活“显示更多匹配”按钮(在数据表下方),以便包含所有结果? (现在从第 3 轮开始,但“显示更多匹配项”也会显示第 1 轮和第 2 轮)。
  • @PeterVerbeet 您可以按“显示更多匹配项”链接,直到它不可见。您可能需要多次按此键,因此我添加了一个 while 语句,该语句条件是元素可见。
  • 这绝对是完美的,@jdharrison。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多