>source

모든 데이터를 pdf 또는 Excel로 다운로드하고 싶습니다 이 웹 사이트 의 각 주 X 자르기 X 표준 보고서 조합

이 자습서를 따라 원하는 것을 수행했습니다. URL에서 데이터 다운로드

그러나 두 번째 줄에서 오류가 발생했습니다.

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

이 데이터를 다운로드하는 데 사용할 수있는 대체 방법이 있습니까?


  • 답변 # 1

    먼저 웹 사이트에서 robots.txt가 있는지 확인하십시오. 그런 다음 이용 약관이있는 경우이를 읽으십시오. 아래 요청을 조절하는 것이 항상 중요합니다.

    모든 이용 약관을 확인한 후 아래 코드를 통해 시작하십시오 :

    library(httr)
    library(xml2)
    link <- "https://aps.dac.gov.in/LUS/Public/Reports.aspx"
    r <- GET(link)
    doc <- read_html(content(r, "text"))
    #write_html(doc, "temp.html")
    states <- sapply(xml_find_all(doc, ".//select[@name='DdlState']/option"), function(x)
        setNames(xml_attr(x, "value"), xml_text(x)))
    states <- states[!grepl("^Select", names(states))]
    years <- sapply(xml_find_all(doc, ".//select[@name='DdlYear']/option"), function(x)
        setNames(xml_attr(x, "value"), xml_text(x)))
    years <- years[!grepl("^Select", names(years))]
    rptfmt <- sapply(xml_find_all(doc, ".//select[@name='DdlFormat']/option"), function(x)
        setNames(xml_attr(x, "value"), xml_text(x)))
    stdrpts <- unlist(lapply(xml_find_all(doc, ".//td/a"), function(x) {
        id <- xml_attr(x, "id")
        if (grepl("^TreeView1t", id)) return(setNames(id, xml_text(x)))
    }))
    get_vs <- function(doc) sapply(xml_find_all(doc, ".//input[@type='hidden']"), function(x)
        setNames(xml_attr(x, "value"), xml_attr(x, "name")))
    fmt <- rptfmt[2] #Excel format
    for (sn in names(states)) {
        for (yn in names(years)) {
            for (srn in seq_along(stdrpts)) {
                s <- states[sn]
                y <- years[yn]
                sr <- stdrpts[srn]
                r <- POST(link,
                    body=as.list(c("__EVENTTARGET"="DdlState",
                        "__EVENTARGUMENT"="",
                        "__LASTFOCUS"="",
                        "TreeView1_ExpandState"="ennnn",
                        "TreeView1_SelectedNode"="",
                        "TreeView1_PopulateLog"="",
                        get_vs(doc),
                        DdlState=unname(s),
                        DdlYear=0,
                        DdlFormat=1)),
                    encode="form")
                doc <- read_html(content(r, "text"))
                treeview <- c("__EVENTTARGET"="TreeView1",
                    "__EVENTARGUMENT"=paste0("sStandard Reports\\", srn),
                    "__LASTFOCUS"="",
                    "TreeView1_ExpandState"="ennnn",
                    "TreeView1_SelectedNode"=unname(stdrpts[srn]),
                    "TreeView1_PopulateLog"="")
                vs <- get_vs(doc)
                ddl <- c(DdlState=unname(s), DdlYear=unname(y), DdlFormat=unname(fmt))
                r <- POST(link, body=as.list(c(treeview, vs, ddl)), encode="form")
                if (r$headers$`content-type`=="application/vnd.ms-excel")
                    writeBin(content(r, "raw"), paste0(sn, "_", yn, "_", names(stdrpts)[srn], ".xls"))
                Sys.sleep(5)
            }
        }
    }
    
    

  • 답변 # 2

    직장에서이 두 줄을 직접 실행 해 보았지만 다소 명확한 오류 메시지가 나타납니다.

    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.
    
    

    관리자 권한이없는 직장에서 R은 자식 프로세스를 만들 수 없기 때문일 수 있습니다.

    사실, 나는 RSelenium을 사용하여 봇을 만들려고 노력하면서 절대적으로 끔찍한 문제에 부딪쳤다. 와이즈 비즈  전혀 일관성이 없었고 계속 충돌했습니다. 나는 그것을 계속 실행하기 위해 오류 잡기와 함께 루프에 포함시켜야했지만 수동으로 기가 바이트의 임시 파일을 찾아서 삭제해야했습니다. Docker를 설치하려고 시도하고 설정을 수행하는 데 많은 시간을 보냈지 만 마침내 Windows 비전문가 버전에서는 지원되지 않았습니다.

    솔루션 : Python의 Selenium은 매우 잘 문서화되어 있으며 충돌하지 않으며 매력처럼 작동합니다. Anaconda의 대화식 Spyder 편집기의 코딩은 거의 R과 같습니다.

    물론 rsDriver() 와 같은 것을 사용할 수 있습니다  프로세스를 시작하고 원하는 경우 결과 파일을 R로 다시 가져 오려면 R에서 시작하십시오.

    편집 : Anaconda 또는 Selenium에는 관리자 권한이 전혀 필요하지 않습니다. 나는 직장에서 아무런 문제없이 직접 실행합니다. system("python myscript.py") 에 문제가있는 경우  나처럼 SSL 차단 명령은 pip install 를 사용하여 무시할 수 있습니다.  논쟁입니다.

  • 답변 # 3

    내 최선의 시도는 다음과 같습니다 :

    네트워크 활동을 살펴보면 게시물 요청이 전송 된 것을 볼 수 있습니다 :

    본문 데이터 요청 :

    아래로 스크롤하면 사용 된 양식 데이터가 표시됩니다.

    --trusted-host
    
    

    세션 관련 값이 있습니다 :

    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.
    
    

    그러나이 요청에 대한 시간 초과가 발생합니다.

    참고 :사이트에 robots.txt가없는 것 같습니다. 그러나 사이트 이용 약관을 확인하십시오.

  • 답변 # 4

    셀레늄은 웹 페이지에서 자바 스크립트를 실행해야 할 때 유용합니다. 자바 스크립트를 실행할 필요가없는 웹 사이트의 경우 (즉, 정보가 웹 페이지 HTML에 포함 된 경우) rvest 또는 httr이 최선의 방법입니다.

    귀하의 경우 파일을 다운로드하려면 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 ) 를 사용하십시오. 기본 R의 함수 인

    귀하의 질문에있는 웹 사이트가 현재 다운되었으므로 볼 수 없지만 다른 웹 사이트의 임의 파일을 사용하는 예는 다음과 같습니다

    download.file()
    
    

    작동하는지 확인

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

    웹 사이트의 구조에 따라 파일 URL 목록을 얻은 다음 R을 차례로 다운로드하여 반복 할 수 있습니다.

    마지막으로 추가 팁. 파일 형식과 파일에 따라 수행하는 작업에 따라 먼저 저장하지 않고 R로 직접 읽을 수 있습니다. 예를 들어 dir() # [1] "mygreatfile.pdf"  URL을 사용하여 read.csv() 를 직접 읽습니다.  웹에서. 다른 읽기 기능도 동일한 기능을 수행 할 수 있습니다.

    업데이트

    현재 사이트를 방문 할 때 내부 500 오류가 표시되지만 웨이 백 머신을 통해 사이트를 볼 수 있으므로 웹 페이지에 실제로 자바 스크립트가 있음을 알 수 있습니다. 사이트가 백업되어 실행 중이면 파일을 다운로드하려고 시도합니다

    csv

  • 이전 javascript - 위치 정보 기반 Json을 자동화하는 방법
  • 다음 validation - DataValidation Builder의 requireCheckbox