CURL

时间:2023-01-19 18:35:17

基本语法:

function curl($url){
$ch=curl_init();                  //初始化
curl_setopt($ch, CURLOPT_URL, $url);     //核心

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //是否直接显示
$str=curl_exec($ch);                //执行
curl_close($ch);                 //关闭
return $str;                  //返回
}

一:简单的curl采集

1. 初始化

  $ch = curl_init(); //

2. 设置选项,包括URL

  curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net");

  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

  curl_setopt($ch,CURLOPT_HEADER,0); //

3. 执行并获取HTML文档内容

  $output = curl_exec($ch);

  if($output === FALSE ){ echo "CURL Error:".curl_error($ch); }

4. 释放curl句柄

  curl_close($ch);

5.输出

  echo $output;

二:需要Referer的采集

对于一些程序,它可能判断来源网址,如果发现referer不是自己的网站,则拒绝访问,这时候,我们就需要添加CURLOPT_REFERER参数,模拟来路,使得程序能够正常采集。

<?php

if(empty($_POST['wd'])) {

exit('Deny empty params.'); }

//Referer判断

if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false)

{ exit('Deny'); }

$keyword = addslashes(trim(strip_tags($_POST['wd'])));

$url = 'http://www.baidu.com/s?ie=utf-8&wd=' . urlencode($keyword);

$ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据不直接输出

$content = curl_exec($ch); //执行并存储结果

curl_close($ch);

echo $content;

三:需要cookie支持的采集

对于模拟登录的应用,单单提交参数和模拟来路并不能解决问题,这时候我们就需要保存或者提交相应的Cookie参数,这个在PHP cURL里面也提供了相应的参数:
CURLOPT_COOKIE: 直接使用字符串方式提交cookie参数
CURLOPT_COOKIEFILE: 使用文件方式提交cookie参数
CURLOPT_COOKIEJAR: 保存提交后反馈的cookie数据

CURL

四:压缩网页采集(gzip)

无论使用iconv还是强大的mb_convert_encoding都无法还原数据;

CURLOPT_ENCODING参数配置压缩

CURL

手册说明:支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。
后面一句表明,使用curl_setopt($ch, CURLOPT_ENCODING, "");也是可以的,但是不能不加这个参数。

五: SSL链接的采集;

有些请求链接是https类型的,这时候使用cURL采集可能会失败,这时候,我们可以使用 var_dump(curl_error($ch));的方法打印错误提示,然后根据错误提示查找相应的解决方案。比如SSL错误常见提示:SSL certificate problem: unable to get local issuer certificate,这时候,我们就需要利用参数:CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 来禁用SSL证书的验证,我尝试过只使用CURLOPT_SSL_VERIFYPEER参数禁用失败,所以大家最好同时使用两个参数。

CURL

六:代理采集

大家都知道,国内存在万恶的墙,所以,假如我们需要获取某些被墙数据时,就需要用到国外代理服务器;又或者我们需要采集大量数据时,需要不断切换IP,也会用到代理。
使用代理在PHP cURL里面有几个相对应的参数:CURLOPT_PROXY、CURLOPT_PROXYPORT 和 CURLOPT_PROXYUSERPWD,还有另外几个,这里不列举。
CURLOPT_PROXY 指定代理IP参数
CURLOPT_PROXYPORT 指定代理端口参数
CURLOPT_PROXYUSERPWD 指定需要验证的代理的账号密码,"[username]:[password]"格式的字符串

关于代理账号获取,大家自己发挥,我这里提供网上搜索到的一个列表:高匿代理

CURL

其他功能:    

  • 多线程采集

  • 302跳转(301跳转)

  • 模拟上传文件

发送与获取json数据

封装函数:

function curl($url, $data="")
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    //SSL 报错时使用
    //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);   
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1) ;
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0") ;
    curl_setopt($ch, CURLOPT_REFERER, $url) ;
   // curl_setopt($ch, CURLOPT_ENCODING, "gzip");
    //传递cookie
    if($data["cookie"])
    {
        curl_setopt($ch, CURLOPT_COOKIE, $data["cookie"]) ;
    }
    
    $response = curl_exec($ch);
    $header = curl_getinfo($ch);
       
    if (curl_errno($ch)) {
        print curl_error($ch);
    }
    curl_close($ch);
    
    return $response;
}