位置: IT常识 - 正文

使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题(curl抓包)

编辑:rootadmin
Woody的技术Blog » 使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题June 21st, 2011 使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题June 21st, 2011 Woody Leave a comment Go to comments

推荐整理分享使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题(curl抓包),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:curl获取ip,curl调用https,curl调用https,urlhelper抓取教程,curl抓取网页,curl获取ip,curl获取ip,curl抓包,内容如对您有帮助,希望把文章链接给更多的朋友!

在PHP的CURL扩展中,是可以通过CURL自身的设计自动处理HTTP 30X的跳转的。这个特性在使用起来很简单:

$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');curl_setopt($ch, CURLOPT_HEADER, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);$content = curl_exec($ch);

正常情况下,$content 中的结果包括了 HTTP 头和 body 的信息,且以 "\r\n\r\n" 分隔。因此可以用

list($header, $body) = explode("\r\n\r\n", $content, 2);

来分别取得这两部分。不过如果在要访问的地址上发生了 HTTP 跳转,这时 curl_exec 执行得到的结果中就包含了两次访问的头部。例如把上面的代码的 URL 部分换成我这里的:

curl_setopt($ch, CURLOPT_URL, 'http://cn.programmingnote.com');

当访问 cn.programmingnote.com 时,会触发一个 302 跳转。此时 curl_exec 返回内容的开头是:

HTTP/1.1 302 Found

Date: Tue, 21 Jun 2011 08:15:58 GMT

Server: Apache/2.2.16 (Ubuntu)

X-Powered-By: PHP/5.3.3-1ubuntu9.5

Location: blog/

Vary: Accept-Encoding

Content-Length: 0

Content-Type: text/html

HTTP/1.1 200 OK

Date: Tue, 21 Jun 2011 08:15:58 GMT

Server: Apache/2.2.16 (Ubuntu)

X-Powered-By: PHP/5.3.3-1ubuntu9.5

X-Pingback: http://cn.programmingnote.com/blog/xmlrpc.php

Vary: Accept-Encoding

使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题(curl抓包)

Transfer-Encoding: chunked

Content-Type: text/html; charset=UTF-8

很明显包含了两次的 HTTP 头部信息。此时再用 explode("\r\n\r\n", $content, 2) 的方法会把下面的头部信息归到 HTTP Body 部分里去。

而我在命令行下直接使用 curl 来访问包含跳转的地址时,却发现可以正确地把头部和 body 部分区别开。因此我想到可能是 PHP 的 curl 扩展在实现方面有些问题。于是我在 curl 扩展的代码中找到了 curl_exec 的实现:

/* {{{ proto bool curl_exec(resource ch)Perform a cURL session */PHP_FUNCTION(curl_exec){CURLcodeerror;zval*zid;php_curl*ch;if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zid) == FAILURE) {return;}ZEND_FETCH_RESOURCE(ch, php_curl *, &zid, -1, le_curl_name, le_curl);_php_curl_cleanup_handle(ch);error = curl_easy_perform(ch->cp);SAVE_CURL_ERROR(ch, error);/* CURLE_PARTIAL_FILE is returned by HEAD requests */if (error != CURLE_OK && error != CURLE_PARTIAL_FILE) {if (ch->handlers->write->buf.len > 0) {smart_str_free(&ch->handlers->write->buf);}RETURN_FALSE;}// more code ...}

从名字上可以看出,真正处理 HTTP 访问的代码应该是在 curl_easy_perform 做的。经查证,这个函数是属于 libcurl 这个库的,和 PHP 扩展已经没有关系了。并且,我写了一段直接使用 libcurl 库的代码,和 PHP 中的用法并没有太大的区别,也没有特殊的参数用来设计是保留多次的 HTTP Header 还是只保留最后的一次 Header。

#include <curl/curl.h>#include <stdio.h>int main(){CURL *handler = curl_easy_init();curl_easy_setopt(handler, CURLOPT_HEADER, 1);curl_easy_setopt(handler, CURLOPT_FOLLOWLOCATION, 1);curl_easy_setopt(handler, CURLOPT_URL, "http://cn.programmingnote.com");int res = curl_easy_perform(handler);printf("%d\n", res);return 0;}

和在 PHP 中测试的结果一样,依然是记录了两个 Header。

既然如此,想要把最后跳转到的地址的 Header 和 Body 区别出来,如果能知道跳转的次数就好了。毕竟每多跳一次,就多了一个 Header 部分,而且多个 Header 之间仍然是以 "\r\n\r\n" 分隔的。于是看 PHP curl 的 curl_getinfo,在 Return Values 中看到了 "redirect_count" 一项,正是要找的。

HTTP/1.1 302 Found

Date: Tue, 21 Jun 2011 08:15:58 GMT

Server: Apache/2.2.16 (Ubuntu)

X-Powered-By: PHP/5.3.3-1ubuntu9.5

Location: blog/

Vary: Accept-Encoding

Content-Length: 0

Content-Type: text/html

HTTP/1.1 200 OK

Date: Tue, 21 Jun 2011 08:15:58 GMT

Server: Apache/2.2.16 (Ubuntu)

X-Powered-By: PHP/5.3.3-1ubuntu9.5

X-Pingback: http://cn.programmingnote.com/blog/xmlrpc.php

Vary: Accept-Encoding

Transfer-Encoding: chunked

Content-Type: text/html; charset=UTF-8

本文链接地址:https://www.jiuchutong.com/zhishi/313144.html 转载请保留说明!

上一篇:python中如何实现信息增益和信息增益率(python如何运用)

下一篇:EasyExcel复杂表头导出(一对多)升级版(excel表格复杂表头)

  • 华为手机微信收款语音播报如何设置(华为手机微信收信息延迟怎么办)

    华为手机微信收款语音播报如何设置(华为手机微信收信息延迟怎么办)

  • 苹果点两下屏幕会亮怎么设置(苹果点两下屏幕锁屏怎么设置)

    苹果点两下屏幕会亮怎么设置(苹果点两下屏幕锁屏怎么设置)

  • 苹果11怎么设置陌生号码打不进来(苹果11怎么设置悬浮球)

    苹果11怎么设置陌生号码打不进来(苹果11怎么设置悬浮球)

  • cad是哪个国家的(cad是哪个国家的简称)

    cad是哪个国家的(cad是哪个国家的简称)

  • 计算机用来表示存储空间大小的基本单位(计算机用来表示内存储器容量的基本单位是)

    计算机用来表示存储空间大小的基本单位(计算机用来表示内存储器容量的基本单位是)

  • 台式电脑怎么设置屏保时间(台式电脑怎么设置密码)

    台式电脑怎么设置屏保时间(台式电脑怎么设置密码)

  • 什么软件剪辑视频没有水印(什么软件剪辑视频可以赚钱)

    什么软件剪辑视频没有水印(什么软件剪辑视频可以赚钱)

  • qq一般多久自动注销(qq一般多久自动回复消息)

    qq一般多久自动注销(qq一般多久自动回复消息)

  • 宽带光猫是什么(宽带光猫是什么样子的图片)

    宽带光猫是什么(宽带光猫是什么样子的图片)

  • 华为watchgt2和荣耀magicwatch2区别(华为watchgt2和荣耀gspro的区别)

    华为watchgt2和荣耀magicwatch2区别(华为watchgt2和荣耀gspro的区别)

  • 华为怎么设置返回键在哪里(华为怎么设置返回键在右边)

    华为怎么设置返回键在哪里(华为怎么设置返回键在右边)

  • 苹果xs和xsmax外观区别(苹果xs和xsmax外放音效区别)

    苹果xs和xsmax外观区别(苹果xs和xsmax外放音效区别)

  • qq扩列匹配失败是什么原因(qq扩列匹配失败匹配失败)

    qq扩列匹配失败是什么原因(qq扩列匹配失败匹配失败)

  • 路由器怎么开启(路由器怎么开启wifi6)

    路由器怎么开启(路由器怎么开启wifi6)

  • 美版苹果11pro支持双卡吗(美版苹果11pro能插几张卡)

    美版苹果11pro支持双卡吗(美版苹果11pro能插几张卡)

  • 苹果x前面的灯怎么闪烁(苹果x前面灯光闪烁怎么设置)

    苹果x前面的灯怎么闪烁(苹果x前面灯光闪烁怎么设置)

  • 12.2怎么显示5g(怎么让iphone12显示5g)

    12.2怎么显示5g(怎么让iphone12显示5g)

  • 苹果x设置壁纸怎么缩小(苹果X设置壁纸)

    苹果x设置壁纸怎么缩小(苹果X设置壁纸)

  • 拼多多怎么货到付款(拼多多怎么货到退货)

    拼多多怎么货到付款(拼多多怎么货到退货)

  • 抖音看直播怎么全屏(抖音看直播怎么调清晰度)

    抖音看直播怎么全屏(抖音看直播怎么调清晰度)

  • 京东好店是什么意思(京东好店是什么意思?)

    京东好店是什么意思(京东好店是什么意思?)

  • 北魁北克的公路,加拿大 (© Posnov/Getty Images)(魁北克位置地图)

    北魁北克的公路,加拿大 (© Posnov/Getty Images)(魁北克位置地图)

  • 计算机视觉会议(CVPR,ECCV,ICCV,NIPS,AAAI,ICLR等)(计算机视觉会议2023年11月)

    计算机视觉会议(CVPR,ECCV,ICCV,NIPS,AAAI,ICLR等)(计算机视觉会议2023年11月)

  • 合伙企业如何纳入合并报表
  • 个人股权激励收入申报
  • 房租合同印花税计算方法
  • 出差旅费补助报销明细表需要发票吗?
  • 回迁房的交易流程
  • 个人所得税该如何缴纳
  • 抵押贷款评估费用标准
  • 银行理财产品赎回
  • 往来核算会计的岗位职责和工作内容
  • 工程预付款的规定
  • 增值税税控系统专用设备抵减增值税
  • 企业销售货物后,若发生销货退回或销售折让
  • 科技型中小企业享受优惠税收政策2023
  • 收回公司代垫职工款项怎么做凭证?
  • 存货跌价准备怎么计提
  • 企业未代扣代缴个税
  • 小微企业附加税怎么算
  • 股东可以以知识产权作价出资吗
  • 小型微利企业的企业所得税优惠政策
  • 会计行业新技术
  • 出口布料有退税吗
  • 理财公司收到客户投资款怎么处理
  • 调整以前年度的收入怎么入账
  • 如何计算每个月的天数
  • 外账的结转成本是什么
  • 如何部署迫击炮
  • 劳务报酬纳税计算器
  • php获取useragent
  • php imagecopymerge
  • 固定资产更新改造期间提折旧吗
  • 企业亏损注销税务会不会来查账
  • 增值税专用发票有几联?
  • 结转,结余
  • 调入的无形资产记入哪里
  • mlocate.db 删除
  • 企业盈利不交所得税的办法
  • 商品过期的会计分录
  • 双抬头发票认证
  • 邮寄的发票对方没收到怎么办
  • 投资公司如何注册勘察设计工程师证书
  • 工资费用核算
  • python中dataframe的布尔过滤
  • 帝国cms移动端
  • 生产设备的折旧分录
  • 个人所得税表格怎么做
  • MySQL5.6 Replication主从复制(读写分离) 配置完整版
  • 企业现金清查的主要内容有什么
  • 电子承兑背书一般多久到账
  • 预提费用在汇算清缴时调整
  • 出口报关金额怎么算
  • 清算期间档案转移
  • 简易计税通过哪个科目核算
  • 先进先出法实际成本跟成本不一样吗
  • 发票管理办法实体法还是程序法
  • 项目资本金如何确定
  • 库存现金过多的隐患
  • 签发空头支票的罚款
  • sql语句的执行方式
  • mysql详细教程
  • fedora安装apt
  • win7系统重启后多了一个安全启动用户
  • Vista下jusched.exe进程与禁用
  • solaris ssh offline
  • ghost安装器怎么用
  • 控制面板中的添加和删除在哪里
  • 开机越来越慢会不会是硬件的问题
  • Win7系统如何打开磁盘管理工具
  • Win7系统如何清除流氓屏保
  • win8怎么隐藏桌面图标
  • linux dns1
  • Windows 8 Consumer Preview 中的新热键介绍
  • cocos creator性能
  • 游戏引擎的重要性
  • angular之ng-template模板加载
  • NeHe OpenGL Lesson 9
  • eevee引擎
  • shell win10
  • javascript怎么学
  • 交通运输业的税率9%和13%
  • 个人所得税工资达到多少才交税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设