• CURL


    基本语法:

    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数据

    四:压缩网页采集(gzip)

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

    CURLOPT_ENCODING参数配置压缩

    手册说明:支持的编码有"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参数禁用失败,所以大家最好同时使用两个参数。

    六:代理采集

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

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

    其他功能:    

    • 多线程采集

    • 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;
    }

  • 相关阅读:
    idea 中main 方法运行错误二
    shiro 忘记加密后的密码怎么办?
    idea 中 Caused by: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    Date 类型的比较
    oracle中数据类型对应java类型[转载]
    mybitis面试题基础必考 Mybatis 中$与#的区别
    301
    201
    0
    Apache负载 均衡
  • 原文地址:https://www.cnblogs.com/docter/p/5763723.html
Copyright © 2020-2023  润新知