10

このサイトから R を使用してデータをスクレイピングしようとしています: http://www.soccer24.com/kosovo/superliga/results/#

私は次のことができます:

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

しかし、実際にデータにアクセスする方法に困惑しています。これは、ウェブサイト上の実際のデータが Javascript によって生成されているように見えるためです。私にできることは

html_text(doc)

しかし、それは奇妙なテキストの長いぼやけを与えます(データは含まれていますが、奇妙なコードが散在しており、それをどのように解析するかはまったく明確ではありません.

抽出したいのは、すべての試合の試合データ (日付、時間、チーム、結果) です。このサイトのその他のデータは必要ありません。

このサイトからそのデータを抽出する方法について、誰かヒントを提供できますか?

4

1 に答える 1

12

Seleniumとの使用phantomjs

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

必要に応じてさらにフォーマットを実行します。

于 2015-04-03T14:20:41.747 に答える