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

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】
最近在学习并利用QueryList采集,这是别人分享的一款简易PHP采集系统,因为也是初版,所以功能并不是太多,很多地方需要自己弄。因为PHP采集嘛,所以涉及curl函数 不懂这个函数的朋友 移步至:https://woj.app/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'); |
这样就应该可以了, 到这里呢,本人暂时把遇到的问题记录,如果有朋友还遇到别的问题, 可以留言,咱们一起研究并解决。给大家分享。
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏