使用 R 和 phantomjs 进行 Web 抓取,使用一个小的 js 脚本返回错误



我需要从包含一些脚本的页面获取内容: https://grouper.swissdrg.org/swissdrg/single?version=7.3&pc=1337_70_0_0_M_11_00_15_0_2018/08/07_2018/08/22_C18.4_C07_-_45.81.11$$&provider=acute&locale=de。 对于包含js的其他页面,它工作正常,但不适用于我需要的页面。

PhantomJS.exe 位于根 directoy 中,并由系统调用(Win7 64 位(成功调用:

system("phantomjs WebScrapeV1.js"(

java脚本文件WebScrapeV1.js如下所示:

var url ='https://grouper.swissdrg.org/swissdrg/single?version=7.3&pc=1337_70_0_0_M_11_00_15_0_2018/08/07_2018/08/22_C18.4_C07_-_45.81.11$$&provider=acute&locale=de';
var page = new WebPage()
var fs = require('fs');
page.open(url, function (status) {
just_wait();
});
function just_wait() {
setTimeout(function() {
fs.write('WebScrapeV1.html', page.content, 'w');
phantom.exit();
}, 2500);
}

这是我得到的错误:

错误: [mobx.array] 索引超出界限,函数 (t( {return{key:t.version,text:t["name_"+e.root.navigation.lang],value:t.version}} 大于 30

https://grouper.swissdrg.org/packs/App-3dd15966701d9f6fd4db.js:1 在 BR 未处理的承诺拒绝类型错误:未定义不是构造函数(评估"n.push(this.pdx("(

更长的超时可能是您需要的。我不得不使用3600来获取所有内容(那个网站对我来说超级慢(。这是一种在发生错误时修改超时的方法,而无需手动修改 phantomjs 脚本。

首先,我们将创建一个函数来包装所有的复杂性:

#' Read contents from a URL with phantomjs
#' 
#' @param url the URL to scrape
#' @param timeout how long to wait, default is `2500` (ms)
#' @param .verbose, if `TRUE` (the default), display the generated 
#'        scraping script and any `stdout` output from phantomjs
read_phantom <- function(url, timeout=2500, .verbose = TRUE) {
suppressPackageStartupMessages({
require("glue", character.only = TRUE, quiet=TRUE)
require("crayon", character.only = TRUE, quiet=TRUE)
})
phantom_template <- "
var url = {url};
var page = new WebPage()
var fs = require('fs');
page.open(url, function (status) {{
just_wait();
});
function just_wait() {{
setTimeout(function() {{
fs.write({output_file}, page.content, 'w');
phantom.exit();
}, {timeout});
}
" 
url <- shQuote(url)
phantom_bin <- Sys.which("phantomjs")
tf_in <- tempfile(fileext = ".js")
on.exit(unlink(tf_in), add=TRUE)
tf_out <- tempfile(fileext = ".html")
on.exit(unlink(tf_out), add=TRUE)
output_file <- shQuote(tf_out)
phantom_script <- glue(phantom_template)
if (.verbose) {
cat(
crayon::white("Using the following generated scraping script:n"),
crayon::green(phantom_script), "n", sep=""
)
}
writeLines(phantom_script, tf_in)
system2(
command = phantom_bin, 
args = tf_in,
stdout = if (.verbose) "" else NULL
)
paste0(readLines(tf_out, warn = FALSE), collapse="n")
}

现在,我们将使用超时时间更长的 URL:

read_phantom(
url = "https://grouper.swissdrg.org/swissdrg/single?version=7.3&pc=1337_70_0_0_M_11_00_15_0_2018/08/07_2018/08/22_C18.4_C07_-_45.81.11$$&provider=acute&locale=de",
timeout = 3600
) -> doc
substr(doc, 1, 100)
## [1] "<html><head>n<script src="https://js-agent.newrelic.com/nr-1071.min.js"></script><script type=" text"
nchar(doc)
## [1] 26858

请注意,phantomjs被认为是一个遗留工具,因为自从无头Chrome出现以来,主要开发人员已经离开了。不幸的是,没有办法在简单的cmd行界面中为无头Chrome设置超时,所以你现在有点被phantomjs困住了。

我建议尝试splashr但你使用的是Windows,splashr需要Docker;或者,decapitated有一个编排对应物gepetto但这需要nodejs;这些组合中的任何一个对于May的人来说似乎都是痛苦的。

相关内容

  • 没有找到相关文章

最新更新