Как использовать R для загрузки файла с веб-страницы, если на странице нет конкретного файла - PullRequest
0 голосов
/ 29 мая 2019

Есть ли какое-либо возможное решение для извлечения файла с любого веб-сайта, когда нет конкретного файла, загруженного с помощью download.file () в R.

У меня есть этот URL

https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=y&type=8&season=2016&month=0&season1=2016&ind=0

есть ссылка для экспорта файла CSV в мой рабочий каталог, но когда я щелкаю правой кнопкой мыши гиперссылку данных экспорта на веб-странице и выбираю адрес ссылки, получается следующий скрипт

javascript:__doPostBack('LeaderBoard1$cmdCSV','') 

вместоURL, который дает мне доступ к CSV-файлу.

Есть ли решение этой проблемы.

1 Ответ

0 голосов
/ 29 мая 2019

Вы можете использовать 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, чтобы получить консоль разработчика.В верхнем левом углу панели, которая появляется, есть маленький значок для выбора элементов:

enter image description here

Нажмите на него, а затем нажмите на элемент, который выwant:

enter image description here

Это подтянет (выделит) на панели «Элементы».Щелкните правой кнопкой мыши выделенную строку и нажмите «Копировать селектор».Вы также можете нажать «Копировать XPath», если хотите использовать XPath.

enter image description here

И это даст вам ваш код!

buttons <- browser$findElements(
  "#linkAccount > div > div.label-account",
  using = "css selector"
)
buttons[[1]]$clickElement()

Boom.

...