2016-02-12 101 views
-1

我從Google財經和雅虎財經獲取市場數據,但卻遇到了一個問題。使用file_get_contents()/ cURL或API獲取財務數據?

谷歌財經

http://www.google.com/finance/info?q=NASDAQ:GOOG

雅虎財經

http://query.yahooapis.com/v1/public/yql?q=select%20LastTradePriceOnly%20from%20yahoo.finance.quotes%20where%20symbol%20in%20%28%22GOOG%22%29%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json

我正在經歷雅虎財務不可靠。如果我直接在雅虎財經網站上查看股票,我會得到正確的價格,但一旦我使用上面的鏈接,我會得到另一個價格。我比較了谷歌和雅虎財經的JSON數據。谷歌財經更加準確,但我想使用雅虎財經,因爲他們有更多的股票可以獲取。我在標記爲關閉前30分鐘通過Yahoo Finance「API」查看了Google股票(GOOG)。這是顯示不正確的價格與2美元。該網站顯示正確的價格,但不是「API」。但我的Google財經腳本和網站都顯示正確的價格。有誰知道它是如何解決的?如果有人曾經與Yahoo Finance「API」合作過?

現在我正在使用file_get_contents()和RegEx從這兩個網站獲取<span>。這種方法工作得非常好,而且速度很快,但我想遷移到使用cURL,因爲速度更快。我建立了一個網站來提取數據,只需要1秒鐘。

這裏是我當前的代碼部分:

$data = file_get_contents('http://www.google.com/finance?q=NASDAQ:GOOG'); 
$stock = '/\<span id\=\"ref_4420283_l\"\>(.*?)\<\/span\>/'; 
$price = htmlspecialchars(strip_tags($stock [0])); 

如果我堅持使用上面的代碼,有沒有可能是谷歌或雅虎塊的連接?因爲此代碼正在加載整個網站而不僅僅是JSON數據。我只需要確定價格。

我目前使用file_get_contents()但需要遷移到捲曲如果我需要堅持使用這種方法總結。根據上面的鏈接,我打算使用Yahoo Finance的JSON數據,但JSON數據似乎並不準確。 Google財經的JSON數據非常準確,但Google並沒有像雅虎財經那樣的所有股票。

有沒有人有與雅虎財務相同的問題?如果我選擇堅持使用file_get_contents()或cURL,Google或Yahoo是否有可能阻止我的連接?這是因爲Google和Yahoo Finance的網站數據都是準確的,而不是雅虎的JSON數據。

我很感激我能得到的所有幫助。

+0

有許多API可用於獲取此類型的財務數據;大多數好的都是商業的。推薦一個不在本網站的範圍之內;你需要做你自己的研究。 – duskwuff

+0

我發現Google「API」和雅虎「API」,但雅虎似乎並不準確。我還問了一個問題,如果我使用file_get_contents()來獲取數據,而不是使用JSON,那麼我是否可以被阻止。對不起,長文本,只是想我需要具體得到一個特定的迴應。 – Treps

回答

1
<?PHP 
$url = "http://www.google.com/finance?q=NASDAQ:GOOG"; 
    $input = @file_get_contents($url) or die("Could not access file: $url"); 
    $regexp = '<span id=\"ref_(.*)\">(.*)<\/span>'; 
    if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { 
     foreach($matches as $match) { 

echo $match[2].","."<br />"; 


     } 
} 

?> 
+0

哦,很好的例子。你也可以使用echo'$ matches [0] [0];'來獲得價格。但我不太明白它爲什麼起作用。在這種情況下,'ref _(。*)'如何獲得「304466804484872_l」?如果您檢查源代碼,它就像63個匹配「ref_」,但只有2個匹配「ref_304466804484872_l」(兩者相同)。所以我會理解RegEx是否是'ref _(。*)_l'。或者是因爲代碼不會在'

相關問題