php抓取https的内容的代码
大家有时候需要获取https网页的内容,下面得方法,可以参考下。就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网!
直接用file_get_contents,会报错;
复制代码 代码如下:
$url = (/pic/p>
file_get_contents($url);
错误:
Warning: file_get_contents(/pic/p>
用curl的方式是可以的:
复制代码 代码如下:
$url = (/pic/p>
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);
print_r($result);
?>
重点是以下两句:
复制代码 代码如下:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区
为方便说明,先上代码吧
复制代码 代码如下:
/**
* curl POST
*
* @param string url
* @param array 数据
* @param int 请求超时时间
* @param bool HTTPS时是否进行严格认证
* @return string
*/
function curlPost($url, $data = array(), $timeout = 30, $CA = true){
$cacert = getcwd() . '/cacert.pem'; /pic/p>
$SSL = substr($url, 0, 8) == "/pic/p>
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout-2);
if ($SSL && $CA) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); /pic/p>
curl_setopt($ch, CURLOPT_CAINFO, $cacert); /pic/p>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); /pic/p>
} else if ($SSL && !$CA) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); /pic/p>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); /pic/p>
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); /pic/p>
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
/pic/pic/p>
$ret = curl_exec($ch);
/pic/pic/p>
curl_close($ch);
return $ret;
}
如果URL地址是https打头,那就走SSL,否则就走普通的HTTP协议。
是否走HTTPS的话就安全了吗?其实SSL也有不同的验证程度。
例如需不需要验证证书中的公用名呢?(BTW:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。)
需要验证主机名吗?
是任何证书都信任呢还是只信任CA颁布的呢?
(我擦嘞,电池快没点了,只捡关键地儿说了 - -|||)
如果网站SSL证书买的是CA的(通常比较贵),那么访问时可以使用比较严格的认证,即:
复制代码 代码如下:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); /pic/p>
curl_setopt($ch, CURLOPT_CAINFO, $cacert); /pic/p>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); /pic/p>
如果网站的证书是自己生成的,或者是网上的小机构申请的,那么访问时如果使用严格认证则不会通过,直接返回false。(对了,返回false时可以打印curl_error($ch)查看具体错误信息。)此时可以根据情况通过降低验证程度来保证正常访问,例如:
复制代码 代码如下:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); /pic/p>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); /pic/p>
平时我们使用浏览器访问各个https网站时,有时会遇到证书不受信的提示,其实就是因为这些网站的证书不是正规CA机构颁布的。
市面上各种浏览器中都内置了CA根证书列表信息,访问有CA颁布证书的网站时,会根据根证书验证这些网站的证书,所以就不会有这个提示了。
关于CA根证书文件,其实就是包含了各个主要CA机构的公钥证书,用来验证网站的证书是否是这些机构颁发的。
这里的这个文件是来源于mozilla的源码树,又转换成PEM格式证书文件。(大家可以到这里下载现成的/pic/ca/cacert.pem)
最后说一个和SSL无关的东西:
复制代码 代码如下:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
这个主要是为了解决POST时数据过长问题
【php抓取https的内容的代码】相关文章:
PHP实现抓取HTTPS内容02-11
php抓取页面的方法03-10
php抓取页面的的方法06-19
php分页类代码08-05
PHP代码运行流程07-15
PHP代码优化技巧10-01
PHP代码如何规范02-13
php语言字典代码02-15
PHP调用的C代码08-27