Я должен выбрать один из этих языков:

  • Python (с Selenium или любым предложением)
  • Javascript (с node с любым модулем)
  • Bash (например, с curl)

Чтобы сделать следующее:

  • Сделайте запрос к API (облако Scrapy) и получите какое-то значение, в моем случае мне просто нужен id ответа:

{"count": 1, "id": "195457/7/19", "width": 32, "height": 27, "start_time": "2017-06-22T08: 20: 26", "total" : 1, "status": "ok"}

  • А затем сделайте еще один запрос с идентификатором для загрузки, который обеспечивает загрузку файла в формате CSV / JSON.

Что пробовал:

Python:

Когда Selenium (драйвер Firefox) открывается и получает id, он работает нормально, но когда я пытаюсь загрузить файл со следующим запросом API, он спрашивает меня, что я хочу сделать с файлом (загрузить или открыть с помощью. ..). Итак, поскольку я должен взаимодействовать с диалогом, это нецелесообразно.

Javascript:

Я нашел модуль для загрузки файлов, но он предназначен только для загрузки файлов в виде изображений с URL-адресов изображений в Интернете, а не для загрузки файла (как команда Linux wget).

< Сильный > Bash :

С curl это работает, но я могу просто получить весь ответ, а затем я не могу получить значение идентификатора, поэтому я не могу продолжить то, что хочу. Также я попытался загрузить файл второго шага, и он отлично работает с простым curl -o myfile.csv URL

Любая помощь будет оценена по достоинству. Спасибо за прочтение!

0
Alberto 22 Июн 2017 в 15:00
Вы загружаете его и сохраняете на машине или загружаете через браузер пользователю?
 – 
roughcoder
22 Июн 2017 в 15:23
Мне все равно, как я наконец загрузил файл, я просто хочу загрузить его программно :)
 – 
Alberto
22 Июн 2017 в 15:26
Хорошо, мои ответы ниже сохраняют файл в той же папке, из которой вы запускаете скрипт. Если тебе что-то нужно, кричи.
 – 
roughcoder
22 Июн 2017 в 15:41

1 ответ

Лучший ответ

Вот версия узла. Это довольно широкая, но две основные функции - это callApi и downloadFile.

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

Вам нужно будет npm install request и обновить переменные, чтобы они соответствовали вашему API.

index.js

const request = require('request');
const http = require('http');
//const https = require('https'); maybe required
const fs = require('fs');

const apiEndPoint = 'http://scrapycloud?someparam=';
const fileName = 'data.csv';
const assetEndPoint = 'http://assetUrl?id=';

// This will call your api and get the asset id then calls the downloadFile function.
function callApi(assetId, callback) {

    request(apiEndPoint + assetId, function (error, response, body) {

        if (error) {
            return callback(error);
        }

        const info = JSON.parse(body);
        const assetId = info.id;

        downloadFile(assetId, callback);

    });

}

// This function creates a writeSteam to save a file to your local machine, performs a http request to the assets and pipes it back into the write stream
function downloadFile(assetId, callback) {

    var file = fs.createWriteStream(fileName);
    //use the following line if your requests needs to be https
    //var request = https.get(assetEndPoint + assetId, function (response) {
    var request = http.get(assetEndPoint + assetId, function (response) {
        response.pipe(file);

        file.on('finish', function () {
            file.close(callback);
        });

    }).on('error', function (err) {
        fs.unlink(dest);
        if (callback) callback(err.message);
    });

}

// Called when everything is finished or an error
function complete(err) {

    if (err) {
        return console.log(err);
    }

    console.log('file downloaded');

}

// Starts the process, pass it an id and a callback
callApi('123131', complete);
1
Alberto 23 Июн 2017 в 19:05
Спасибо за ответ, но сейчас я не могу проверить ваш ответ, завтра утром я вам кое-что скажу. Спасибо за ваше время!
 – 
Alberto
22 Июн 2017 в 15:47
Привет! Он работает больше всего, но при запуске второго запроса выдает ошибку: https не поддерживается. Поэтому я просто потребовал его как const и изменил второй метод на https.get. Спасибо большое!
 – 
Alberto
23 Июн 2017 в 10:50