【问题标题】:How to automate the process of acquiring NASDAQ historical stock prices?如何自动化获取纳斯达克历史股票价格的过程?
【发布时间】:2019-09-10 14:05:39
【问题描述】:

我正在尝试通过https://www.nasdaq.com/symbol/aapl/historical 获取 200 多种不同股票代码的 10 年历史每日价格的原始数据。我现在正在做的是搜索每个代码,从 Timeframe 下拉菜单中选择“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 不是很熟悉。

【问题讨论】:

    标签: javascript ajax postman web-inspector stockquotes


    【解决方案1】:

    您至少需要 2 个请求

    1. GET请求:获取需要的cookies 2. POST 请求:更改时间跨度/ -> 解析响应/下载 excel

    1 - 初始获取请求 [set_cookie]

    获取 /symbol/aapl/历史 HTTP/1.1 主办方:www.nasdaq.com 缓存控制:无缓存

    测试 <pre></pre>

    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></pre>

    // ... 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/历史 HTTP/1.1 主办方:www.nasdaq.com x-requested-with: XMLHttpRequest 内容类型:应用程序/json 接受: */* 缓存控制:无缓存 {{submitNoDownload}}

    测试

    <pre></pre>

    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></pre>

    var data = $("[id$='ddlTimeFrame']").val();
    var submitString = data + '|' + download + "|" + quoteBoxSelectedSymbol; 
    

    1. $(...) = (jquery) 当前文档
    2. [id$='ddlTimeFrame'] = 选择/返回一个 id = "ddlTimeFrame" 的 html 元素(见下文)
    3. .val() = 获取选中的html元素的值

    上面的代码会选择下面的html代码 <pre></pre>

    <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></pre>

    var quoteBoxSelectedSymbol="AAPL";
    

    1. 数据 = 10 年
    2. 下载 = 真
    3. quoteBoxSelectedSymbol = AAPL

    4. submitString = 10y|true|AAPL

    POST /symbol/aapl/历史 HTTP/1.1 主办方:www.nasdaq.com x-requested-with: XMLHttpRequest 内容类型:application/x-www-form-urlencoded 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 缓存控制:无缓存 __VIEWSTATE:{{__VIEWSTATE}} __VIEWSTATEGENERATOR:{{__VIEWSTATEGENERATOR}} __VIEWSTATEENCRYPTED:{{__VIEWSTATEENCRYPTED}} __EVENTVALIDATION:{{__EVENTVALIDATION}} ctl00$quotes_content_left$submitString:{{submitToDownload}}

    【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2022-01-09
    • 1970-01-01
    • 2023-01-13
    • 2014-09-25
    相关资源
    最近更新 更多