最近使用curl的时候,发现了一个比较好用的函数,当然是初级者适用的一个函数,就是curl_getinfo(),

在抓取一个页面的时候,会遇到302页面跳转的情况,刚开始处理的时候,是用curl抓取一个域名页面的内容,适用curl_exec,抓取页面全部内容,然后用正则匹配出来用户域名url,通过此域名再次抓取此地址的内容,这样做挺麻烦的,后来发现curl_getinfo(),返回来一个数组类型的值,里面有一个url,有一个http_code,http_code可以是302,200,404,500等,如果是302的话,就是页面跳转,直接可以得到跳转的页面的url。这样,就可以直接跳过抓取域名地址哪一步,直接获得跳转页面的链接,直接抓取内容就好了,下面是例子:

<?php
$url = ‘sunking18.tk’;
$ch = curl_init();
$header = array ();
$header [] = ‘sunking18.tk’;
$header [] = ‘User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8′;
$header [] = ‘Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8′;
$header [] = ‘Accept-Encoding: gzip, deflate’;
$header [] = ‘Accept-Language: zh-cn,zh;q=0.5′;
$header [] = ‘Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7′;
$header [] = ‘Keep-Alive: 115′;
$header [] = ‘Connection: Keep-Alive’;
$header [] = ‘Referer:  sunking18.tk’;

$ch = curl_init();
curl_setopt ($ch, CURLOPT_TIMEOUT, 100);
curl_setopt ($ch, CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt ($ch, CURLOPT_HEADER,true);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_ENCODING, “gzip” ); //设置为客户端支持gzip压缩
$re  = curl_exec($ch);
$res = curl_getinfo($ch);
echo “<pre>”;
print_r($res);

?>

打印结果如下:

Array ( [url] => HTTP://sunking18.tk [content_type] => text/html [http_code] => 302 [header_size] => 311 [request_size] => 387 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 1.467 [namelookup_time] => 1.014 [connect_time] => 1.03 [pretransfer_time] => 1.03 [size_upload] => 0 [size_download] => 167 [speed_download] => 113 [speed_upload] => 0 [download_content_length] => 167 [upload_content_length] => 0 [starttransfer_time] => 1.467 [redirect_time] => 0 [certinfo] => Array ( ) )

其中,url就是302跳转页面url,http_code就是http状态码,如果想要单独获得其中的一个参数,只要在curl_getinfo($ch,**)设置你想要的参数就可以了,比如,你想要获得http_code,就可以使用:curl_getinfo($ch,CURLINFO_HTTP_CODE),则会返回一个http_code字符串。很方便使用。

curl_getinfo 共有20个参数,如下:

这个参数可能是以下常量之一:

  • CURLINFO_EFFECTIVE_URL – 最后一个有效的URL地址
  • CURLINFO_HTTP_CODE – 最后一个收到的HTTP代码
  • CURLINFO_FILETIME – 远程获取文档的时间,如果无法获取,则返回值为“-1”
  • CURLINFO_TOTAL_TIME – 最后一次传输所消耗的时间
  • CURLINFO_NAMELOOKUP_TIME – 名称解析所消耗的时间
  • CURLINFO_CONNECT_TIME – 建立连接所消耗的时间
  • CURLINFO_PRETRANSFER_TIME大专栏  curl_getinfo的巧用ong> – 从建立连接到准备传输所使用的时间
  • CURLINFO_STARTTRANSFER_TIME – 从建立连接到传输开始所使用的时间
  • CURLINFO_REDIRECT_TIME – 在事务传输开始前重定向所使用的时间
  • CURLINFO_SIZE_UPLOAD – 上传数据量的总值
  • CURLINFO_SIZE_DOWNLOAD – 下载数据量的总值
  • CURLINFO_SPEED_DOWNLOAD – 平均下载速度
  • CURLINFO_SPEED_UPLOAD – 平均上传速度
  • CURLINFO_HEADER_SIZE – header部分的大小
  • CURLINFO_HEADER_OUT – 发送请求的字符串
  • CURLINFO_REQUEST_SIZE – 在HTTP请求中有问题的请求的大小
  • CURLINFO_SSL_VERIFYRESULT – 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD – 从Content-Length: field中读取的下载内容长度
  • CURLINFO_CONTENT_LENGTH_UPLOAD – 上传内容大小的说明
  • CURLINFO_CONTENT_TYPE – 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type:header

可以根据需要设置不同的参数。

顺带说一下,http_code的含义:

[Informational 1xx]

$http_code[“0”]=”Unable to access”;
$http_code[“100”]=”Continue”;
$http_code[“101”]=”Switching Protocols”;

[Successful 2xx]
$http_code[“200”]=”OK”;
$http_code[“201”]=”Created”;
$http_code[“202”]=”Accepted”;
$http_code[“203”]=”Non-Authoritative Information”;
$http_code[“204”]=”No Content”;
$http_code[“205”]=”Reset Content”;
$http_code[“206”]=”Partial Content”;

[Redirection 3xx]
$http_code[“300”]=”Multiple Choices”;
$http_code[“301”]=”Moved Permanently”;
$http_code[“302”]=”Found”;
$http_code[“303”]=”See Other”;
$http_code[“304”]=”Not Modified”;
$http_code[“305”]=”Use Proxy”;
$http_code[“306”]=”(Unused)”;
$http_code[“307”]=”Temporary Redirect”;

[Client Error 4xx]
$http_code[“400”]=”Bad Request”;
$http_code[“401”]=”Unauthorized”;
$http_code[“402”]=”Payment Required”;
$http_code[“403”]=”Forbidden”;
$http_code[“404”]=”Not Found”;
$http_code[“405”]=”Method Not Allowed”;
$http_code[“406”]=”Not Acceptable”;
$http_code[“407”]=”Proxy Authentication Required”;
$http_code[“408”]=”Request Timeout”;
$http_code[“409”]=”Conflict”;
$http_code[“410”]=”Gone”;
$http_code[“411”]=”Length Required”;
$http_code[“412”]=”Precondition Failed”;
$http_code[“413”]=”Request Entity Too Large”;
$http_code[“414”]=”Request-URI Too Long”;
$http_code[“415”]=”Unsupported Media Type”;
$http_code[“416”]=”Requested Range Not Satisfiable”;
$http_code[“417”]=”Expectation Failed”;

[Server Error 5xx]
$http_code[“500”]=”Internal Server Error”;
$http_code[“501”]=”Not Implemented”;
$http_code[“502”]=”Bad Gateway”;
$http_code[“503”]=”Service Unavailable”;
$http_code[“504”]=”Gateway Timeout”;
$http_code[“505”]=”HTTP Version Not Supported”;

curl_getinfo的巧用的更多相关文章

  1. PHP也玩并发,巧用curl 并发减少后端访问时间

    首先,先了解下 php中的curl多线程函数: # curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getco ...

  2. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  3. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  4. TSql 巧用Alt 键

    1,查看表的信息 在TSql 编辑器中,选中一个表,如图 点击Alt+F1,就可以查看表的属性定义 2,使用alt批量插入逗号 在Tsql中使用 in 子句,在(value_List)列表中,经常有很 ...

  5. 前端工程师技能之photoshop巧用系列第三篇——切图篇

    × 目录 [1]切图信息 [2]切图步骤 [3]实战 前面的话 前端工程师除了使用photoshop进行测量之外,更重要的是要使用该软件进行切图.本文是photoshop巧用系列的第三篇——切图篇 切 ...

  6. 前端工程师技能之photoshop巧用系列第二篇——测量篇

    × 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...

  7. 前端工程师技能之photoshop巧用系列第一篇——准备篇

    × 目录 [1]作用 [2]初始化 [3]常用工具[4]快捷键 前面的话 photoshop是前端工程师无法回避的一个软件,这个软件本身很强大,但我们仅仅需要通过这个工具来完成基本的切图工作即可.本文 ...

  8. 巧用CSS实现分隔线

    下面是几种简单实现分隔线的方法,个人比较喜欢第二种,我也给出了最后第五种比较2的写法,请大家拍砖,或者提供其他好的方法. 单个标签实现分隔线: 点此查看实例展示 .demo_line_01{ padd ...

  9. iOS开发之巧用Block和代理方法结合来传值

    好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...

随机推荐

  1. Codeforces 1294E - Obtain a Permutation

    题目大意: 给定一个n*m的矩阵 可以更改任意一个位置的值 也可以选择一整列全部往上移动一位,最上方的数移动到最下方 问最少操作多少次可以把这个矩阵移动成 1 2 3 ... m m+1 m+2 m+ ...

  2. lower_bound()和upper_bound()用法详解

    lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. lower_bound( begin,end,num):从数组的begin位置到end ...

  3. ifconfig筛选出IP

    ifconfig     |grep inet    |awk -F: 'NR==1{print}'     |awk  '{print $2}'

  4. 几个Java基础题

    1.java中线程能不能重复start t1.start();        System.out.println("ssss");        t1.start(); 答:第一 ...

  5. Java常用的公共方法

    --获取规字符串中的指定名称的某个字段值 1.public String getValueByName(String params,String name) --用于通过表单选中的复选框获取它的值(j ...

  6. Docker添加root用户

    0 环境 系统环境:centos7 服务器:阿里云 1 正文 1 进入rabbitmq容器中 docker exec -i -t 563 bin/bash 2 添加用户(用户名和密码) rabbitm ...

  7. Educational Codeforces Round 80 (Rated for Div. 2)D E

    D枚举子集 题:https://codeforces.com/contest/1288/problem/D题意:给定n个序列,每个序列m个数,求第i个和第j个序列组成b序列,b序列=max(a[i][ ...

  8. Linux系统国内镜像站点

    一,更换说明 第一步 备份 如centos, mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup ...

  9. java调用IPFS去中心化体系

    Maven pom.xml引入 <repositories> <repository> <id>jitpack.io</id> <url>h ...

  10. day47-线程-锁和死锁

    #1.锁:防止多个线程同时读写某一块内存区域. from threading import Thread from threading import Lock def func(): global n ...