Использование R для имитации «нажатия» кнопки загрузки файла на веб-странице - PullRequest
0 голосов
/ 08 июля 2019

Есть 2 части моих вопросов, так как я исследовал 2 метода в этом упражнении, но мне это не удалось. Очень признателен, если кто-то может мне помочь.

[ЧАСТЬ 1:]

Я пытаюсь очистить данные с веб-страницы на Сингапурской фондовой бирже https://www2.sgx.com/derivatives/negotiated-large-trade, содержащей данные, хранящиеся в таблице. У меня есть некоторые базовые знания о соскобе данных с помощью (Rvest). Однако, используя Inspector на Chrome, иерархия html намного сложнее, чем я ожидал. Я вижу, что нужные мне данные скрыты в

, и вот что я связал:
library(rvest)
library(httr)
library(XML)
SGXurl <- "https://www2.sgx.com/derivatives/negotiated-large-trade"
SGXdata <- read_html(SGXurl, stringsASfactors = FALSE)
html_nodes(SGXdata,".table-container")

Однако код ничего не обнаружил, и я сомневаюсь, что я правильно использую этот код.

[ЧАСТЬ 2:]

Поскольку я понимаю, что на странице есть небольшая кнопка "скачать", которая может загрузить именно тот файл данных, который мне нужен, в формате .csv. Поэтому я подумал написать код, имитирующий кнопку загрузки, и нашел этот вопрос Использование R для «нажатия» кнопки загрузки файла на веб-странице , но я не могу заставить ее работать с некоторыми модификации этого кода.

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

library(httr)
library(rvest)
library(purrr)
library(dplyr)

crawlSGXdata = function(date){

POST("https://www2.sgx.com/derivatives/negotiated-large-trade", 
     body = NULL
     encode = "form",
     write_disk("SGXdata.csv")) -> resfile
res = read.csv(resfile)
return(res) 
}

Я собирался поместить входную функцию "date" в аргумент "body", однако я не смог понять, как это сделать, поэтому я начал с "body = NULL", предполагая, что это не сработает. любая фильтрация. Однако результат все еще неудовлетворителен. Загрузка файла в основном пуста со следующей ошибкой:

Request Rejected
The requested URL was rejected. Please consult with your administrator.
Your support ID is: 16783946804070790400

1 Ответ

0 голосов
/ 08 июля 2019

Контент загружается динамически из вызова API, возвращающего json.Вы можете найти это на вкладке сети с помощью инструментов разработчика.

Следующее возвращает этот контент.Я нахожу общее количество страниц результатов и цикл, объединяющий фрейм данных, возвращаемый после каждого вызова, в один финальный фрейм данных, содержащий все результаты.

library(jsonlite)

url <- 'https://api.sgx.com/negotiatedlargetrades/v1.0?order=asc&orderby=contractcode&category=futures&businessdatestart=20190708&businessdateend=20190708&pagestart=0&pageSize=250'
r <-  jsonlite::fromJSON(url)
num_pages <- r$meta$totalPages
df <- r$data
url2 <- 'https://api.sgx.com/negotiatedlargetrades/v1.0?order=asc&orderby=contractcode&category=futures&businessdatestart=20190708&businessdateend=20190708&pagestart=placeholder&pageSize=250'

if(num_pages > 1){
  for(i in seq(1, num_pages)){
    newUrl <- gsub("placeholder", i , url2)
    newdf <- jsonlite::fromJSON(newUrl)$data
    df <- rbind(df, newdf)
  }
}
...