位置: 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表格复杂表头)

  • 电脑文档打印怎么操作步骤(电脑文档打印怎么取消)

    电脑文档打印怎么操作步骤(电脑文档打印怎么取消)

  • 苹果xr能遥控空调吗(iphonexr遥控器控制空调)

    苹果xr能遥控空调吗(iphonexr遥控器控制空调)

  • cpu开盖什么意思(cpu开盖干什么)

    cpu开盖什么意思(cpu开盖干什么)

  • 苹果11防摔吗(苹果防摔吗?)

    苹果11防摔吗(苹果防摔吗?)

  • opporeno3是什么接口(opporeno3接口)

    opporeno3是什么接口(opporeno3接口)

  • iphone11pro第一次充电充多久(苹果11pro第一次使用如何正确充电)

    iphone11pro第一次充电充多久(苹果11pro第一次使用如何正确充电)

  • 蓝牙耳机突然无法配对(蓝牙耳机突然无法连接)

    蓝牙耳机突然无法配对(蓝牙耳机突然无法连接)

  • 桌面亮度怎么调整(桌面亮度怎么调高)

    桌面亮度怎么调整(桌面亮度怎么调高)

  • 苹果手机怎么设置键盘壁纸(苹果手机怎么设置骚扰电话拦截)

    苹果手机怎么设置键盘壁纸(苹果手机怎么设置骚扰电话拦截)

  • 小米手机为什么会断流(小米手机为什么便宜)

    小米手机为什么会断流(小米手机为什么便宜)

  • 抖音里拉黑对方,对方会收到信息提示吗(怎么在抖音里拉黑对方)

    抖音里拉黑对方,对方会收到信息提示吗(怎么在抖音里拉黑对方)

  • ipad air2能装手机卡吗(ipadair2能安装ios14吗)

    ipad air2能装手机卡吗(ipadair2能安装ios14吗)

  • 苹果手机能设几个指纹(苹果手机能设几个面部)

    苹果手机能设几个指纹(苹果手机能设几个面部)

  • 如何屏蔽淘宝直播(如何屏蔽淘宝直播主播)

    如何屏蔽淘宝直播(如何屏蔽淘宝直播主播)

  • 手机怎么设置儿童模式(手机怎么设置儿童不能下载软件)

    手机怎么设置儿童模式(手机怎么设置儿童不能下载软件)

  • 荣耀20i怎么设置三键(荣耀20i怎么设置指纹解锁)

    荣耀20i怎么设置三键(荣耀20i怎么设置指纹解锁)

  • 抖音删了的视频怎么找回(抖音删了的视频在哪里找回)

    抖音删了的视频怎么找回(抖音删了的视频在哪里找回)

  • word图片被锁定(word图片锁定纵横比在哪里)

    word图片被锁定(word图片锁定纵横比在哪里)

  • zao怎么去水印(zao水印去除)

    zao怎么去水印(zao水印去除)

  • qq红钻在手机上怎么用(qq手机版红钻在哪充值)

    qq红钻在手机上怎么用(qq手机版红钻在哪充值)

  • 手机怎么和电视多屏互动(手机怎么和电视传输文件)

    手机怎么和电视多屏互动(手机怎么和电视传输文件)

  • rtos.exe - rtos是什么进程 有什么用(rtos有什么用)

    rtos.exe - rtos是什么进程 有什么用(rtos有什么用)

  • 当前页面的脚本发生错误怎么解决(当前页面的脚本发生错误代码0没有注册类)

    当前页面的脚本发生错误怎么解决(当前页面的脚本发生错误代码0没有注册类)

  • matchpathcon命令  查看文件默认安全上下文(matching path)

    matchpathcon命令 查看文件默认安全上下文(matching path)

  • 税控盘服务费全额抵扣分录
  • 增值税发票有
  • 房屋契税缴纳比例
  • 价税分离的公式是什么呀
  • 企业出租房产增值税率
  • 个体户查账征收需要交什么税
  • 上个月结余应该做到这个月收入里面吗
  • 业务招待费扣除基数的收入包括哪些
  • 公司给员工报销话费怎么做账
  • 收银设备如何入账的
  • 返佣账务处理
  • 房屋建筑物折旧率计算
  • 住房公积金的会计处理
  • 公户转到老板私人账户
  • 先转款后开票会计分录
  • 代缴代扣个人所得税手续费
  • 老板垫付员工工资怎么写条子
  • 期末余额全部转出的有哪些
  • 生产共同费用每个月都有摊销吗?
  • 利息收入要不要交增值税?
  • 小企业会计准则科目
  • 个人名义去税务局开票
  • 工资薪金所得的个人所得税筹划方法
  • 建筑材料营改增之前怎么开发票
  • 产品成本差异总额计算公式
  • 开票时金额怎么能含税
  • 事业单位的账务
  • 债权转让账务如何处理
  • 固定资产的确认条件有哪些
  • 税务局返还的个税手续费需要缴纳增值税吗
  • 工程分配协议书范本
  • 票据贴现公司需要资质吗
  • 办公费定义
  • 上个月退货会计分录
  • 远程桌面连接失败了
  • dedecms主页修改
  • php面向对象的三大特征
  • php数组函数有哪些
  • 境外汇款所得税缴纳规定
  • linux解压安装
  • 喝咖啡的好处和坏处 女性
  • 闲置私家车出租APP
  • 一亩地是多少平方?
  • yarn install报错
  • 酒类销售企业广告宣传语
  • 合同负债和预收负债的区别
  • 罗马湖在哪
  • 增值税纳税申报表附列资料(一)
  • PostMan接口测试(很全面的接口测试教程)
  • php微信公众号开源框架
  • 季度盈利弥补亏损利润表
  • 出差托运行李公司报销吗
  • 分公司开票总公司收款怎么做账
  • 织梦系统网站搭建教程
  • 回溯法实现全排序的方法
  • 公司注册地址变更有什么影响
  • mongodb重置密码
  • 什么叫挂往来
  • 应付职工薪酬科目余额表怎么看
  • 小规模企业房产税减按50%
  • 公司年底奖金怎么计算
  • 其他债权投资期末公允价值的变动应当计入
  • 自产的产品用于管理部门
  • 本期盈余结转会亏损吗
  • 技术服务费发票怎么开
  • 收到个人退回的社保费,怎样做分录
  • sql中的where in
  • 如何替换图片中的文字
  • w10系统音频怎么设置
  • msoia.exe是什么程序
  • win8的显示设置
  • windows8如何使用
  • win8登录密码修改
  • 在win7上加装一个硬盘不显示
  • 回调阶段
  • javascript中
  • 有nodejs就不需要用java了么
  • 批处理计数
  • 收到虚开增值税专用发票怎么处理
  • 低保户系统能查出来吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设