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

  • 纳税人资格类型有哪些
  • 分公司一定要汇总申报吗
  • 用固定资产投资怎么做账
  • 水资源税怎么入账
  • 营改增以前土地交易应交税费
  • 零售行业的销售员有加班费吗
  • 土地增值税扣除系数
  • 长期挂账的应付账款怎么处理
  • 自建生产用机器设备领用本企业生产的产品
  • 财务杠杆和经营杠杆的区别
  • 库存方面的会计是做什么的
  • 投资项目的资本金的认缴
  • 以前年度损益调整属于哪类科目
  • 对方电子承兑发出多长时间可以到账
  • 京东电子商务平台业务流程
  • 纳税人是非开业户是什么意思
  • 价内税和价外税区别
  • 查账征收的成本费用
  • 参加展会的住宿费计入什么科目
  • 建筑装饰行业税负
  • 历史成本重置成本属于会计是什么
  • 冲减增值税销项税额
  • 法院的诉讼费和保全费怎么算
  • 结算会计和往来账的区别
  • 股权无偿赠与子女怎么办理手续
  • 车船使用牌照税收多少
  • 怎么计算研发费用占销售收入总额比例
  • 企业购买固定资产要交印花税吗
  • 无法卸载系统更新 backup
  • 跨月冲红发票需收回原发票
  • php截取网页指定内容
  • 收不回的应收账款会计分录
  • 公允价值变动损益借贷方向增减
  • 出借和出租包装物的区别
  • transformer中的token
  • 自查补缴增值税附表一怎么填写
  • 未分配利润是负数是亏损吗
  • 非公司员工可以举报公司不交社保吗
  • 报税财务报表一定要填吗
  • 固定资产多少钱以上计入固定资产
  • 企业一直零申报不经营
  • 资产负债表的负债项目显示了企业所负担债务的
  • sql语句的查询语句
  • 汇算清缴的费用标准 中汇
  • 长期待摊费用的摊销期限应该是
  • sql server提示不允许保存更改
  • 一次性加速折旧考虑残值吗
  • 房地产增值税可以抵扣吗
  • 电脑入账如何做凭证
  • 企业现金流量表怎么分析
  • 新增项目和延续项目
  • 辞退福利的会计分录怎么写
  • 固定资产处理附件是什么
  • 会计中借方和贷方各指什么
  • 接受小规模纳税人的货运服务
  • 企业发放职工薪酬的账务处理
  • 报销单填写发票第几页交给财务
  • 可转债公允价值变动计入
  • 个人账户打流水需要本人吗
  • 期间费用是啥
  • 会计师事务所工作怎么样
  • 离职补偿金要交个税吗
  • 固定资产为什么提折旧,有何实际意义
  • mysql.sock在哪里
  • 禁止Windows 打游戏怎么办
  • win8电脑卡怎么办简单步骤
  • ubuntu怎么将文件传送到电脑
  • 下载的mt4安装成了mt5
  • html5能做游戏吗
  • javascript基础
  • activity跳转闪退
  • python3.8基础教程
  • python怎么将列表转换成数字
  • python连接mysql实例分享
  • 安卓登录界面布局设计
  • 建筑工程资质挂靠合同
  • 吉林省地方税务局单位职工集资建房免征营业税
  • 企业注销认缴与实缴是否还有风险
  • 国网四川电力客户电话号码
  • 太原公安分局有几个
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设