【问题标题】:Scraping javascript website in R在 R 中抓取 javascript 网站
【发布时间】:2014-12-25 05:25:14
【问题描述】:

我想从这个 url 中抓取比赛时间和日期:

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

通过使用 chrome 开发工具,我可以看到这似乎是使用以下代码生成的:

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

但这不在源 html 中。

我认为这是因为它的 java(如果我错了,请纠正我)。如何使用 R 抓取这些信息?

【问题讨论】:

  • 我没有看源码,但答案往往是RSelenium

标签: javascript r screen-scraping rvest


【解决方案1】:

因此,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"

【讨论】:

  • 我会注意到 RSelenium 允许您驱动 phantomjs 并且不需要 java rpubs.com/johndharrison/RSelenium-headless
  • system("phantomjs scrape.js &gt; scrape.html") 似乎返回了console 中的 (HTML?) 脚本,而pg &lt;- html("scrape.html") 则返回了Error: 'scrape.html' does not exist in current working directory。我错过了什么? (我的 wd 中确实有 scrape.jsphantomjs.exe
  • @nate.edwinton 我遇到了同样的问题。试试sink("scrape.txt"); system("phantomjs scrape.js &gt; scrape.html"); sink();
  • 我遇到了和你一样的问题,它对我有用。但是,我仍然没有从网站上获得 javascript 渲染的内容,所以我想知道 js-function 正文中是否必须有任何额外的代码...
  • phantomJS 现已弃用...phantomjs.org 我们能做什么??? :(
【解决方案2】:

您也可以使用 docker 作为网络驱动程序(代替 selenium)

您仍然需要安装 phantomjs 和 docker。然后运行:

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"

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2014-04-07
    • 2018-09-13
    • 2020-12-24
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多