Использование R для автоматической загрузки данных - PullRequest
6 голосов
/ 11 ноября 2019

Я хочу загрузить все данные в формате pdf или в формате Excel для каждой комбинации Штатов X Crop Year X Standard Reports со этого сайта .

Я следовал этому руководству, чтобы делать то, что я хочу, Загрузка данных с URL

Однако я столкнулся с ошибкой во второй строке.

driver <- rsDriver()

Error in subprocess::spawn_process(tfile, ...) : 
group termination: could not assign process to a job: Access is denied

Есть ли альтернативные методы, которые я мог бы использовать для загрузки этих данных?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2019

Вот моя лучшая попытка:

Если вы посмотрите на сетевую активность, вы увидите отправленный запрос:

enter image description here

Данные тела запроса:

Если вы прокрутите вниз, вы увидите используемые данные формы.

body <- structure(list(`__EVENTTARGET` = "TreeView1", `__EVENTARGUMENT` = "sStandard+Reports%5C4", 
                       `__LASTFOCUS` = "", TreeView1_ExpandState = "ennnn", TreeView1_SelectedNode = "TreeView1t4", 
                       TreeView1_PopulateLog = "", `__VIEWSTATE` = "", `__VIEWSTATEGENERATOR` = "", 
                       `__VIEWSTATEENCRYPTED` = "", `__EVENTVALIDATION` = "", DdlState = "35", 
                       DdlYear = "2001", DdlFormat = "1"), .Names = c("__EVENTTARGET", 
                                                                      "__EVENTARGUMENT", "__LASTFOCUS", "TreeView1_ExpandState", "TreeView1_SelectedNode", 
                                                                      "TreeView1_PopulateLog", "__VIEWSTATE", "__VIEWSTATEGENERATOR", 
                                                                      "__VIEWSTATEENCRYPTED", "__EVENTVALIDATION", "DdlState", "DdlYear", 
                                                                      "DdlFormat"))

Существуют определенные значения, относящиеся к сеансу:

attr_names <- c("__EVENTVALIDATION", "__VIEWSTATEGENERATOR", "__VIEWSTATE", "__VIEWSTATEENCRYPTED")

Вы можете добавить их следующим образом:

setAttrNames <- function(attr_name){
  name <- doc %>% 
    html_nodes(xpath = glue("//*[@id = '{attr_name}']")) %>% 
    html_attr(name = "value")
  body[[attr_name]] <<- name
}

Затем вы можете добавить к этому сеансу определенные значения:

library(rvest)
library(glue)
url <- "https://aps.dac.gov.in/LUS/Public/Reports.aspx"

doc <- url %>% GET %>% content("text") %>% read_html
sapply(attr_names, setAttrNames)

Отправка запроса:

Затем вы можете отправить запрос:

response <- POST(
  url = url, 
  encode = "form", 
  body = body,
  hdrs
)
response$status_code # still indicates that we have an error in the request.

Последующие идеи:

  1. Я проверил наличие файлов cookie. Существует файл cookie сеанса, но он не требуется для запроса.

  2. Добавление заголовков.

Попытка установить заголовки запроса

header <- structure(c("aps.dac.gov.in", "keep-alive", "3437", "max-age=0", 
                      "https://aps.dac.gov.in", "1", "application/x-www-form-urlencoded", 
                      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36", 
                      "?1", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", 
                      "same-origin", "navigate", "https://aps.dac.gov.in/LUS/Public/Reports.aspx", 
                      "gzip, deflate, br", "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"), .Names = c("Host", 
                                                                                              "Connection", "Content-Length", "Cache-Control", "Origin", "Upgrade-Insecure-Requests", 
                                                                                              "Content-Type", "User-Agent", "Sec-Fetch-User", "Accept", "Sec-Fetch-Site", 
                                                                                              "Sec-Fetch-Mode", "Referer", "Accept-Encoding", "Accept-Language"
                      ))
hdrs <- header %>% add_headers
response <- POST(
  url = url, 
  encode = "form", 
  body = body,
  hdrs
)

Но я получаю тайм-аут для этого запроса.

Примечание: На сайте, похоже, нет файла robots.txt. Но ознакомьтесь с Условиями использования сайта.

1 голос
/ 13 ноября 2019

Я попытался запустить эти две строки сам на работе и получил несколько более явное сообщение об ошибке, чем вы.

Could not open chrome browser.
Client error message:
     Summary: UnknownError
     Detail: An unknown server-side error occurred while processing the command.
     Further Details: run errorDetails method
Check server log for further details.

error

Это может быть связано с тем, что если вы работаете без прав администратора, R не может создать дочерний процесс.

На самом деле, я сам сталкивался с совершенно ужасными проблемами, пытаясь построить бота с помощью RSelenium. rsDriver() не был последовательным и продолжал падать. Я должен был включить его в цикл с перехватом ошибок, чтобы он продолжал работать, но затем мне пришлось искать и удалять гигабайты временных файлов вручную. Я попытался установить Docker и потратил много времени на настройку, но, наконец, он не был поддержан в моем непрофессиональном выпуске Windows.

Решение: Selenium от Python хорошо документировано, никогда не падает, работает как шарм. Кодирование в интерактивном редакторе Spyder из Anaconda выглядит почти как R.

И, конечно, вы можете использовать что-то вроде system("python myscript.py") из R, чтобы запустить процесс и вернуть полученные файлы обратно. в R, если вы хотите.

РЕДАКТИРОВАТЬ: никаких прав администратора не требуется для Anaconda или Selenium. Я сам запускаю его без проблем с работы. Если у вас возникли проблемы с командами pip install, которые, как и я, заблокированы по протоколу SSL, вы можете обойти их, используя аргумент --trusted-host.

0 голосов
/ 16 ноября 2019

Selenium полезен, когда вы должны запустить javascript на веб-странице. Для веб-сайтов, для которых не требуется запуск JavaScript (т. Е. Если информация, которую вы запрашиваете, содержится в HTML веб-страницы), rvest или httr - ваши лучшие ставки.

В вашем случае, однако, чтобы загрузить файл, просто используйте download.file(), который является функцией в базе R.

Веб-сайт в вашем вопросе в настоящее время не работает (поэтому я не могусмотрите), но вот пример использования случайного файла с другого веб-сайта

download.file("https://cran.r-project.org/doc/contrib/Paradis-rdebuts_en.pdf", "mygreatfile.pdf")

Чтобы убедиться, что он работает

dir()
# [1] "mygreatfile.pdf"

В зависимости от структуры сайта, вы можетечтобы получить список URL файлов, затем переберите их в R, загружая один за другим.

Наконец, дополнительный совет. В зависимости от типа файла и того, что вы делаете с ними, вы можете прочитать их непосредственно в R (вместо того, чтобы сначала сохранить их). Например, read.csv() работает с URL-адресом для непосредственного чтения csv из Интернета. Другие функции чтения могут сделать то же самое.

Обновление

В настоящее время при посещении сайта я вижу внутреннюю ошибку 500, но я могу видеть сайт через механизм обратного хода , поэтому я могу видеть, что это действительно такJavaScript на веб-странице. Когда сайт снова заработает, я попытаюсь загрузить файлы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...