1

現在のウォールストリートジャーナルプライムレートを自動的にダウンロードして、データベースにデータをロードする必要があります。このデータを自動的にダウンロードするための最良の方法は何ですか?

私はこれを行うための3つの可能な解決策を考え出しました:

  1. WSJからHTMLWebページをスクレイプします。
  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は見つかりませんでした。お金のレートをチェックするためのWebサービスやその他の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

このためのWebサービスがありますが、プライムレートだけが必要な場合は、コストに見合わない可能性があります。

http://www.armindexes.com/

于 2010-07-02T23:00:04.177 に答える
2

5年くらい遅れましたが、育てようと思いました。 Quandlには、この情報を取得するための優れたAPIがあります。

于 2015-09-28T21:26:09.873 に答える