Как загрузить файл за полусломанной функцией asp javascript с помощью R

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

На этой веб-странице — http://www.worldvaluessurvey.org/WVSDocumentationWV4.jsp — PDF-файл ссылка «WVS_2000_Questionnaire_Root» легко загружается в Firefox и Chrome. Я не могу понять, как автоматизировать загрузку с помощью httr или RCurl или любого другого пакета R. скриншот ниже поведения Chrome в Интернете. Эта ссылка в формате PDF должна вести к конечному источнику http://www.worldvaluessurvey.org/wvsdc/DC00012/F00001316-WVS_2000_Questionnaire_Root.pdf, но если щелкнуть их напрямую, возникнет ошибка подключения. я не понимаю, связано ли это с заголовком запроса Upgrade-Insecure-Requests:1 или с кодом состояния заголовка ответа 302

Щелкая по новому веб-сайту worldvaluessurvey.org с открытыми окнами элементов проверки Chrome, я думаю, что здесь были приняты какие-то хакерские кодовые решения, отсюда и название полусломанное:/

введите описание изображения здесь


person Anthony Damico    schedule 02.07.2016    source источник
comment
вау, довольно внушительно пожертвовать почти всей своей репутацией из-за одного вопроса! ;-)   -  person agenis    schedule 23.09.2016
comment
Черт; Я был бы рад поддержать получение полезного ответа на этот вопрос. Если вы не получите решение и не присудите его в течение необходимого времени, дайте мне знать, и я добавлю еще 500 представителей, чтобы убедиться, что оно останется в списке. Спасибо за всю вашу работу по обеспечению доступности общедоступных наборов данных, Энтони.   -  person IRTFM    schedule 29.09.2016
comment
@ 42- большое спасибо, Дэвид, я ценю это. ответ на безголовый просмотр - хороший, но постер прав, что было бы лучше только внутри-R. я беспокоюсь, что кто-то даст хороший RCurl ответ, а затем люди, проводящие исследование мировых ценностей, снова изменят веб-сайт.. профессиональные вредности ;)   -  person Anthony Damico    schedule 29.09.2016


Ответы (4)


Используя отличный curlconverter для имитации браузера, вы можете напрямую запросить PDF-файл.

Сначала мы имитируем первоначальный GET запрос браузера (может не понадобиться простой GET и может быть достаточно сохранения куки):

library(curlconverter)
library(httr)
browserGET <- "curl 'http://www.worldvaluessurvey.org/WVSDocumentationWV4.jsp' -H 'Host: www.worldvaluessurvey.org' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1'"
getDATA <- (straighten(browserGET) %>% make_req)[[1]]()

Файл cookie JSESSIONID доступен по адресу getDATA$cookies$value.

getPDF <- "curl 'http://www.worldvaluessurvey.org/wvsdc/DC00012/F00001316-WVS_2000_Questionnaire_Root.pdf' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Cookie: JSESSIONID=59558DE631D107B61F528C952FC6E21F' -H 'Host: www.worldvaluessurvey.org' -H 'Referer: http://www.worldvaluessurvey.org/AJDocumentationSmpl.jsp' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'"
appIP <- straighten(getPDF)
# replace cookie
appIP[[1]]$cookies$JSESSIONID <- getDATA$cookies$value
appReq <- make_req(appIP)
response <- appReq[[1]]()
writeBin(response$content, "test.pdf")

Строки завитков были извлечены прямо из браузера, а затем curlconverter выполняет всю работу.

person jdharrison    schedule 29.09.2016
comment
@AnthonyDamico: Нам нужно пополнить вашу репутацию или защитить вашу новую репутацию. Если вы хотите, чтобы я спонсировал вопросы, дайте мне знать. Я думаю, у вас есть моя электронная почта, так как я изменил свое SO-имя с DWin. - person IRTFM; 30.09.2016
comment
большое спасибо! если мой следующий вопрос возникнет до того, как моя репутация восстановится, я пришлю вам записку :D - person Anthony Damico; 30.09.2016

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

Я вижу, что вы пытаетесь использовать чистый подход R для загрузки этих файлов путем обратной разработки запросов GET/POST, которые генерируются по ссылке. Это могло бы сработать, но сделало бы вашу реализацию очень уязвимой для любых будущих изменений в дизайне сайта, таких как изменения в обработчике событий JavaScript, перенаправлениях URL или требованиях к заголовкам.

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


Я всегда пользовался библиотекой Java HtmlUnit для автономного браузинга, который показался мне превосходным. Конечно, для использования решения на основе Java от Rland потребуется создать процесс Java, для чего потребуется (1) установить Java на компьютере пользователя, (2) правильно настроить $CLASSPATH для поиска JAR-файлов HtmlUnit как а также ваш собственный основной класс для загрузки файлов и (3) правильный вызов команды Java с правильными аргументами с использованием одного из методов R для обработки системной команды. Излишне говорить, что это довольно сложно и грязно.

Безголовое решение для просмотра на чистом R было бы неплохо, но, к сожалению, мне кажется, что R не предлагает никакого собственного решения для безголового просмотра. Наиболее близким является RSelenium, который, по-видимому, представляет собой просто привязку R к клиентской библиотеке Java из Selenium программное обеспечение для автоматизации браузера. Это означает, что он не будет работать независимо от браузера с графическим интерфейсом пользователя и в любом случае требует взаимодействия с внешним Java-процессом (хотя в этом случае детали взаимодействия удобно инкапсулированы в RSelenium API).


Используя HtmlUnit, я создал довольно общий основной класс Java, который можно использовать для загрузки файла, щелкнув ссылку на веб-странице. Параметризация приложения выглядит следующим образом:

  • URL-адрес страницы.
  • Необязательная последовательность выражений XPath, позволяющая спускаться в любое количество вложенных фреймов, начиная со страницы верхнего уровня. Примечание. Я на самом деле разбираю это из аргумента URL, разбивая на \s*>\s*, что мне нравится как краткий синтаксис. Я использовал символ >, потому что он недействителен в URL-адресах.
  • Одно выражение XPath, указывающее якорную ссылку, по которой нужно щелкнуть.
  • Необязательное имя файла, под которым будет сохранен загруженный файл. Если его не указать, он будет получен либо из заголовка Content-Disposition, значение которого соответствует шаблону filename="(.*)" (это был необычный случай, с которым я столкнулся при очистке значков некоторое время назад), либо, в противном случае, из базового имени URL-адреса запроса, который инициировал ответ файлового потока. . Метод получения базового имени работает для вашей целевой ссылки.

Вот код:

package com.bgoldst;

import java.util.List;
import java.util.ArrayList;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.ConfirmHandler;
import com.gargoylesoftware.htmlunit.WebWindowListener;
import com.gargoylesoftware.htmlunit.WebWindowEvent;
import com.gargoylesoftware.htmlunit.WebResponse;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.BaseFrameElement;

public class DownloadFileByXPath {

    public static ConfirmHandler s_downloadConfirmHandler = null;
    public static WebWindowListener s_downloadWebWindowListener = null;
    public static String s_saveFile = null;

    public static void main(String[] args) throws Exception {

        if (args.length < 2 || args.length > 3) {
            System.err.println("usage: {url}[>{framexpath}*] {anchorxpath} [{filename}]");
            System.exit(1);
        } // end if
        String url = args[0];
        String anchorXPath = args[1];
        s_saveFile = args.length >= 3 ? args[2] : null;

        // parse the url argument into the actual URL and optional subsequent frame xpaths
        String[] fields = Pattern.compile("\\s*>\\s*").split(url);
        List<String> frameXPaths = new ArrayList<String>();
        if (fields.length > 1) {
            url = fields[0];
            for (int i = 1; i < fields.length; ++i)
                frameXPaths.add(fields[i]);
        } // end if

        // prepare web client to handle download dialog and stream event
        s_downloadConfirmHandler = new ConfirmHandler() {
            public boolean handleConfirm(Page page, String message) {
                return true;
            }
        };
        s_downloadWebWindowListener = new WebWindowListener() {
            public void webWindowContentChanged(WebWindowEvent event) {

                WebResponse response = event.getWebWindow().getEnclosedPage().getWebResponse();

                //System.out.println(response.getLoadTime());
                //System.out.println(response.getStatusCode());
                //System.out.println(response.getContentType());

                // filter for content type
                // will apply simple rejection of spurious text/html responses; could enhance this with command-line option to whitelist
                String contentType = response.getResponseHeaderValue("Content-Type");
                if (contentType.contains("text/html")) return;

                // determine file name to use; derive dynamically from request or response headers if not specified by user
                // 1: user
                String saveFile = s_saveFile;
                // 2: response Content-Disposition
                if (saveFile == null) {
                    Pattern p = Pattern.compile("filename=\"(.*)\"");
                    Matcher m;
                    List<NameValuePair> headers = response.getResponseHeaders();
                    for (NameValuePair header : headers) {
                        String name = header.getName();
                        String value = header.getValue();
                        //System.out.println(name+" : "+value);
                        if (name.equals("Content-Disposition")) {
                            m = p.matcher(value);
                            if (m.find())
                                saveFile = m.group(1);
                        } // end if
                    } // end for
                    if (saveFile != null) saveFile = sanitizeForFileName(saveFile);
                    // 3: request URL
                    if (saveFile == null) {
                        WebRequest request = response.getWebRequest();
                        File requestFile = new File(request.getUrl().getPath());
                        saveFile = requestFile.getName(); // just basename
                    } // end if
                } // end if

                getFileResponse(response,saveFile);

            } // end webWindowContentChanged()
            public void webWindowOpened(WebWindowEvent event) {}
            public void webWindowClosed(WebWindowEvent event) {}
        };

        // initialize browser
        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setJavaScriptEnabled(true); // required for JavaScript-powered links
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);

        // 1: get home page
        HtmlPage page;
        try { page = webClient.getPage(url); } catch (IOException e) { throw new Exception("error: could not get URL \""+url+"\".",e); }
        //page.getEnclosingWindow().setName("main window");

        // 2: navigate through frames as specified by the user
        for (int i = 0; i < frameXPaths.size(); ++i) {
            String frameXPath = frameXPaths.get(i);
            List<?> elemList = page.getByXPath(frameXPath);
            if (elemList.size() != 1) throw new Exception("error: frame "+(i+1)+" xpath \""+frameXPath+"\" returned "+elemList.size()+" elements on page \""+page.getTitleText()+"\" >>>\n"+page.asXml()+"\n<<<.");
            if (!(elemList.get(0) instanceof BaseFrameElement)) throw new Exception("error: frame "+(i+1)+" xpath \""+frameXPath+"\" returned a non-frame element on page \""+page.getTitleText()+"\" >>>\n"+page.asXml()+"\n<<<.");
            BaseFrameElement frame = (BaseFrameElement)elemList.get(0);
            Page enclosedPage = frame.getEnclosedPage();
            if (!(enclosedPage instanceof HtmlPage)) throw new Exception("error: frame "+(i+1)+" encloses a non-HTML page.");
            page = (HtmlPage)enclosedPage;
        } // end for

        // 3: get the target anchor element by xpath
        List<?> elemList = page.getByXPath(anchorXPath);
        if (elemList.size() != 1) throw new Exception("error: anchor xpath \""+anchorXPath+"\" returned "+elemList.size()+" elements on page \""+page.getTitleText()+"\" >>>\n"+page.asXml()+"\n<<<.");
        if (!(elemList.get(0) instanceof HtmlAnchor)) throw new Exception("error: anchor xpath \""+anchorXPath+"\" returned a non-anchor element on page \""+page.getTitleText()+"\" >>>\n"+page.asXml()+"\n<<<.");
        HtmlAnchor anchor = (HtmlAnchor)elemList.get(0);

        // 4: click the target anchor with the appropriate confirmation dialog handler and content handler
        webClient.setConfirmHandler(s_downloadConfirmHandler);
        webClient.addWebWindowListener(s_downloadWebWindowListener);
        anchor.click();
        webClient.setConfirmHandler(null);
        webClient.removeWebWindowListener(s_downloadWebWindowListener);

        System.exit(0);

    } // end main()

    public static void getFileResponse(WebResponse response, String fileName ) {

        InputStream inputStream = null;
        OutputStream outputStream = null;

        // write the inputStream to a FileOutputStream
        try {

            System.out.print("streaming file to disk...");

            inputStream = response.getContentAsStream();

            // write the inputStream to a FileOutputStream
            outputStream = new FileOutputStream(new File(fileName));

            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = inputStream.read(bytes)) != -1)
                outputStream.write(bytes, 0, read);

            System.out.println("done");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } // end try-catch
            } // end if
            if (outputStream != null) {
                try {
                    //outputStream.flush();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } // end try-catch
            } // end if
        } // end try-catch

    } // end getFileResponse()

    public static String sanitizeForFileName(String unsanitizedStr) {
        return unsanitizedStr.replaceAll("[^\040-\176]","_").replaceAll("[/\\<>|:*?]","_");
    } // end sanitizeForFileName()

} // end class DownloadFileByXPath

Ниже приведена демонстрация того, как я запускаю основной класс в своей системе. Я вырезал большую часть подробного вывода HtmlUnit. Я объясню аргументы командной строки позже.

ls;
## bin/  src/
CLASSPATH="bin;C:/cygwin/usr/local/share/htmlunit-latest/*" java com.bgoldst.DownloadFileByXPath "http://www.worldvaluessurvey.org/WVSDocumentationWV4.jsp > //iframe[@id='frame1'] > //iframe[@id='frameDoc']" "//a[contains(text(),'WVS_2000_Questionnaire_Root')]";
## Jul 10, 2016 1:34:34 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
## WARNING: Obsolete content type encountered: 'application/x-javascript'.
## Jul 10, 2016 1:34:34 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
## WARNING: Obsolete content type encountered: 'application/x-javascript'.
##
## ... snip ...
##
## Jul 10, 2016 1:34:45 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
## WARNING: Obsolete content type encountered: 'text/javascript'.
## streaming file to disk...done
## 
ls;
## bin/  F00001316-WVS_2000_Questionnaire_Root.pdf*  src/
  • CLASSPATH="bin;C:/cygwin/usr/local/share/htmlunit-latest/*" Здесь я установил $CLASSPATH для своей системы, используя префикс назначения переменной (примечание: я работал в оболочке Cygwin bash). Файл .class я скомпилировал в bin, и я установил JAR-файлы HtmlUnit в свою структуру системных каталогов Cygwin, что, вероятно, немного необычно.
  • java com.bgoldst.DownloadFileByXPath Очевидно, это командное слово и имя основного класса для выполнения.
  • "http://www.worldvaluessurvey.org/WVSDocumentationWV4.jsp > //iframe[@id='frame1'] > //iframe[@id='frameDoc']" Это URL-адрес и выражения XPath фрейма. Ваша целевая ссылка вложена в два iframe, поэтому требуются два выражения XPath. Вы можете найти атрибуты id в исходном коде, просмотрев необработанный HTML-код или воспользовавшись инструментом веб-разработки (мне больше всего нравится Firebug).
  • "//a[contains(text(),'WVS_2000_Questionnaire_Root')]" Наконец, это фактическое выражение XPath для целевой ссылки во внутреннем iframe.

Я опустил аргумент имени файла. Как видите, код правильно извлек имя файла из URL-адреса запроса.


Я понимаю, что это очень проблематично, чтобы загрузить файл, но для веб-скрапинга в целом я действительно думаю, что единственный надежный и жизнеспособный подход — это пройти все девять ярдов и использовать полный безголовый браузерный движок. Возможно, будет лучше полностью отделить задачу загрузки этих файлов от Rland и вместо этого реализовать всю систему очистки с помощью приложения Java, возможно, дополненного некоторыми сценариями оболочки для более гибкого внешнего интерфейса. Если вы не работаете с URL-адресами для загрузки, которые были разработаны для однократных HTTP-запросов без излишеств от таких клиентов, как curl, wget и R, использование R для парсинга веб-страниц, вероятно, не является хорошей идеей. Это мои два цента.

person bgoldst    schedule 10.07.2016

Глядя на код функции DocDownload, они в основном просто выполняют POST в /AJDownload.jsp с параметрами сообщения ulthost:WVS, CndWAVE: 4, SAID: 0, DOID: (идентификатор документа здесь), AJArchive: WVS Data Архив. Не уверен, что некоторые из них необходимы, но, вероятно, лучше включить их в любом случае.

сделать это в R с помощью httr, будет выглядеть примерно так

r <- POST("http://www.worldvaluessurvey.org/AJDownload.jsp", body = list("ulthost" = "WVS", "CndWAVE" = 4, "SAID" = 0, "DOID" = 1316, "AJArchive" = "WVS Data Archive"))

Конечная точка AJDownload.asp вернет 302 (перенаправление на НАСТОЯЩИЙ URL-адрес), и библиотека httr должна автоматически выполнить перенаправление за вас. Путем проб и ошибок я определил, что серверу требуются заголовки Content-Type и Cookie, иначе он вернет пустой ответ 400 (ОК). Вам нужно будет получить действительный файл cookie, который вы можете просто найти, проверив загрузку любой страницы на этот сервер, и найдите заголовок с помощью Cookie: JSESSIONID=..... , вам нужно будет скопировать весь заголовок

Так что с теми, кто внутри, это выглядит так

r <- POST("http://www.worldvaluessurvey.org/AJDownload.jsp", body = list("ulthost" = "WVS", "CndWAVE" = 4, "SAID" = 0, "DOID" = 1316, "AJArchive" = "WVS Data Archive"), add_headers("Content-Type" = "application/x-www-form-urlencoded", "Cookie" = "[PASTE COOKIE VALUE HERE]"))

Ответ будет представлять собой двоичные данные в формате PDF, поэтому вам нужно будет сохранить его в файл, чтобы иметь возможность что-либо с ним делать.

bin <- content(r, "raw")
writeBin(bin, "myfile.txt")

РЕДАКТИРОВАТЬ:

Хорошо, есть немного времени, чтобы запустить код. Я также выяснил минимальные необходимые параметры для вызовов POST, а именно: docid, файл cookie JSESSIONID и заголовок Referer.

library(httr)
download_url <- "http://www.worldvaluessurvey.org/AJDownload.jsp"
frame_url <- "http://www.worldvaluessurvey.org/AJDocumentationSmpl.jsp"
body <- list("DOID" = "1316")

file_r <- POST(download_url, body = body, encode = "form",
          set_cookies("JSESSIONID" = "0E657C37FF030B41C33B7D2B1DCAB3D8"),
          add_headers("Referer" = frame_url),
          verbose())

Это сработало на моей машине и правильно возвращает двоичные данные PDF.

Вот что произойдет, если я установлю файл cookie вручную из своего веб-браузера. Я использую только часть файла cookie JSESSIONID и ничего больше. Как я упоминал ранее, JSESSIONID истечет, вероятно, из-за возраста или бездействия. успех_изображение

person Ben Abraham    schedule 07.07.2016
comment
спасибо, но я попробовал ваш пример несколькими разными способами, и ни один из них не сработал? library(httr) ; r <- POST("http://www.worldvaluessurvey.org/AJDownload.jsp", body = list("ulthost" = "WVS", "CndWAVE" = 4, "SAID" = 0, "DOID" = 1316, "AJArchive" = "WVS Data Archive")) ; x <- POST("http://www.worldvaluessurvey.org/AJDownload.jsp", body = list("ulthost" = "WVS", "CndWAVE" = 4, "SAID" = 0, "DOID" = 1316, "AJArchive" = "WVS Data Archive"),add_headers("Content-Type" = "application/x-www-form-urlencoded", "JSESSIONID" = cookies(r)$value)) ; x$content - person Anthony Damico; 07.07.2016
comment
Я обновил код, который запускал локально и работал. Попробуйте изменения. Также следует отметить, что срок действия файла cookie JSESSIONID может истечь. Поэтому вам нужно убедиться, что вы используете недавно использованный. Для дальнейшей автоматизации в будущем вы можете сначала запросить страницу (например, список или, возможно, даже домашнюю страницу), и вы можете извлечь файл cookie из ответа на это. - person Ben Abraham; 07.07.2016
comment
извините, ваш пример все еще не работает для меня? Не могли бы вы пересмотреть свой ответ, чтобы он автоматизировал процесс (включая извлечение r$cookies$value) от начала до конца и работал чисто в новом сеансе R? - person Anthony Damico; 08.07.2016
comment
Кажется, я не могу заставить сервер принять файл cookie, который он генерирует для R-скрипта, поэтому я не знаю, что с этим делать. Тем не менее, я немного обновил свой код, чтобы он был более понятным, и опубликовал изображение моего вывода, это может дать вам некоторые подсказки относительно того, где ваш код терпит неудачу. - person Ben Abraham; 08.07.2016
comment
У меня отлично работало на Mac с этим устаревшим файлом cookie. Я уже посещал страницу с Chrome, поэтому мог найти еще один файл cookie в файле cookie. - person IRTFM; 08.07.2016
comment
хорошо, спасибо, я могу воспроизвести загрузку, вытащив файл cookie из Chrome, но, к сожалению, это не решает проблему. по какой-то причине сервер выдает недействительные файлы cookie R, в то время как веб-браузеры получают действительные файлы cookie: / есть другие идеи? - person Anthony Damico; 08.07.2016
comment
Я все еще не могу заставить R получать действительные файлы cookie для сайта, и даже если я сгенерирую URL-адрес из его идентификатора и имени файла, он не позволит загрузить его без действительного файла cookie. Если вам не нужно каждый раз загружать свежие версии файлов, вы всегда можете один раз выполнить массовую загрузку с действительным файлом cookie, а затем просто загрузить их с диска, когда вам понадобятся файлы. Кроме того, вы ищете только PDF-файлы или файлы статистических данных? (было бы моим предположением, так как R) - person Ben Abraham; 08.07.2016
comment
@BenAbraham спасибо .. моя цель - восстановить этот скрипт автоматизации загрузки опроса о мировых ценностях, который раньше работал нормально: (просить пользователей использовать функции проверки Chrome слишком сложно для большинства людей - person Anthony Damico; 09.07.2016

Ваша проблема, вероятно, вызвана кодом состояния 302. Я мог бы объяснить, что такое код 302, но, похоже, вам было бы полезно объяснить весь процесс загрузки:

Это то, что происходит, когда пользователь нажимает на эту ссылку в формате PDF.

  1. Событие javascript onclick запускается для этой ссылки. Если вы щелкните правой кнопкой мыши ссылку и выберите «Проверить элемент», вы увидите, что для события onclick установлено значение «DocDownload ('1316')». встроенное событие JavaScript onclick.
  2. Однако если мы введем DocDownload в консоли javascript, браузер сообщит нам, что DocDownload не существует как функция. ">введите здесь описание изображения
  3. Это связано с тем, что эта ссылка в формате PDF находится внутри iframe внутри окна введите здесь описание изображения. Консоль разработчика в браузере имеет доступ только к переменным/функциям
person johnsimer    schedule 04.07.2016
comment
Спасибо. вопрос: как файл можно загрузить с помощью R? - person Anthony Damico; 05.07.2016