使用 RSelenium 和 Docker 容器下载数据(makeFirefoxProfile 和 mime 类型)

Downloading data using RSelenium & Docker containers (makeFirefoxProfile & mime types)

我每周需要从一个动态网站下载 50 多个数据集,我想在 R 中自动化这个过程。每个数据集来自不同的学校,每个学校都有自己的 link。各个学校网站的代码基本一致

我使用以下方法设置我的 docker 容器:

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()

学校 1 的网站 html 如下所示:

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

并且我使用以下方法从学校 1 网站成功下载了 csv 文件(数据集 A):

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

学校 2 的网站 html 如下所示:

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

但是当我 运行 R 代码时,学校 2 的数据集 A 没有出现在我的计算机上。

我实际上无法从该网站下载 任何东西 除了学校 1 的数据集 A。我什至无法从学校 1 下载数据集 B。我已尝试重新启动 docker、创建新的 docker 会话、重新启动我的计算机...将下载的唯一 csv 文件是学校 1 的数据集 A。

RSelenium 是否有一些限制,它只能下载您点击的第一个 link?我不知所措。我无法 link 该网站,因为它需要登录。

原来是每个网站的MIME类型不一样。对于学校 1 的数据集 A,我尝试下载的文件是标准的 csv 文件 (text/csv)。其他 schools/datasets 都是 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 才能下载它。

我还通过下载 Java 然后切换到 rsDriver() 放弃了 Docker,这样我就可以通过浏览器观看 R 的点击,而不是对每个步骤进行截图(这不是必需的)。

最后,我认为 browser.helperApps.neverAsk.openFilebrowser.helperApps.neverAsk.saveToDisk 的文件类型不应该相同,因为它们相互矛盾。因为我希望它自动保存文件,所以我只需要包含 browser.helperApps.neverAsk.saveToDisk.