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

  • 诺基亚2700c线控(诺基亚2700c驱动)(诺基亚2700s)

    诺基亚2700c线控(诺基亚2700c驱动)(诺基亚2700s)

  • 小布助手在哪里打开(小布助手在哪里设置)

    小布助手在哪里打开(小布助手在哪里设置)

  • 华为nova5字体怎么改(华为nova字体怎么改)

    华为nova5字体怎么改(华为nova字体怎么改)

  • 苹果平板怎么下载钉钉(苹果平板怎么下载微信)

    苹果平板怎么下载钉钉(苹果平板怎么下载微信)

  • 微信昵称可以加好友吗(微信昵称可以加进去的符号)

    微信昵称可以加好友吗(微信昵称可以加进去的符号)

  • 手机一直说话关不掉了怎么办(手机一直说话关不了怎么办)

    手机一直说话关不掉了怎么办(手机一直说话关不了怎么办)

  • oppo键盘突然没了(oppo键盘没有了)

    oppo键盘突然没了(oppo键盘没有了)

  • 为什么5g手机显示4g(为什么5g手机显示4g信号)

    为什么5g手机显示4g(为什么5g手机显示4g信号)

  • 手机号被拉黑了打电话听到的是什么声音(手机号被拉黑了提示音是什么)

    手机号被拉黑了打电话听到的是什么声音(手机号被拉黑了提示音是什么)

  • 如何提高淘宝安全等级过低无法评论(提高淘宝信誉度的方法)

    如何提高淘宝安全等级过低无法评论(提高淘宝信誉度的方法)

  • 苹果11怎么拒绝来电(苹果11怎么拒绝垃圾信息和电话)

    苹果11怎么拒绝来电(苹果11怎么拒绝垃圾信息和电话)

  • 手机生态是什么意思(手机生态圈是什么意思)

    手机生态是什么意思(手机生态圈是什么意思)

  • mpp文件怎么打开(mpp文件怎么打开软件)

    mpp文件怎么打开(mpp文件怎么打开软件)

  • cache是外存储器嘛(cache存储器是内存储器吗)

    cache是外存储器嘛(cache存储器是内存储器吗)

  • iphone11怎么更换来电铃声(iPhone11怎么更换手机字体)

    iphone11怎么更换来电铃声(iPhone11怎么更换手机字体)

  • 怎么调整下划线长度(怎么调整下划线的长度)

    怎么调整下划线长度(怎么调整下划线的长度)

  • ios12日历不显示节假日(iphone日历不显示)

    ios12日历不显示节假日(iphone日历不显示)

  • 抖音的水印在哪设置(抖音视频水印在哪)

    抖音的水印在哪设置(抖音视频水印在哪)

  • 华为手机设置里面的高级设置在哪里(华为手机设置里找不到开发人员选项)

    华为手机设置里面的高级设置在哪里(华为手机设置里找不到开发人员选项)

  • 黑鲨2有手柄吗(黑鲨2游戏手柄好用吗)

    黑鲨2有手柄吗(黑鲨2游戏手柄好用吗)

  • 华为Nova 5Pro怎么截屏(华为nova5pro怎么强制关机)

    华为Nova 5Pro怎么截屏(华为nova5pro怎么强制关机)

  • 移动光纤猫4个接口作用(移动光纤猫4个接口都可以接路由器吗)

    移动光纤猫4个接口作用(移动光纤猫4个接口都可以接路由器吗)

  • 电脑截图是ctrl加什么(电脑截图是存在哪里的)

    电脑截图是ctrl加什么(电脑截图是存在哪里的)

  • 珠穆朗玛峰的影子,尼泊尔喜马拉雅西部 (© Kent Karvey/KH Films, Inc./Tandem Stills + Motion)(珠穆朗玛峰的壮观)

    珠穆朗玛峰的影子,尼泊尔喜马拉雅西部 (© Kent Karvey/KH Films, Inc./Tandem Stills + Motion)(珠穆朗玛峰的壮观)

  • PhoneGap was accuriqed by adobe

    PhoneGap was accuriqed by adobe

  • Discuz!管理员无法登录后台时更新系统缓存的方法(discuz管理中心进不去)

    Discuz!管理员无法登录后台时更新系统缓存的方法(discuz管理中心进不去)

  • 增值税发票上数量与单价
  • 公司注销了账本还需保留吗
  • 以前年度损益结转到未分配利润
  • 部分红冲的发票,剩余未冲红部分可以再红冲么
  • 住宿费取得增值税专用发票,抵扣进项税额如何计算
  • 销售息税前利润是什么
  • 承兑汇票丢了如何追回
  • 上市公司股票增持是什么回事
  • 固定资产税前一次性扣除政策中的扣除十点
  • 无形资产根据什么填列资产负债表
  • 月初缴纳的保险是当月的吗
  • 即征即退增值税政策
  • 政府机关开票是普票还是专票
  • 矿泉水售卖方式
  • 房地产开发企业预收款预缴增值税
  • 税控盘没有反写会怎样
  • 土地作价入股政策
  • 以前年度收入调整账务处理怎么做
  • 记账凭证保存年限2019
  • 支付测量费的补贴费用怎么记账
  • 不合规发票有哪些风险
  • 公司买厨房用品计入什么科目
  • 营运能力指标正常范围
  • 资产处置收益期末有余额吗
  • 银行承兑汇票的付款期限
  • 奖励先进个人计划怎么写
  • php随机ua
  • 怎样删除电脑系统账户
  • 追加投资会增加实收资本吗
  • gain_trickler_3202.exe 进程查询 gain_trickler_3202进程是什么文件
  • 电子承兑兑现手续费
  • 瓜纳华托大学世界排名
  • 营改增允许从销售额中扣
  • 增值税纳税申报表在哪里打印
  • mavon-editor的使用
  • php mysql pdo
  • vue display
  • jqueryfor
  • 小微企业会计制度是什么
  • 计提本月银行存款应收利息会计分录
  • 购进商品发生溢余的核算
  • 支付施工单位进度款的请示
  • 交通费比例
  • 机票改签费贵吗
  • MSSQL2005在networkservice权限运行附加数据库报(Microsoft SQL Server,错误: 5120)
  • 接受捐赠计入
  • 多用途卡的监管机构是
  • 营业成本怎么理解
  • 合同资产和合同负债的区别
  • 企业清算未分配利润怎么交税
  • 建筑行业收到的工程转给项目经理成本票从哪来
  • 增值税专用发票几个点
  • 股东多缴投资款处理
  • 过路费发票可以抵扣进项税吗
  • 应收账款结算方式有几种
  • 发票金额比实际支付金额大
  • 商品储存的基本要求是什么?
  • 核定征收方式有哪些
  • 饭店会计做账流程
  • 伤病假条
  • mongodb与mysql相比的优缺点
  • mysql 300万条数据
  • u深度pe装机工具使用教程win7
  • win8/10whql
  • linux认证失败的原因
  • version 2什么意思
  • 亲测可用抖音低价单赚派费项目
  • service.exe是什么
  • 找回失窃的书本任务
  • linux查看sh
  • 如何使用调制解调器
  • cocos2dx官方教程
  • jquery解析html文本
  • 归档 oracle
  • vue.js有什么用
  • js怎么学扎实
  • 税控盘怎么领用
  • 国家医保平台查不到住院记录
  • 企业少缴社保怎么补偿
  • 城市维护建设税属于什么科目
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设