Скрапинг веб-сайта javascript в R

Я хочу очистить время и дату матча с этого URL-адреса:

http://www.scoreboard.com/game/rosol-l-goffin-d-2014/8drhX07d/#game-summary

Используя инструменты chrome dev, я вижу, что это создается с использованием следующего кода:

<td colspan="3" id="utime" class="mstat-date">01:20 AM, October 29, 2014</td>

Но этого нет в исходном html.

Я думаю, это потому, что это java (поправьте меня, если я ошибаюсь). Как я могу очистить эту информацию с помощью R?


person Liam Flynn    schedule 29.10.2014    source источник
comment
Я не смотрел источник, но чаще всего ответом является RSelenium< /а>.   -  person jbaums    schedule 29.10.2014


Ответы (2)


Итак, RSelenium — не единственный ответ (уже). Если вы можете установить двоичный файл PhantomJS (загрузите двоичные файлы phantomjs отсюда: http://phantomjs.org/), то вы можете используйте его для рендеринга HTML и очистите его с помощью rvest (аналогично подходу RSelenium, но не требует java):

library(rvest)

# render HTML from the site with phantomjs

url <- "http://www.scoreboard.com/game/rosol-l-goffin-d-2014/8drhX07d/#game-summary"

writeLines(sprintf("var page = require('webpage').create();
page.open('%s', function () {
    console.log(page.content); //page source
    phantom.exit();
});", url), con="scrape.js")

system("phantomjs scrape.js > scrape.html", intern = T)

# extract the content you need
pg <- html("scrape.html")
pg %>% html_nodes("#utime") %>% html_text()

## [1] "10:20 AM, October 28, 2014"
person hrbrmstr    schedule 29.12.2014
comment
Я хотел бы отметить, что RSelenium позволяет вам управлять phantomjs, а также не требует java . - person jdharrison; 01.01.2015
comment
system("phantomjs scrape.js > scrape.html"), похоже, возвращает сценарий (HTML?) в console, а pg <- html("scrape.html") возвращает Error: 'scrape.html' does not exist in current working directory. Что мне не хватает? (У меня есть и scrape.js, и phantomjs.exe в моем wd) - person niko; 09.03.2018
comment
@nate.edwinton У меня была такая же проблема. Попробуйте sink("scrape.txt"); system("phantomjs scrape.js > scrape.html"); sink(); - person JdeMello; 11.03.2018
comment
У меня была такая же проблема, как у вас, и это сработало для меня. Тем не менее, я все еще не получил содержимое, отображаемое с помощью javascript, с веб-сайта, поэтому мне интересно, должен ли быть какой-либо дополнительный фрагмент кода в теле js-функции... - person JdeMello; 11.03.2018
comment
phantomJS больше не рекомендуется... phantomjs.org Что нам делать??? :( - person ℕʘʘḆḽḘ; 22.09.2018

Вы также можете использовать докер в качестве веб-драйвера (вместо селена)

Вам все равно нужно будет установить фантомы и докер. Затем запустите:

library(RSelenium)

url <- "http://www.scoreboard.com/game/rosol-l-goffin-d-2014/8drhX07d/#game-summary"

system('docker run -d -p 4445:4444 selenium/standalone-chrome') 
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L, browserName = "chrome")
remDr$open()
remDr$navigate(url)

writeLines(sprintf("var page = require('webpage').create();
page.open('%s', function () {
    console.log(page.content); //page source
    phantom.exit();
});", url), con="scrape.js")

system("phantomjs scrape.js > scrape.html", intern = T)

# extract the content you need
pg <- read_html("scrape.html")
pg %>% html_nodes("#utime") %>% html_text()

# [1] "10:20 AM, October 28, 2014"
person stevec    schedule 30.12.2018