1

我需要自动下载当前的《华尔街日报》最优惠利率并将数据加载到我的数据库中。自动下载此数据的最佳方法是什么?

为此,我提出了三种可能的解决方案:

  1. 从 WSJ 抓取 HTML 网页。
  2. 解析来自 WSJ 的 RSS 新闻提要。
  3. 使用一些我从 WSJ 找不到的 API。

关于解决方案 1,虽然我不喜欢解决方案 1,因为它很容易损坏,但它是我唯一从头到尾解决的问题。看来我可以使用 WebRequest / WebResponse 抓取此页面并阅读此代码中的文本:

<tr>
<td style="text-align:left" class="colhead">&nbsp;</td>
<td class="colhead">Latest</td>
<td class="colhead">Wk ago</td>
<td class="colhead">High</td>
<td class="colhead">Low</td>
</tr>
<tr>
<td class="text">U.S.</td>
<td style="font-weight:bold;" class="num">3.25</td>
<td class="num">3.25</td>
<td class="num">3.25</td>
<td class="num" style="border-right:0px">3.25</td>
</tr>

关于解决方案 2,虽然我可以实现 RSS 阅读器解决方案,但我看不到一种可靠地预测最优惠利率变化的措辞的方法。因此,我认为这不像解决方案 1 那样安全或可靠地获取数据。

关于解决方案 3,我还没有找到任何已发布的 API 来检查像 Prime Rate 这样的货币汇率。如果有人知道用于检查汇率的网络服务或其他 API,请告诉我。

4

3 回答 3

2

我实现了以下代码来抓取 HTML 并处理结果:

SSIS 包 C# 脚本任务

public void Main()
    {
        // Post the web page.
        try
        {
            // Set variables.
            bool fireAgain = true;
            Uri WebPageURI = new Uri("http://online.wsj.com/mdc/public/page/2_3020-moneyrate.html");

            // Post the web page.
            WebRequest request = WebRequest.Create(WebPageURI);
            request.Timeout = (1000 * 60 * 60);
            request.Method = "POST";
            WebResponse response = request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());
            string Output = reader.ReadToEnd();

            Dts.Variables["wall_street_journal_str"].Value = Output;
            Dts.Events.FireInformation(0, "WebRequest:", WebPageURI.ToString(), "", 0, ref fireAgain);
            Dts.Events.FireInformation(0, "WebResponse:", Output, "", 0, ref fireAgain);
        }
        catch (WebException ex)
        {
            Dts.Events.FireError(0, "Error:", ex.Message, "", 0);
        }


        // Return success.
        Dts.TaskResult = (int)ScriptResults.Success;
    }

执行 SQL 任务调用的存储过程

SET @WALL_STREET_JOURNAL_HTML = SUBSTRING(@WALL_STREET_JOURNAL_HTML, CHARINDEX('Prime rates', @WALL_STREET_JOURNAL_HTML, 1), CHARINDEX('Canada', @WALL_STREET_JOURNAL_HTML, CHARINDEX('Prime rates', @WALL_STREET_JOURNAL_HTML, 1)) - CHARINDEX('Prime rates', @WALL_STREET_JOURNAL_HTML, 1))
    SELECT @RATE_CHANGE_DATE = CONVERT(DATE, RTRIM(LTRIM(SUBSTRING(@WALL_STREET_JOURNAL_HTML, CHARINDEX('[', @WALL_STREET_JOURNAL_HTML, 1) + 23, CHARINDEX(']', @WALL_STREET_JOURNAL_HTML, 1) - CHARINDEX('[', @WALL_STREET_JOURNAL_HTML, 1) - 23))))
        , @RATE = CONVERT(NUMERIC(8, 2), SUBSTRING(@WALL_STREET_JOURNAL_HTML, CHARINDEX('class="num">', @WALL_STREET_JOURNAL_HTML, CHARINDEX('U.S.</td>', @WALL_STREET_JOURNAL_HTML, 1)) + 12, CHARINDEX('<', @WALL_STREET_JOURNAL_HTML, CHARINDEX('class="num">', @WALL_STREET_JOURNAL_HTML, CHARINDEX('U.S.</td>', @WALL_STREET_JOURNAL_HTML, 1))) - CHARINDEX('class="num">', @WALL_STREET_JOURNAL_HTML, CHARINDEX('U.S.</td>', @WALL_STREET_JOURNAL_HTML, 1)) -12))

丑陋的代码,但它可以达到目的。还有几个验证规则运行来验证数据是否正确,但这是我用来抓取值的核心。

于 2010-04-22T19:50:45.457 回答
2

有一个网络服务,但如果你想要的只是最优惠的价格,这可能不值得:

http://www.armindexes.com/

于 2010-07-02T23:00:04.177 回答
2

我晚了大约 5 年,但我想我会提出来。 Quandl有一个很好的 API 来获取这些信息。

于 2015-09-28T21:26:09.873 回答