我试图从菲律宾证券交易所网站上记录数据。我发现他们的端点是http://www.pse.com.ph/stockMarket/companyInfo.html?method=fetchHeaderData&company=29&security=146
我可以使用任何浏览器清楚地访问它,除非我进入隐身模式,我显示的内容是拒绝访问并且永远不会停止加载。当我尝试使用PHP访问它时,我非常确定发生的事情与后者相同。
我尝试使用PHP访问它无济于事,以下是我尝试过的尝试:
代码:
$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.访问被拒绝
关于拒绝访问的问题,它与cookie有关。以下由@Wayne回答。
不幸的是,我无法接受两个答案。
答案 0 :(得分: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);
答案 1 :(得分:0)
这是因为他们的服务器设置阻止你这样做。 他们使用Cookie保护数据。
Cookie详细信息
当您访问网站http://www.pse.com.ph/stockMarket/companyInfo.html时,它会为您提供一个Cookie,因为它知道您是一名访问者。
在浏览器工具中输入
document.cookie
查看您的Cookie。它会为您提供个人数据,因为您有cookie。
删除cookie
document.cookie =" JSESSIONID =; expires = Thu,01 Jan 1970 00:00:00 UTC;路径= /;&#34 ;;
并访问
http://www.pse.com.ph/stockMarket/companyInfo.html?method=fetchHeaderData&company=29&security=146
无需获取Cookie http://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中的一个可能对您有用吗?