php curl请求信息和返回信息设置代码实例


Posted in PHP onApril 27, 2015

在用curl抓取网页内容的时候,经常要知道,网页返回的请求头信息,和请求的相关信息,特别是在请求过程中存在重定向的时候获取请求返回头信息对分析请求内容很有帮助

下面就是一个请求中存在重定向的例子,我们的目的是要获取最终实际请求的url地址

$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect'; 
 
$ch=curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
//curl_setopt($ch, CURLOPT_POST, 1); 
//curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
curl_setopt($ch, CURLOPT_HEADER, 1);//返回response头部信息 
curl_setopt($ch, CURLOPT_NOBODY, 1);//不返回response body内容 
//curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//设置请求最多重定向的次数 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求 
$content=curl_exec($ch); 
$rinfo=curl_getinfo($ch); 
 
echo $content,"</br>"; 
echo "<hr>"; 
print_r($rinfo);

下面是输出的结果

HTTP/1.1 200 OKServer: nginxDate: Sat, 22 Dec 2012 06:17:44 GMTContent-Type: application/vnd.android.package-archiveConnection: closeLast-Modified: Mon, 03 Dec 2012 16:00:00 GMTExpires: Tue, 03 Dec 2013 16:00:00 GMTCache-Control: max-age=31536000Content-Length: 2142149
Array( [url] => http://www.d.appchina.com/McDonald/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect [content_type] => application/vnd.android.package-archive [http_code] => 200 [header_size] => 289 [request_size] => 196 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.171621 [namelookup_time] => 0.135256 [connect_time] => 0.152913 [pretransfer_time] => 0.152916 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 2142149 [upload_content_length] => 0 [starttransfer_time] => 0.171582 [redirect_time] => 0 [certinfo] => Array ( ))

可以看到,经过递归请求后最终得到一个200的response,但是这中方式不能得到最后一次请求的url,也就是最终实际请求的url,要想得到这个url就需要递归的分析每次请求返回的response

下面是我写的一个获取最后一次请求url的递归函数

$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect'; 
[php] view plaincopy
$realUrl=getRedirectLocation($url); 
 
echo "</br>--->",$realUrl; 
 
function getRedirectLocation($url){ 
   
  $realUrl=$url; 
  echo $url,"</br>"; 
  $ch=curl_init(); 
  curl_setopt($ch, CURLOPT_URL, $url); 
  curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒 
  //curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url 
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
  $content=curl_exec($ch); 
  //echo $content; 
  $rinfo=curl_getinfo($ch); 
  $matches=array(); 
  if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){ 
    //echo $matches[1],"</br>"; 
    unset($content); 
    $realUrl=getRedirectLocation($matches[1]); 
  } 
  if(isset($content)){ 
    unset($content); 
  } 
  return $realUrl; 
}
PHP 相关文章推荐
php创建多级目录代码
Jun 05 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
初识ThinkPHP控制器
Apr 07 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
php反射学习之依赖注入示例
Jun 14 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 PHP
PHP rsa加密解密使用方法
Apr 27 #PHP
PHP、Java des加密解密实例
Apr 27 #PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 #PHP
php curl 获取https请求的2种方法
Apr 27 #PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 #PHP
JavaScript实现滚动栏效果的方法
Apr 27 #PHP
php curl 上传文件代码实例
Apr 27 #PHP
You might like
SONY ICF-SW55的电路分析
2021/03/02 无线电
php array的学习笔记
2012/05/10 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
pandas object格式转float64格式的方法
2018/04/10 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
python async with和async for的使用
2019/06/20 Python
三个python爬虫项目实例代码
2019/12/28 Python
python Tornado框架的使用示例
2020/10/19 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
资产评估专业学生的自我鉴定
2013/11/14 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
鸟的天堂导游词
2015/01/31 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
详解Redis复制原理
2021/06/04 Redis
APP界面设计技巧和注意事项
2022/04/29 杂记