Как автоматизировать процесс приобретения исторических цен акций NASDAQ? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь получить необработанные данные по 10-летним историческим дневным ценам для 200+ различных тикеров с помощью https://www.nasdaq.com/symbol/aapl/historical.. Сейчас я занимаюсь поиском каждого тикера, выбирая «10 лет» на таймфрейме.раскрывающееся меню, ожидая ответа, а затем нажмите «Загрузить этот файл в формате Excel» в нижнем углу.

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

Я заметил, что кнопка «Загрузить этот файл в формате Excel» вызывает функцию JS:

function getQuotes(download) {
        if (!download)
            showLoadingSpinner();

        var data = $("[id$='ddlTimeFrame']").val();
        var submitString = data + '|' + download + "|" + quoteBoxSelectedSymbol; if (!download) {
            $.ajax({
                type: "POST",
                url: baseUrl,
                data: submitString,
                contentType: "application/json",
                success: function (response) {
                    $("[id$='historicalContainer']").html(response);
                    $(".genTable tbody tr:odd").addClass("genTablealt");
                    hideLoadingSpinner();
                }
            });
        }
        else {
            $("[id$='submitString']").val(submitString);
            $("#getFile").submit();
        }
    }

Переменная загрузки выглядит как логическое значение, которое передается как true при нажатии кнопки,Может быть, есть способ внедрить любую конечную точку, которую генерирует функция, в что-то вроде Postman?Я не очень знаком с JavaScript.

1 Ответ

1 голос
/ 21 апреля 2019

вам понадобится как минимум 2 запроса


    1. GET request:    to get the required cookies
    2. POST request:   to change timespan/
                       -> parse response / downlaod excel

1 - начальный запрос на получение [set_cookie]


    GET /symbol/aapl/historical HTTP/1.1
    Host: www.nasdaq.com
    cache-control: no-cache

Тесты <pre></p> <pre><code>pm.test("valid response", function () { pm.response.to.have.status(200); pm.response.to.be.withBody; pm.expect(pm.response.text()).to.include("Results for: "); });

следующее необходимо только при загрузке Excel <pre></p> <pre><code>// ... continue test code ... var input = pm.response.text(); var regex = /"__VIEWSTATE" value="(.*?)"/; var match = regex.exec(input); if (match) pm.globals.set("__VIEWSTATE", match[1]); var regex = /"__VIEWSTATEGENERATOR" value="(.*?)"/; var match = regex.exec(input); if (match) pm.globals.set("__VIEWSTATEGENERATOR", match[1]); var regex = /"__VIEWSTATEENCRYPTED" value="(.*?)"/; var match = regex.exec(input); if (match) pm.globals.set("__VIEWSTATEENCRYPTED", match[1]); var regex = /"__EVENTVALIDATION" value="(.*?)"/; var match = regex.exec(input); if (match) pm.globals.set("__EVENTVALIDATION", match[1]); //----- var regex = /<option value="(\d+[dmy])">10 Years<\/option>/; var match = regex.exec(input); if (match) var timeframe = match[1]; pm.globals.set("timeframe", timeframe); //----- var regex = /var quoteBoxSelectedSymbol="(.*?)";/; var match = regex.exec(input); if (match) var symbol = match[1]; pm.globals.set("symbol", symbol); //----- var submitNoDownload = timeframe + "|false|" + symbol; pm.globals.set("submitNoDownload", submitNoDownload); var submitToDownload = timeframe + "|true|" + symbol; pm.globals.set("submitToDownload", submitToDownload);

2 - получать данные прямо со страницы; нет загрузки


    POST /symbol/aapl/historical HTTP/1.1
    Host: www.nasdaq.com
    x-requested-with: XMLHttpRequest
    content-type: application/json
    accept: */*
    cache-control: no-cache

    {{submitNoDownload}}

Тесты

<pre></p> <pre><code>pm.test("valid response", function () { pm.response.to.have.status(200); pm.response.to.be.withBody; pm.expect(pm.response.text()).to.include("Results for: "); }); var input = pm.response.text(); var regex = /<tr>\s+(?:<td>\s+(\S+)\s+<\/td>\s+)(?:<td>\s+(\S+)\s+<\/td>\s+)(?:<td>\s+(\S+)\s+<\/td>\s+)(?:<td>\s+(\S+)\s+<\/td>\s+)(?:<td>\s+(\S+)\s+<\/td>\s+)(?:<td>\s+(\S+)\s+<\/td>\s+)<\/tr>/mg; var match = regex.exec(input); while (match != null) { // Iterate thru all rows/data pm.globals.set("date", match[1]); pm.globals.set("open", match[2]); pm.globals.set("high", match[3]); pm.globals.set("low", match[4]); pm.globals.set("close-last", match[5]); pm.globals.set("volume", match[6]); match = regex.exec(input); }

3 - скачать excel

обо всем по порядку! Что у нас здесь .. <pre></p> <pre><code>var data = $("[id$='ddlTimeFrame']").val(); var submitString = data + '|' + download + "|" + quoteBoxSelectedSymbol;

  1. $ (...) = (jquery) текущий документ
  2. [id $ = 'ddlTimeFrame'] = выбрать / вернуть html-элемент с id = "ddlTimeFrame" (см. Ниже)
  3. .val () = получить значение выбранного HTML-элемента

Приведенный выше код выберет следующий HTML-код <pre></p> <pre><code><select id="ddlTimeFrame" name="ddlTimeFrame" onchange="getQuotes(false)"> <option value="5d">5 Days</option> <option value="1m">1 Month</option> <option value="3m" selected="selected">3 Months</option> <option value="6m">6 Months</option> <option value="1y">1 Year</option> <option value="18m">18 Months</option> <option value="2y">2 Years</option> <option value="3y">3 Years</option> <option value="4y">4 Years</option> <option value="5y">5 Years</option> <option value="6y">6 Years</option> <option value="7y">7 Years</option> <option value="8y">8 Years</option> <option value="9y">9 Years</option> <option value="10y">10 Years</option> </select>

где-то в html-коде <pre></p> <pre><code>var quoteBoxSelectedSymbol="AAPL";

  1. данные = 10лет
  2. download = true
  3. quoteBoxSelectedSymbol = AAPL

  4. submitString = 10y | true | AAPL


    POST /symbol/aapl/historical HTTP/1.1
    Host: www.nasdaq.com
    x-requested-with: XMLHttpRequest
    Content-Type: application/x-www-form-urlencoded
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    cache-control: no-cache

    __VIEWSTATE:{{__VIEWSTATE}}
    __VIEWSTATEGENERATOR:{{__VIEWSTATEGENERATOR}}
    __VIEWSTATEENCRYPTED:{{__VIEWSTATEENCRYPTED}}
    __EVENTVALIDATION:{{__EVENTVALIDATION}}
    ctl00$quotes_content_left$submitString:{{submitToDownload}}

...