Соскреб в сети с R и phantomjs с помощью небольшого js-скрипта, возвращающего ошибку

1

Мне нужно получить содержимое с этой страницы, содержащее некоторые скрипты: 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)")

Теги:
phantomjs

1 ответ

1
Лучший ответ

Более длительный тайм-аут может быть тем, что вам нужно. Мне пришлось использовать 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; любой из этих комбо, похоже, является болезненным для тех, кто может работать над этой старой операционной системой.

  • 0
    Спасибо за ваши большие усилия. Попробовал функцию другого Win 7 ПК. К сожалению, я до сих пор всегда получаю те же ошибки, что описаны выше. Возможно, вы используете ОС Linux?
  • 0
    Я запустил свою виртуальную машину Win 7 и убедился, что phantomjs выдает похожие ошибки, что, вероятно, означает, что она была скомпилирована с некоторыми неявными ограничениями из-за искалеченной природы Windows (у пакета V8 есть похожие проблемы с DLL, которую он использует в Windows для js vm) ,
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню