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

  • 强国云盘的容量最大是多少GB(强国云盘最大储存空间)

    强国云盘的容量最大是多少GB(强国云盘最大储存空间)

  • 哔哩哔哩年度报告怎么看(哔哩哔哩年度报告怎么删除)

    哔哩哔哩年度报告怎么看(哔哩哔哩年度报告怎么删除)

  • 小米mix3万象息屏如何设置(小米 mix 3)

    小米mix3万象息屏如何设置(小米 mix 3)

  • 荣耀20pro能插耳机吗(荣耀20pro如何插耳机)

    荣耀20pro能插耳机吗(荣耀20pro如何插耳机)

  • 淘宝买家怎样达到四心(淘宝买家怎么发货)

    淘宝买家怎样达到四心(淘宝买家怎么发货)

  • 抖音均衡器怎么调(抖音音响均衡器设置图)

    抖音均衡器怎么调(抖音音响均衡器设置图)

  • word字体默认颜色是什么(word默认的字体颜色)

    word字体默认颜色是什么(word默认的字体颜色)

  • 微信点在看有什么用(微信在看点了可以取消吗)

    微信点在看有什么用(微信在看点了可以取消吗)

  • 基带传输和频带传输有什么区别(基带传输和频带传输的区别)

    基带传输和频带传输有什么区别(基带传输和频带传输的区别)

  • qq音乐电视版叫什么(QQ音乐电视版叫什么)

    qq音乐电视版叫什么(QQ音乐电视版叫什么)

  • 钉钉视频会议主持人录制是什么意思(钉钉视频会议主持人可以强制开麦吗)

    钉钉视频会议主持人录制是什么意思(钉钉视频会议主持人可以强制开麦吗)

  • 华为手机视频听不到声音(华为手机视频听不见对方声音,但对方能听见我声音)

    华为手机视频听不到声音(华为手机视频听不见对方声音,但对方能听见我声音)

  • 微信买票身份核验异常(微信购票身份核实失败)

    微信买票身份核验异常(微信购票身份核实失败)

  • 充着电玩手机对电池有害吗(充着电玩手机对充电器有什么影响)

    充着电玩手机对电池有害吗(充着电玩手机对充电器有什么影响)

  • 平台认证失败401(平台认证失败pubg)

    平台认证失败401(平台认证失败pubg)

  • 京东待评价商品可以删除吗(京东待评价商品怎么删除掉)

    京东待评价商品可以删除吗(京东待评价商品怎么删除掉)

  • vivonex3是双扬声器吗(vivonexs是双扬声器吗)

    vivonex3是双扬声器吗(vivonexs是双扬声器吗)

  • 免拼成功了还要钱吗(免拼成功还要付钱么)

    免拼成功了还要钱吗(免拼成功还要付钱么)

  • 拼多多个人资料改不了(拼多多个人资料怎么改)

    拼多多个人资料改不了(拼多多个人资料怎么改)

  • 笔记本调节亮度(笔记本调节亮度的键不管用了)

    笔记本调节亮度(笔记本调节亮度的键不管用了)

  • 如何做抖音短视频(如何做抖音短视频原创)

    如何做抖音短视频(如何做抖音短视频原创)

  • 苹果6录像怎么暂停(苹果6录像怎么样)

    苹果6录像怎么暂停(苹果6录像怎么样)

  • 惠普2622墨盒清零步骤(惠普2622墨盒清零图解视频)

    惠普2622墨盒清零步骤(惠普2622墨盒清零图解视频)

  • 6s管理为什么把安全放在最后(为什么说6s是企业管理的基石)

    6s管理为什么把安全放在最后(为什么说6s是企业管理的基石)

  • 荣耀青春版10有没有红外线(荣耀青春版10有双系统吗)

    荣耀青春版10有没有红外线(荣耀青春版10有双系统吗)

  • a1674是ipad几(a1674是ipad几代那年款)

    a1674是ipad几(a1674是ipad几代那年款)

  • 手机号码怎么备份(手机号码怎么备份到卡上)

    手机号码怎么备份(手机号码怎么备份到卡上)

  • python元类冲突的问题(python元组操作方法)

    python元类冲突的问题(python元组操作方法)

  • 如何使用python中的add函数?(python怎么用?)

    如何使用python中的add函数?(python怎么用?)

  • 小规模纳税人预缴企业所得税
  • 小规模未达起征点免税分录
  • 计提工资附什么单据
  • 财务负责人和法人可以是夫妻吗
  • 增值税进项税转出政策依据
  • 企业收到预收账款,能不能给购买方开具发票
  • 屋面维修按定额预算明细表
  • 建筑业统一发票可以抵扣吗
  • 2月的发票入在1月可以吗
  • 发票报销的补助是否缴纳个人所得税?
  • 广告制作费有哪些项目
  • 零售超豪华小汽车交消费税吗
  • 跨年补交企业所得税
  • 企业发生的以旧换新业务应该按照什么处理
  • 企业破产应收账款要发询证函吗
  • 收到质量索赔款怎么入账
  • 小规模纳税人收到专票后如何处理
  • 苹果mac切换桌面快捷键
  • 以租代购如何做账
  • 收到科技局研发的短信
  • 厂区地面硬化的意义
  • 一帆风顺的养殖土壤用什么土
  • 重置edge浏览器设置
  • 应付债券借贷
  • 应付票据是发票吗
  • 非货币性资产对外捐赠企业所得税处理
  • 收入凭证填写
  • 微信php开发包
  • ls命令的作用
  • 账户利息怎么计算
  • 关于实收资本的表述中,不正确的是
  • 不同会计制度资产负债表金额不一样
  • 资产负债表和利润表的勾稽关系
  • 异地工作人员管理
  • 公司股东向银行货款,与私人财产有没有关系
  • 金税四期的政策
  • 免征水利建设基金条件
  • 企业每个季度叫什么
  • 进项税额转出期限是多久
  • 个人独资企业要交哪些税
  • 预缴增值税需要提交什么资料
  • 申报残保金的时候有处罚决定书怎么办
  • 科研专用费是什么
  • 认缴的实收资本需要做账吗?
  • 完工不拨付工程款怎么处理
  • 获得赔偿收入什么科目
  • 11个点增值税发票是多少
  • 固定资产报废由谁审批
  • 施工赔偿款怎么记账
  • 领用材料属于什么费用
  • 年终奖和工资一起发吗
  • 仓库周转率是什么意思
  • Ubuntu15下mysql5.6.25不支持中文的解决办法
  • mysql null+1
  • window装机必备应用
  • freebsd的软件多吗
  • centos6.5mini安装教程
  • 重装系统东西
  • c盘esd是什么文件夹
  • xp能不能升级win10
  • win10系统怎么查询ip
  • winxp如何将桌面文件默认到d盘
  • win7如何删除无法删除的文件
  • cocos2dx 教程
  • bat批处理视频教程
  • perl cgi
  • 如何强制和别人qq聊天
  • python获取当前地址
  • unity rpg插件
  • python wms
  • JavaScript中的NaN代表什么
  • js md5加密方法
  • js鼠标框选
  • js数组entries
  • js设计模型
  • js写表格模板
  • 浅谈自己对教育的理解
  • 哪些初级农产品可以免税
  • 江苏省国家税务局电话号码
  • 劳务包含哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设