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. $url = "https://xxx.xxx.xxx/xxx";
    22. $data ="x=xxxxxx";
    23. $result = vpost($url,$data);

PHP如何抓取https内容?记录一下。的更多相关文章

  1. Fiddler:在PC和移动设备上抓取HTTPS数据包

    Fiddler是一个免费的Web调试代理,支持任何浏览器.系统以及平台.这个工具是进行Web和App网络开发的必备工具,戳此处下载. 根据Fiddler官网的描述,具有以下六大特点: Web调试 性能 ...

  2. 在服务器上用Fiddler抓取HTTPS流量

    转自:http://yoursunny.com/t/2011/FiddlerHTTPS/在服务器上用Fiddler抓取HTTPS流量 阳光男孩 发表于2011-03-19 开发互联网应用的过程中,常常 ...

  3. Fiddler抓取https请求 & Fiddler抓包工具常用功能详解

    Fiddler抓取https请求 & Fiddler抓包工具常用功能详解   先来看一个小故事: 小T在测试APP时,打开某个页面展示异常,于是就跑到客户端开发小A那里说:“你这个页面做的有问 ...

  4. fiddler抓取https请求(android/ios)

    本文转载自:http://blog.csdn.net/songer_xing/article/details/53841401 备注:本人有这样的一个需求,先记录下,以后再进行整理. 在抓包过程中发现 ...

  5. 【转】抓包工具Fiddler的使用教程(十二)下:Fiddler抓取HTTPS

    在教程十二(上),我们也了解了HTTPS协议,该教程就和大家分享Fiddler如何抓取HTTPS 抓包工具Fiddler的使用教程(十二):[转载]HTTPS协议 再次回忆一下关键内容: iddler ...

  6. Python做简单爬虫(urllib.request怎么抓取https以及伪装浏览器访问的方法)

    一:抓取简单的页面: 用Python来做爬虫抓取网站这个功能很强大,今天试着抓取了一下百度的首页,很成功,来看一下步骤吧 首先需要准备工具: 1.python:自己比较喜欢用新的东西,所以用的是Pyt ...

  7. Charles 如何抓取https数据包

    Charles可以正常抓取http数据包,但是如果没有经过进一步设置的话,无法正常抓取https的数据包,通常会出现乱码.举个例子,如果没有做更多设置,Charles抓取https://www.bai ...

  8. 如何让搜索引擎抓取AJAX内容? 转

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用 Ajax 技术,根据用户的输入,加载不同的内容. 这种做法的 ...

  9. 【转】【fiddler】抓取https数据失败,全部显示“Tunnel to......443”

    这个问题是昨天下午就一直存在的,知道今天上午才解决,很感谢“韬光养晦”. 问题描述: 按照网络上的教程,设置fiddler开启解密https的选项,同时fiddler的证书也是安装到系统中,但是抓取h ...

随机推荐

  1. [Hive - LanguageManual] Hive Concurrency Model (待)

    Hive Concurrency Model Hive Concurrency Model Use Cases Turn Off Concurrency Debugging Configuration ...

  2. cocosbuilder学习汇总

    目前与cocos2d-x-2.14版本对应的cocosbuilder版本为cocosbuilder-3,目前为alpha-5.稳定版本为cocosbuilder2.1,但与cocos2d-x不匹配(C ...

  3. SQL Server 中的三种分页方式

    USE tempdb GO SET NOCOUNT ON --创建表结构 IF OBJECT_ID(N'ClassB', N'U') IS NOT NULL DROP TABLE ClassB GO ...

  4. java的Socket通信例子及关于java.net.SocketException: Socket is closed错误

    今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误.单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketE ...

  5. 第二百七十天 how can I 坚持

    终于有点事干了,今天挺忙的. 今晚没玩游戏,看了个电影<解救吾先生>,还好. 傻. 12月28了,还三天就2016了,好快. 今天地铁人好多,早上又没起来,又迟到了,去霍营倒车,竟然还差点 ...

  6. Xamarin.Android真机调试时闪退解决办法

    项目->属性->Android Options,Packaging页签 去掉 Use Shared Runtime可解决

  7. Hadoop port to Jxta P2P Framework

    https://www.java.net/forum/topic/jxta/jxta-community-forum/hadoop-port-jxta-p2p-framework —————————— ...

  8. 06 java中常量以及常量池

    1.举例说明 变量 常量 字面量 int a=10; float b=1.234f; String c="abc"; final long d=10L; a,b,c为变量,d为常量 ...

  9. HDU 5734 Acperience (推导)

    Acperience 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5734 Description Deep neural networks (DN ...

  10. delphi读取excel

    简单的例子 procedure TForm1.Button1Click(Sender: TObject); var ExcelApp,MyWorkBook: OLEVariant; begin ope ...