質問
現在のウォールストリートジャーナルのプライムレートを自動的にダウンロードし、データをデータベースにロードする必要があります。このデータを自動的にダウンロードするための最良の方法は何ですか?
私はこれを行うための3つの可能なソリューションを思いつきました:
- WSJからHTML Webページをこする。
- WSJからのRSSニュースフィードを解析します。
- WSJから見つけていないAPIを使用してください。
ソリューション1に関しては、ソリューション1は簡単に壊れる可能性があるため、私はそれが好きではありませんが、それは私が最後から最後まで解決した唯一のものです。こすり込むことができるようです このページ WebRequest / Webresponseを使用して、このコードのテキストを読み取ります。
<tr>
<td style="text-align:left" class="colhead"> </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を知っている場合は、私に知らせてください。
解決
次のコードを実装して、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))
醜いコードですが、それは目的に役立ちます。データが正しいことを確認するために実行されるいくつかの検証ルールもありますが、これは私が値をスクレイプするために使用したものの中核です。
他のヒント
これにはウェブサービスがありますが、あなたが望むのがプライムレートである場合、それはコストの価値がないかもしれません:
私は約5年遅れていますが、私はそれを育てると思いました。quandl この情報を取得するための素晴らしいAPIがあります。