A-A+

php curl采集问题 (采集不到内容 采集乱码 SSL错误)详解

2015年05月06日 10:56 学习笔记 暂无评论 阅读 560 views 次

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】

最近在学习并利用QueryList采集,这是别人分享的一款简易PHP采集系统,因为也是初版,所以功能并不是太多,很多地方需要自己弄。因为PHP采集嘛,所以涉及curl函数 不懂这个函数的朋友 移步至:http://gdd.gd/640.html ,在下面讲解采集不到内容 采集乱码 SSL错误等问题如何解决。

问题一(PHP采集不到内容)
首先讲讲采集不到内容,其实很多时候只需要如下代码就可以采集到内容(先不管是不是乱码),代码如下:

1
2
3
4
5
6
7
8
9
function gett($url){
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$data = curl_exec($ch);
	curl_close($ch);
	return $data;
}

就这么简单其实就可以,你可以利用这个代码试验一下,如果能抓取到内容乱码不乱码无所谓,只要能抓取到内容,那就OK。如果抓取不到内容有以下几种可能:
一、可能是对方开启了cookie验证,你必须含有某个特定的cookie才能得到页面内容。所以这里你必须利用工具抓包,看看你浏览器中的cookie,然后把你自己cookie封装到采集里面提交上去。
二、可能对方开启了REFERER验证,你需要把CURLOPT_REFERER 设定成跟采集一样的某个页面。

问题二(PHP采集内容乱码)
很多朋友采集到的内容是乱码,其实这里只是涉及到了一个转码问题。但是有时候转码然后内容就变空了什么都没有。所以有以下几种可呢过:
一、转码问题,对方的网站内容是gb3212的,你的页面是UFT-8的,这里可以用到 $con = iconv('GBK','UTF-8', $con); 这个con就是你刚刚采集得到的内容。或者mb_convert_encoding($str, 'utf-8', 'GBK,UTF-8,ASCII');
二、这个乱码你转换完之后就为空了,什么都没有,这个可能就是网页头部 压缩gzip加密了。这里就需要本地还原一下,$return = gzdecode($return); //将return的字符进行解码 还有一种方法就是采集的时候直接解码 curl_setopt($ch, CURLOPT_ENCODING, 'gzip');

问题三(PHP采集SSL错误)
有朋友使用curl发起https请求的时候报错:“SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed”,或者别的错误。这里就需要了解一下CURLOPT_SSL_VERIFYHOST 证书的问题。

这里呢解决的方法一是:

1
2
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);	//跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);	// ~设为0表示不检查证书  ~设为1表示检查证书中是否有CN(common name)字段 ~设为2表示在1的基础上校验当前的域名是否与CN匹配

下面的另一种解决方法就是换新证书,但是这个方法本人未试,大家自行试验吧。
方法二、设定一个正确的证书。

本地ssl判别证书太旧,导致链接报错ssl证书不正确。

我们需要下载新的ssl 本地判别文件

http://curl.12306.cc/ca/cacert.pem

放到 程序文件目录

curl 增加下面的配置

1
2
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');

这样就应该可以了, 到这里呢,本人暂时把遇到的问题记录,如果有朋友还遇到别的问题, 可以留言,咱们一起研究并解决。给大家分享。

标签:

给我留言