Вы можете использовать RSelenium
для подобных работ.Сценарий, приведенный ниже, работает для меня именно так, как есть, и также для вас, с незначительными правками, отмеченными в тексте.В решении используются два пакета: RSelenium
для автоматизации Chrome и here
для выбора активного каталога.
library(RSelenium)
library(here)
Вот предоставленный вами URL:
url <- paste0(
"https://www.fangraphs.com/leaders.aspx",
"?pos=all",
"&stats=bat",
"&lg=all",
"&qual=y",
"&type=8",
"&season=2016",
"&month=0",
"&season1=2016",
"&ind=0"
)
Вот идентификаторкнопки загрузки.Вы можете найти его, щелкнув правой кнопкой мыши по кнопке в Chrome и выбрав «Проверить».
button_id <- "LeaderBoard1_cmdCSV"
Мы собираемся автоматизировать Chrome для загрузки файла, и он перейдет к месту загрузки по умолчанию.В конце скрипта мы хотим переместить его в ваш текущий каталог.Итак, сначала давайте установим имя файла (для fangraphs.com ) и ваше местоположение загрузки (которое вы должны отредактировать при необходимости ):
filename <- "FanGraphs Leaderboard.csv"
download_location <- file.path(Sys.getenv("USERPROFILE"), "Downloads")
СейчасВы хотите начать сеанс браузера.Я использую Chrome, и указание этой конкретной версии Chrome (с использованием аргумента chromever
) работает для меня.YMMV;выберите лучший способ начать сеанс браузера.
Объект rsDriver
состоит из двух частей: сервера и клиента браузера.Большая часть магии происходит в клиенте браузера.
driver <- rsDriver(
browser = "chrome",
chromever = "74.0.3729.6"
)
server <- driver$server
browser <- driver$client
С помощью клиента браузера перейдите на страницу и нажмите эту кнопку.
Краткое примечание перед тем, как начать: RSelenium
может начатьсяищем кнопку и пытаемся нажать на нее, прежде чем есть что нажать.Поэтому я добавил несколько строк, чтобы посмотреть, как появляется кнопка, и затем нажмите ее, как только она появится.
buttons <- list()
browser$navigate(url)
while (length(buttons) == 0) {
buttons <- browser$findElements(button_id, using = "id")
}
buttons[[1]]$clickElement()
Затем подождите, пока файл не появится в папке загрузок, и переместите его втекущая директория проекта:
while (!file.exists(file.path(download_location, filename))) {
Sys.sleep(0.1)
}
file.rename(file.path(download_location, filename), here(filename))
Наконец, всегда очищайте свой сервер и клиент браузера, или RSelenium
становится изворотливым с вами.
browser$close()
server$stop()
И вы на своем веселом пути!
Обратите внимание, что вы не всегда будете использовать идентификатор элемента, и это нормально.Идентификаторы хороши тем, что они однозначно идентифицируют элемент, и для их использования практически не требуется знание языка сайта.Но если у вас нет идентификатора для использования, выше, где я указываю using = "id"
, у вас есть много других вариантов:
using = "xpath"
using = "css selector"
using = "name"
using = "tag name"
using = "class name"
using = "link text"
using = "partial link text"
Они дают вам тонну альтернатив и действительно позволяют вам идентифицировать что-либо на странице.findElements
всегда будет возвращать список.Если ничего не найти, этот список будет иметь нулевую длину.Если он найдет несколько элементов, вы получите их все.
Селекторы XPath и CSS, в частности, являются универсальными.И вы можете найти их, даже не зная, что вы делаете.Давайте рассмотрим пример с кнопкой «Войти» на этой странице, которая на самом деле не имеет идентификатора.
Запустите в Chrome довольно Ctrl + Shift + J, чтобы получить консоль разработчика.В верхнем левом углу панели, которая появляется, есть маленький значок для выбора элементов:
Нажмите на него, а затем нажмите на элемент, который выwant:
Это подтянет (выделит) на панели «Элементы».Щелкните правой кнопкой мыши выделенную строку и нажмите «Копировать селектор».Вы также можете нажать «Копировать XPath», если хотите использовать XPath.
И это даст вам ваш код!
buttons <- browser$findElements(
"#linkAccount > div > div.label-account",
using = "css selector"
)
buttons[[1]]$clickElement()
Boom.