2017-09-12 71 views
1

我試圖從菲律賓證券交易所網站記錄數據。我發現他們的端點是http://www.pse.com.ph/stockMarket/companyInfo.html?method=fetchHeaderData&company=29&security=146可以使用瀏覽器打開PSE API但不使用PHP

我可以使用任何瀏覽器清楚地訪問它,除非當我進入隱身模式,其中顯示的內容是拒絕訪問並且從不停止加載。當我嘗試使用PHP訪問它時,我確信發生的事情與後者相同。

我試圖訪問使用PHP無濟於事吧,這裏是我試過的嘗試:

  1. 的file_get_contents
  2. 捲曲與用戶代理
  3. 捲曲臨時餅乾
  4. 試過所有在本地主機和在服務器中。

代碼:

$c = tempnam ("/tmp", "CURLCOOKIE"); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.pse.com.ph/stockMarket/companyInfo.html"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $c); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $c); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "method=fetchHeaderData&ajax=true&company=29&security=146"); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
var_dump(curl_exec($ch)); 
curl_close ($ch); 

我沒有對爲何和如何發生的任何明確的想法。有人可以向我解釋爲什麼會發生,以及有什麼可能的解決方案(只有在可能的情況下才使用PHP)

我回顧了此API上的其他開發者的方法(它們都使用Java實現它),它只是一個簡單的POST請求,它完成了。我還沒有確認他們的代碼是否仍在工作。我無法發佈鏈接到他們的存儲庫(有限)。


的解決方案:

問題1.無法訪問API

$posts = array(
    "method"=>"fetchHeaderData", 
    "ajax"=>"true", 
    "company"=>29, 
    "security"=>146 
); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.pse.com.ph/stockMarket/companyInfo.html"); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$posts); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
var_dump(curl_exec($ch)); 
curl_close ($ch); 

好像我有兩個不同的問題。我現在可以使用上面的代碼訪問和使用API​​。不需要其他選項。將帖子數據轉換爲數組解決了問題。

問題2.拒絕訪問

論拒絕訪問的問題,它是餅乾有關。 @Wayne回答如下。


不幸的是,我不能接受兩個答案。

+0

當我訪問該鏈接時,我也看到訪問被拒絕。您確定他們沒有包含您的外部IP的終端上的白名單嗎?否則,您可能在訪問該鏈接之前登錄了他們的平臺? – Glubus

+1

在我的結尾url根本不開放 –

+0

活着死了,它現在似乎工作!問心無愧? – delboy1978uk

回答

0

試試這個解決方案。在數組轉換您的文章數據,那麼通過這個數組中CURLOPT_POSTFIELDS

$posts = array(
    "method"=>"fetchHeaderData", 
    "ajax"=>"true", 
    "company"=>29, 
    "security"=>146 
); 
$c = tempnam ("/tmp", "CURLCOOKIE"); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.pse.com.ph/stockMarket/companyInfo.html"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $c); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $c); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$posts); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
var_dump(curl_exec($ch)); 
curl_close ($ch); 
+0

我在當地和現場環境中嘗試過,但沒有奏效。 –

+0

在我的本地主機它不工作(去無限)。但添加數組後。它的給出輸出 –

+0

我已經重試它,並在本地主機它不工作。然而,當我在服務器上再次嘗試時,它神奇地工作。我會嘗試省略一些部分來提供更好的代碼,我不知道如何將它轉換爲數組,但我想它是與html實體。謝謝。 –

0

這是因爲他們有他們的服務器安裝程序從這樣做,阻止你。 他們正在用cookie保護數據


Cookie的細節

當你訪問它給你一個cookie,因爲它知道你是人類訪客在網站http://www.pse.com.ph/stockMarket/companyInfo.html

在瀏覽器工具進入

的document.cookie

看到你的cookie。它會爲您提供個人數據,因爲您擁有Cookie。

取出餅乾

的document.cookie = 「JSESSIONID =;期滿=星期四,01 1 1970 00:00:00 UTC;路徑= /;」;

,並參觀

http://www.pse.com.ph/stockMarket/companyInfo.html?method=fetchHeaderData&company=29&security=146

不去弄一個cookiehttp://www.pse.com.ph/stockMarket/companyInfo.html首先你將會得到403(禁止)

此外,他們沒有與回調JSONP這樣的ajax請求將違反跨域安全性。 JSON請求必須來自源自其網域或已批准網域的網頁。


他們爲什麼要這麼做。

可能他們的信息許可不允許他們將其提供給其他網站,或他們需要/想要獲得報酬以將信息提供給其他網站。或者他們有信息的使用條款。


哪裏可以獲取數據......數據要免費

我沒有看到任何地方在其網站上http://www.pse.com.ph,他們有API的信息以及如何請求資源的訪問權限。

可編程網頁一直是查找API的頭號來源,they have 96 stock APIs listed ...顯然,我不能只複製他們的數據並在這裏過去,但其中的一個API可能適合您?

相關問題