2017-09-12 61 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可能适合您?

相关问题