使用 RSelenium 在 Windows 和 Mac 之间进行网页抓取
Using RSelenium for web scraping across Windows and Mac
我是网络抓取的新手,我已经成功地为多种不同类型的网站编写了函数,这些函数将我想要的信息收集到一个数据框中。尽管如此,这些函数是在 Mac 上使用 RSelenium 开发的。在我的 Windows PC 上尝试 运行 完全相同的功能时,它们失败了。
我认为问题与 RSelenium 的启动设置有关。以下是我在每个不同的网络抓取功能中启动 RSelenium 的方式:
rs <- rsDriver(browser = "firefox", port = netstat::free_port())
remote <- rs$client
remote$navigate(url)
在函数中执行此 R 代码后,这是我在将 Firefox 指定为 RSelenium 使用的浏览器时收到的结果错误:
Could not open firefox browser.
Client error message:
Undefined error in httr call. httr output: Failed to connect to localhost port 14415: Connection refused
Check server log for further details.
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
In addition: Warning message:
In rsDriver(browser = "firefox", port = netstat::free_port()) :
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
这是我在指定 Google Chrome 作为 RSelenium 使用的浏览器时收到的结果错误:
Could not open chrome browser.
Client error message:
Undefined error in httr call. httr output: Failed to connect to localhost port 14415: Connection refused
Check server log for further details.
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
In addition: Warning message:
In rsDriver(browser = "chrome", port = netstat::free_port()) :
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
同样,这些错误仅出现在 Windows PC 环境中,而不会出现在我的 Mac.
中
为了尝试解决这个问题,我搜索了 Stack Overflow 以寻找可能的答案。我已经切换了要使用的端口,例如 4444L,但无济于事。它会导致相同的错误。
当在我的 Windows PC 上 运行ning sessionInfo() 时,它产生以下输出:
R version 4.1.0 (2021-05-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] netstat_0.1.1 assertthat_0.2.1 jsonlite_1.7.2 webdriver_1.0.6 V8_3.4.2 RSelenium_1.7.7 rvest_1.0.0
[8] lubridate_1.7.10 forcats_0.5.1 stringr_1.4.0 dplyr_1.0.6 purrr_0.3.4 readr_1.4.0 tidyr_1.1.3
[15] tibble_3.1.2 ggplot2_3.3.3 tidyverse_1.3.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.6 binman_0.1.2 png_0.1-7 ps_1.6.0 utf8_1.2.1 showimage_1.0.0 R6_2.5.0
[8] cellranger_1.1.0 backports_1.2.1 reprex_2.0.0 httr_1.4.2 pillar_1.6.1 rlang_0.4.11 curl_4.3.1
[15] readxl_1.3.1 rstudioapi_0.13 callr_3.7.0 wdman_0.2.5 munsell_0.5.0 broom_0.7.6 compiler_4.1.0
[22] modelr_0.1.8 janitor_2.1.0 pkgconfig_2.0.3 askpass_1.1 base64enc_0.1-3 openssl_1.4.4 tidyselect_1.1.1
[29] XML_3.99-0.6 fansi_0.5.0 crayon_1.4.1 dbplyr_2.1.1 withr_2.4.2 bitops_1.0-7 grid_4.1.0
[36] gtable_0.3.0 lifecycle_1.0.0 DBI_1.1.1 magrittr_2.0.1 semver_0.2.0 scales_1.1.1 debugme_1.1.0
[43] cli_2.5.0 stringi_1.6.2 fs_1.5.0 snakecase_0.11.0 xml2_1.3.2 ellipsis_0.3.2 generics_0.1.0
[50] vctrs_0.3.8 tools_4.1.0 glue_1.4.2 hms_1.1.0 processx_3.5.2 colorspace_2.0-1 caTools_1.18.2
[57] haven_2.4.1
如何让 RSelenium 跨设备工作?
总的来说,这些问题似乎很普遍。
您无法从您的描述中真正判断出您的问题是什么。
可能的问题是 JAVA/browser 版本、selenium 版本……原因可能是多方面的——我猜您在研究错误时也已经发现了这一点。
可能的快速修复
您首先可以尝试安装最新的 Java 开发工具包 (JDK) 版本。
还要确保设置了 JAVA_HOME
环境,例如:
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk-15.0.1/")
我会试试这个作为快速修复。否则,如前所述,错误也可能是由 java / selenium, ... 版本的特定组合引起的。找到合适的版本可能很麻烦 - 这就是为什么如果此快速修复不起作用我会执行以下操作:
使用Docker
如果这不起作用,您可能应该改用 Docker。这也是 Rselenium 开发者或多或少推荐的:
Running a docker container standardises the build across OS’s and
removes many of the issues user may have relating to JAVA/browser
version/selenium version etc.
这是包文档的 link,他们在其中解释了如何将 Docker 用于 RSelenium。 (您安装 docker 并且他们提供 docker 配置的图像,这样 Rselenium 应该可以正常工作)
我是网络抓取的新手,我已经成功地为多种不同类型的网站编写了函数,这些函数将我想要的信息收集到一个数据框中。尽管如此,这些函数是在 Mac 上使用 RSelenium 开发的。在我的 Windows PC 上尝试 运行 完全相同的功能时,它们失败了。
我认为问题与 RSelenium 的启动设置有关。以下是我在每个不同的网络抓取功能中启动 RSelenium 的方式:
rs <- rsDriver(browser = "firefox", port = netstat::free_port())
remote <- rs$client
remote$navigate(url)
在函数中执行此 R 代码后,这是我在将 Firefox 指定为 RSelenium 使用的浏览器时收到的结果错误:
Could not open firefox browser.
Client error message:
Undefined error in httr call. httr output: Failed to connect to localhost port 14415: Connection refused
Check server log for further details.
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
In addition: Warning message:
In rsDriver(browser = "firefox", port = netstat::free_port()) :
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
这是我在指定 Google Chrome 作为 RSelenium 使用的浏览器时收到的结果错误:
Could not open chrome browser.
Client error message:
Undefined error in httr call. httr output: Failed to connect to localhost port 14415: Connection refused
Check server log for further details.
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
In addition: Warning message:
In rsDriver(browser = "chrome", port = netstat::free_port()) :
Error in checkError(res) :
Undefined error in httr call. httr output: length(url) == 1 is not TRUE
同样,这些错误仅出现在 Windows PC 环境中,而不会出现在我的 Mac.
中为了尝试解决这个问题,我搜索了 Stack Overflow 以寻找可能的答案。我已经切换了要使用的端口,例如 4444L,但无济于事。它会导致相同的错误。
当在我的 Windows PC 上 运行ning sessionInfo() 时,它产生以下输出:
R version 4.1.0 (2021-05-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] netstat_0.1.1 assertthat_0.2.1 jsonlite_1.7.2 webdriver_1.0.6 V8_3.4.2 RSelenium_1.7.7 rvest_1.0.0
[8] lubridate_1.7.10 forcats_0.5.1 stringr_1.4.0 dplyr_1.0.6 purrr_0.3.4 readr_1.4.0 tidyr_1.1.3
[15] tibble_3.1.2 ggplot2_3.3.3 tidyverse_1.3.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.6 binman_0.1.2 png_0.1-7 ps_1.6.0 utf8_1.2.1 showimage_1.0.0 R6_2.5.0
[8] cellranger_1.1.0 backports_1.2.1 reprex_2.0.0 httr_1.4.2 pillar_1.6.1 rlang_0.4.11 curl_4.3.1
[15] readxl_1.3.1 rstudioapi_0.13 callr_3.7.0 wdman_0.2.5 munsell_0.5.0 broom_0.7.6 compiler_4.1.0
[22] modelr_0.1.8 janitor_2.1.0 pkgconfig_2.0.3 askpass_1.1 base64enc_0.1-3 openssl_1.4.4 tidyselect_1.1.1
[29] XML_3.99-0.6 fansi_0.5.0 crayon_1.4.1 dbplyr_2.1.1 withr_2.4.2 bitops_1.0-7 grid_4.1.0
[36] gtable_0.3.0 lifecycle_1.0.0 DBI_1.1.1 magrittr_2.0.1 semver_0.2.0 scales_1.1.1 debugme_1.1.0
[43] cli_2.5.0 stringi_1.6.2 fs_1.5.0 snakecase_0.11.0 xml2_1.3.2 ellipsis_0.3.2 generics_0.1.0
[50] vctrs_0.3.8 tools_4.1.0 glue_1.4.2 hms_1.1.0 processx_3.5.2 colorspace_2.0-1 caTools_1.18.2
[57] haven_2.4.1
如何让 RSelenium 跨设备工作?
总的来说,这些问题似乎很普遍。
您无法从您的描述中真正判断出您的问题是什么。 可能的问题是 JAVA/browser 版本、selenium 版本……原因可能是多方面的——我猜您在研究错误时也已经发现了这一点。
可能的快速修复
您首先可以尝试安装最新的 Java 开发工具包 (JDK) 版本。
还要确保设置了 JAVA_HOME
环境,例如:
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk-15.0.1/")
我会试试这个作为快速修复。否则,如前所述,错误也可能是由 java / selenium, ... 版本的特定组合引起的。找到合适的版本可能很麻烦 - 这就是为什么如果此快速修复不起作用我会执行以下操作:
使用Docker
如果这不起作用,您可能应该改用 Docker。这也是 Rselenium 开发者或多或少推荐的:
Running a docker container standardises the build across OS’s and removes many of the issues user may have relating to JAVA/browser version/selenium version etc.
这是包文档的 link,他们在其中解释了如何将 Docker 用于 RSelenium。 (您安装 docker 并且他们提供 docker 配置的图像,这样 Rselenium 应该可以正常工作)