使用 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.openFile
和 browser.helperApps.neverAsk.saveToDisk
的文件类型不应该相同,因为它们相互矛盾。因为我希望它自动保存文件,所以我只需要包含 browser.helperApps.neverAsk.saveToDisk
.
我每周需要从一个动态网站下载 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.openFile
和 browser.helperApps.neverAsk.saveToDisk
的文件类型不应该相同,因为它们相互矛盾。因为我希望它自动保存文件,所以我只需要包含 browser.helperApps.neverAsk.saveToDisk
.