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

  • 微信已撤回消息怎么看(微信已撤回消息恢复器安卓)

    微信已撤回消息怎么看(微信已撤回消息恢复器安卓)

  • iqoo的语音助手叫什么名字(iQOO的语音助手叫什么名字)

    iqoo的语音助手叫什么名字(iQOO的语音助手叫什么名字)

  • 小米10至尊纪念版采用是什么散热技术(小米10至尊纪念版和小米10s哪个好)

    小米10至尊纪念版采用是什么散热技术(小米10至尊纪念版和小米10s哪个好)

  • 微信图片翻译功能怎么找出来(微信图片翻译功能怎么取消)

    微信图片翻译功能怎么找出来(微信图片翻译功能怎么取消)

  • 微信被别人盗了手机号被换了怎么办(微信被别人盗了钱包里的钱怎么办)

    微信被别人盗了手机号被换了怎么办(微信被别人盗了钱包里的钱怎么办)

  • qq一起听歌怎么关闭(qq一起听歌怎么加自己的歌)

    qq一起听歌怎么关闭(qq一起听歌怎么加自己的歌)

  • 腾讯会议屏幕上有自己的名字(腾讯会议屏幕上的水印怎么去除)

    腾讯会议屏幕上有自己的名字(腾讯会议屏幕上的水印怎么去除)

  • 网管型和非网管型交换机有什么区别(网管型和非网管型交换机可以互相通讯吗)

    网管型和非网管型交换机有什么区别(网管型和非网管型交换机可以互相通讯吗)

  • 苹果工作机是什么意思(苹果工作机和正常机的区别)

    苹果工作机是什么意思(苹果工作机和正常机的区别)

  • 华为nova7pro是曲面屏吗(华为nova7pro是曲面屏手机吗)

    华为nova7pro是曲面屏吗(华为nova7pro是曲面屏手机吗)

  • qq字符有哪些(qq字符大全及含义)

    qq字符有哪些(qq字符大全及含义)

  • 华为p40的隐藏空间怎么打开(华为p40隐藏挖空)

    华为p40的隐藏空间怎么打开(华为p40隐藏挖空)

  • 表和数据库的关系(数据库中表与表的关系有______3种类型)

    表和数据库的关系(数据库中表与表的关系有______3种类型)

  • iphone小黑点怎么设置(iphone小黑点怎么设置快速截屏)

    iphone小黑点怎么设置(iphone小黑点怎么设置快速截屏)

  • oppo全屏手机下面三个键怎么设置(oppo全屏手机下面黑影怎么消掉)

    oppo全屏手机下面三个键怎么设置(oppo全屏手机下面黑影怎么消掉)

  • 组成计算机系统的两大部分是什么(组成计算机系统基本部分)

    组成计算机系统的两大部分是什么(组成计算机系统基本部分)

  • 手机上qq怎么找微博(手机上qq怎么找回十年前删除的好友)

    手机上qq怎么找微博(手机上qq怎么找回十年前删除的好友)

  • 怎么把情侣黄钻标识去掉(怎么把情侣黄钻的装扮去掉)

    怎么把情侣黄钻标识去掉(怎么把情侣黄钻的装扮去掉)

  • 美柚怎么用(美柚怎么用淘宝账号登录)

    美柚怎么用(美柚怎么用淘宝账号登录)

  • ba621电池是什么手机(bl681电池)

    ba621电池是什么手机(bl681电池)

  • cad全图显示快捷键(cad中全图显示快捷键)

    cad全图显示快捷键(cad中全图显示快捷键)

  • 苹果微信如何修改个性签名(苹果微信如何修改支付密码)

    苹果微信如何修改个性签名(苹果微信如何修改支付密码)

  • 电脑文件怎么发送到qq(电脑文件怎么发送到qq邮箱)

    电脑文件怎么发送到qq(电脑文件怎么发送到qq邮箱)

  • 压缩文件夹发给别人教程(压缩文件夹发给别人他能看到我桌面上的文件吗)

    压缩文件夹发给别人教程(压缩文件夹发给别人他能看到我桌面上的文件吗)

  • 个税申报月份错了怎么改
  • 代发工资记什么科目
  • 个税申报收入额怎么填
  • 财务预算是做什么的
  • 以前年度损益调整会计分录
  • 开具成品油专用发票时,应遵守哪些规则
  • 投标人认证证书
  • 资产减值准备怎么转回
  • 生产企业电费要不要计提?
  • 建筑工程的适用范围
  • 采购合同中含税金额
  • 承包承租经营单位是什么意思
  • 合理工资薪金的确认原则
  • 非专利技术属于无形资产吗?
  • 处置子公司合并抵消
  • 子公司借款给母公司是否受2:1
  • 支付境外服务费税务如何处理
  • 个体户需要记账嘛
  • 跨年度冲减收入
  • 固定资产怎么录入系统
  • mac 装 windows
  • 贷款贴息是什么政策
  • 出售报废固定资产的净损失计入什么科目
  • macqq怎么查看删除好友
  • 汽车费用怎么做账
  • 销售费用中业务费包括哪些
  • 股权出资成立公司的条件
  • 宜搭下载
  • php 用户注册
  • php输出数字
  • php实现截取中文字符
  • php 面向对象
  • php获取当前页面url
  • vue跨域的几种方式
  • 个体户给对方公司开发票会怎样
  • 特许经营企业的特点
  • 送货单收据怎么写
  • 广告费明细清单
  • access untagged
  • 房地产企业借款利息扣除标准
  • 开票限额相关规定最新
  • 培训学校收入如何确认
  • 运输服务属于生活服务吗
  • 补计提去年所得税会影响当月资产
  • 手机里面的发票怎么查
  • 固定资产3%减按2%征收增值税申报表如何填写
  • 房产评估增值是什么意思
  • 困难企业社保费返还
  • 存货的进口关税计入成本吗
  • 积分兑换如何做表格分析
  • 公司赠送客户礼品怎么做账
  • 开了红字发票申请还要做进项税转出吗?
  • 差旅费借记什么科目
  • 外账和内账怎么配合做账
  • 账簿设计要以()为前提
  • win10安装sqlserver2016出错
  • sqlserver恢复模式简单和完整
  • sqlserver日期类型数据
  • win10右键自动弹出
  • macbookpro如何扫描
  • win7系统玩英雄联盟黑屏怎么办
  • linux命令date
  • win8.1 安装
  • window10光驱不能用了
  • cocos2dx怎么用
  • android不同module怎么相互调用
  • dos命令/s
  • 批处理在windows中的典型应用
  • python,数组
  • opengl发光物体
  • 微信小程序表单制作代码
  • 批处理基础知识
  • android:scaletype="centercrop"
  • unity用鼠标控制物体移动
  • pygame 安装
  • 使用jquery的步骤
  • unity热更新框架对比
  • 高速公路发票在哪里开
  • 贵州省地方税务局税源管理平台(二次)招标合同公告
  • 关税由谁来承担
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设