Загрузка данных с использованием контейнеров RSelenium и Docker (типы makeFirefoxProfile и mime)

avatar
missgwolf
8 августа 2021 в 21:21
133
1
0

Мне нужно загружать более 50 наборов данных каждую неделю с динамического веб-сайта, и я хотел бы автоматизировать этот процесс в R. Каждый набор данных поступает из разных школ, каждая из которых имеет собственную ссылку. Код веб-сайта каждой школы практически идентичен.

Я настроил свой док-контейнер, используя:

docker run -d -p 4446:4444 -p 5902:5900 -v /C/Users/myusername/seldownloads:/home/seluser/Downloads selenium/standalone-firefox-debug

В R я настроил свой сеанс:

fprof <- makeFirefoxProfile(list(browser.download.dir = "home/seluser/Downloads",
                                 browser.download.folderList = 2L,
                                 browser.download.manager.showWhenStarting = FALSE,
                                 browser.helperApps.neverAsk.saveToDisk = "text/csv,application/vnd.ms-excel,application/vnd.ms-excel.addin.macroenabled.12,application/vnd.ms-excelsheet.binary.macroenabled.12,application/vnd.ms-excel.template.macroenabled.12,application/vnd.ms-excel.sheet.macroenabled.12,image/png,application/zip,application/pdf"))

#Start session
remDr <- remoteDriver(remoteServerAdd = "localhost",
                      browser = "firefox",
                      port = 4446L,
                      extraCapabilities = fprof)

remDr$open()

HTML-код веб-сайта школы 1 выглядит следующим образом:

<td class=bodytext><input class="btn btn-primary" name="exportData" type="submit" id="exportData" value="Export Data"></td>

И я успешно загрузил CSV-файл (набор данных A) с веб-сайта School 1, используя:

exportdata <- remDr$findElement(using="name", value="exportData")
exportdata$clickElement()

HTML-код веб-сайта School 2 выглядит следующим образом:

<td class=bodytext><input name="exportData" class="btn btn-primary" type="submit" id="exportData" value="Export Data"></td>

Но когда я запускаю код R, набор данных A из школы 2 не появляется на моем компьютере.

На самом деле я не могу что-либо загрузить с этого веб-сайта, кроме набора данных A из школы 1. Я даже не могу загрузить набор данных B из школы 1. Я пытался перезапустить докер , создание нового сеанса Docker, перезагрузка компьютера... единственный CSV-файл, который будет загружен, — это набор данных A из школы 1.

Существует ли какое-либо ограничение RSelenium, заключающееся в том, что он может загружать только первую ссылку, по которой вы щелкнете? Я в растерянности. Я не могу связать веб-сайт, так как для этого требуется вход в систему.

Источник

Ответы (1)

avatar
missgwolf
9 августа 2021 в 04:05
0

Оказалось, что типы MIME на каждом веб-сайте были разными. Для школы 1, набор данных A, файл, который я пытался загрузить, был стандартным CSV-файлом (text/csv). Все остальные школы/наборы данных были типами application/x-csv MIME.

Чтобы найти MIME-тип файла, который я пытался загрузить, я выполнил следующие действия: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Configuring_server_MIME_types.

Существует также известная ошибка при указании местоположения файла. Мой окончательный код выглядел так:

file_path <- getwd() %>% str_replace_all("/", "\\\\\\\\")

#Set download info for remoteDriver (aka, where to save datasets)
fprof <- makeFirefoxProfile(list(browser.download.dir = file_path,
                                 browser.download.folderList = 2L,
                                 browser.download.manager.showWhenStarting = FALSE,
                                 browser.helperApps.neverAsk.saveToDisk = "application/x-csv,attachment/csv,application/excel,text/csv,application/vnd.ms-excel,application/vnd.ms-excel.addin.macroenabled.12,application/vnd.ms-excelsheet.binary.macroenabled.12,application/vnd.ms-excel.template.macroenabled.12,application/vnd.ms-excel.sheet.macroenabled.12,image/png,application/zip,application/pdf"))

Обратите внимание, что я добавил application/x-csv,attachment/csv в список browser.helperApps.neverAsk.saveToDisk.

Важно: Стоит добавить application/csv в этот список. Я не делал этого здесь, но должен был сделать это при загрузке другого файла типа MIME text/html; charset=UTF-8, чтобы он загружался.

Я также отказался от Docker, загрузив Java, а затем переключившись на rsDriver(), чтобы вместо скриншотов каждого шага смотреть, как R щелкает в браузере (это не обязательно).

Наконец, я считаю, что у вас не должно быть одинаковых типов файлов для browser.helperApps.neverAsk.openFile и browser.helperApps.neverAsk.saveToDisk, потому что они противоречат друг другу. Поскольку я хотел, чтобы он автоматически сохранял файл, мне нужно было включить только browser.helperApps.neverAsk.saveToDisk.