Мне нужно получить содержимое с этой страницы, содержащее некоторые скрипты: 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 = острой & локаль = де. Для других страниц, содержащих js, он работает нормально, но не тот, который мне нужен.
phantomjs.exe находится в корневом каталоге и успешно вызывается системным вызовом (win7 64 бит):
система ("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, текст: t ["name _" +e.root.navigation.lang], значение: t.version}} больше 30
https://grouper.swissdrg.org/packs/App-3dd15966701d9f6fd4db.js:1 in br Отказ от необработанного обещания TypeError: undefined не является конструктором (оценка "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. К сожалению, нет никакого способа установить тайм-аут для безголовочного Chrome в простом интерфейсе командной строки cmd, чтобы вы сейчас застряли с phantomjs.
Я бы предложил попробовать splashr
но вы на Windows, и splashr
требует Docker; альтернативно, decapitated
имеет оркестровый аналог gepetto
но для этого требуется nodejs; любой из этих комбо, похоже, является болезненным для тех, кто может работать над этой старой операционной системой.
V8
есть похожие проблемы с DLL, которую он использует в Windows для js vm) ,