zoukankan      html  css  js  c++  java
  • PHP如何抓取https内容?记录一下。

    PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了。当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面,就不行了,而且效率及稳定性也不是很强。所以要是有特殊需求的话,还是用curl吧。不仅仅速度快,而且非常稳定,基本上用curl抓取失败的几率很小。

    而且今天在抓优酷视频API接口中的信息时,发现了一个问题,由于优酷API的url请求是https安全协议,用file_get_contents()函数竟然无法获取到数据,然后用curl写了个代替函数,虽然不报错了,但还是无法获取,最后Google的下,发现有很多人都曾经遇到过这个问题,而且都写出了解决办法。

    还是需要curl。

    <?php
    function file_get_contents_by_curl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_HEADER,0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
    $result = curl_exec($ch);
    curl_close($ch);return $result;}?>

    这两行才是关键。
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    算是一小段救命代码,以前知道的看完一笑就好了,主要为不知道的朋友们准备。

    直接用file_get_contents,会报错;
    程序代码$url = (https://xxx.com");
    file_get_contents($url);
    错误:
    程序代码Warning: file_get_contents(https://xxx.com) [function.file-get-contents]: failed to open stream: No such file or directory in D:wampwwwgrabber_clientindex.php on line 3
    用curl的方式是可以的:
    程序代码$url = (https://xxx.com);

    重点是以下两句:

    =============================================================
    今天项目上线,使用php的curl模块通过https访问某个文件时出错:
         这是我日志里记录的信息:
    2009-05-11 11:10:23 请求音频列表,错误号:60--错误描述:SSL certificate problem, verify that the CA cert is OK. Details:
    error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
    哎,项目上线急阿,请教同事得知修改如下代码即可,添加黑体字部分就好了。
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);

    虽然有些简单,但是还是写下来吧,以后好作参考。
    // 对HTTPS网站的访问,用到了扩展库curl

    要在PHP.ini中对curl的extension前面的分号去掉,可能还要把openssl的扩展同样打开
    请问如何配置curl才能支持获取https网站内容或者向https的网站提交数据 ?
    Linux下编译php的时候,把openssl支持一块编译进去
      --with-openssl[=DIR]    Include OpenSSL support (requires OpenSSL >= 0.9.6)
      --with-openssl-dir[=DIR]  FTP: openssl install prefix
      --with-imap-ssl[=DIR]    IMAP: Include SSL support. DIR is the OpenSSL install prefix
      --with-openssl-dir[=DIR]  SNMP: openssl install prefix
    我一般自己编译,如果你的Linux发行版带有php5-openssl包,安装好就行了 
    如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
      curl https://that.secure.server.com
    window下的https 通过curl访问的配置:
    http://618119.com/archives/2007/10/26/16.html
    http://hi.baidu.com/kkwtre/blog/item/3d20fbfb9a90da204e4aea01.html
    http://www.enet.com.cn/article/2011/0617/A20110617874334.shtml




















    =-----------------------------------------------------------------------------------------=
    PHP CURL HTTPS POST:

      1. function vpost($url,$data){ // 模拟提交数据函数  
      2.     $curl = curl_init(); // 启动一个CURL会话  
      3.     curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址  
      4.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查  
      5.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在  
      6.     curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器  
      7.     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转  
      8.     curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer  
      9.     curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求  
      10.     curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包  
      11.     curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环  
      12.     curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容  
      13.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回  
      14.     $tmpInfo = curl_exec($curl); // 执行操作  
      15.     if (curl_errno($curl)) {  
      16.        echo 'Errno'.curl_error($curl);//捕抓异常  
      17.     }  
      18.     curl_close($curl); // 关闭CURL会话  
      19.     return $tmpInfo// 返回数据  
      20. }  
      21.   
      22.   
      23. $url = "https://xxx.xxx.xxx/xxx";  
      24. $data ="x=xxxxxx";  
      25. $result = vpost($url,$data);  
  • 相关阅读:
    【JS】js获得下拉列表选中项的值和id
    【Java】Java处理double相加的结果异常
    【JSP】弹出带输入框可 确认密码 对话框
    【MySQL】Java对SQL时间类型的操作(获得当前、昨天、前年。。时间)
    【MySQL】通过select语句把一列数据拼接成一条字符串
    【JSP】JSP向MySQL写入|读出中文数据——乱码问题
    【CSS】使用CSS改变超链接样式
    【JSP】三种弹出对话框的用法实例
    【JSP】<meta>标签用法
    【Mysql】安装 mysql-5.7.5 指南
  • 原文地址:https://www.cnblogs.com/hechunhua/p/3695290.html
Copyright © 2011-2022 走看看