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

  • 允许不完美(允许不完美的事实例子素材)

    允许不完美(允许不完美的事实例子素材)

  • opporeno7怎么分屏操作方法(oppor7怎样分屏)

    opporeno7怎么分屏操作方法(oppor7怎样分屏)

  • b站青少年模式怎么关(B站青少年模式被莫名开启)

    b站青少年模式怎么关(B站青少年模式被莫名开启)

  • 计算机默认用户名(计算机默认用户密码)

    计算机默认用户名(计算机默认用户密码)

  • 怎么退出快手账号登录(怎么退出快手账号绑定)

    怎么退出快手账号登录(怎么退出快手账号绑定)

  • 红米10x支持内存卡吗(红米10x内存扩展最大支持多少)

    红米10x支持内存卡吗(红米10x内存扩展最大支持多少)

  • 京东买的ipad可以在苹果售后吗(京东买的ipad可以去直营店退货吗)

    京东买的ipad可以在苹果售后吗(京东买的ipad可以去直营店退货吗)

  • 需要借助有线电视线路接入宽带的方式是(什么接入是利用现有的有线电视)

    需要借助有线电视线路接入宽带的方式是(什么接入是利用现有的有线电视)

  • iqooneo3内存是ddr5吗(iqooneo3内存是lpddr5吗)

    iqooneo3内存是ddr5吗(iqooneo3内存是lpddr5吗)

  • 微信语音看视频对面能听到吗(微信语音看视频没声音)

    微信语音看视频对面能听到吗(微信语音看视频没声音)

  • 扫描到wsd是扫描到哪里(扫描至wsd)

    扫描到wsd是扫描到哪里(扫描至wsd)

  • 苹果11怎么调铃声(苹果11怎么调铃声大小快捷方式)

    苹果11怎么调铃声(苹果11怎么调铃声大小快捷方式)

  • 华为p40和p40pro外观有什么区别(华为p40和p40pro外关有什么区别)

    华为p40和p40pro外观有什么区别(华为p40和p40pro外关有什么区别)

  • iPhoneX的底部小白条如何取消(iphonex底部菜单栏在哪里)

    iPhoneX的底部小白条如何取消(iphonex底部菜单栏在哪里)

  • 苹果11烫手怎么回事(苹果11烫手怎么解决)

    苹果11烫手怎么回事(苹果11烫手怎么解决)

  • 苹果x是双卡吗(苹果xr是双卡吗)

    苹果x是双卡吗(苹果xr是双卡吗)

  • 华为matex屏幕比例

    华为matex屏幕比例

  • 手机qq邮件怎么申请(手机qq邮件怎么看)

    手机qq邮件怎么申请(手机qq邮件怎么看)

  • 手机怎么改淘宝生日(手机怎么改淘宝登录密码)

    手机怎么改淘宝生日(手机怎么改淘宝登录密码)

  • 如何在微拍堂卖东西(微拍堂怎么卖)

    如何在微拍堂卖东西(微拍堂怎么卖)

  • vivo中log有必要开启吗(vivologo)

    vivo中log有必要开启吗(vivologo)

  • win7电脑黑屏只有鼠标(win7电脑黑屏只能看见鼠标)

    win7电脑黑屏只有鼠标(win7电脑黑屏只能看见鼠标)

  • 抖音怎么创作音乐(抖音怎么创作音乐视频)

    抖音怎么创作音乐(抖音怎么创作音乐视频)

  • excel打印设置成一页(excel打印的时候怎么设置为a4)

    excel打印设置成一页(excel打印的时候怎么设置为a4)

  • vue3+vite中使用环境变量 .env 的一些配置情况说明(vue如何配置环境变量)

    vue3+vite中使用环境变量 .env 的一些配置情况说明(vue如何配置环境变量)

  • 解决d2l包下载不了的问题(d2loader does not recognize)

    解决d2l包下载不了的问题(d2loader does not recognize)

  • 公司利润税怎么交
  • 全额纳税是什么意思
  • 工商年报主营业务怎么填
  • 总账一级科目有哪些
  • 收到原材料发票的会计分录
  • 补交土地使用税到大厅怎么申报
  • 工会筹备金需不需要计提
  • 为什么要进行建筑工程预算
  • 4s店代办保险回扣
  • 金蝶kis标准版自定义报表功能
  • 购销合同印花税怎么算
  • 劳务费发票是个人开还是公司开
  • 租入住房用于职工福利,进项转出吗?
  • 机动车丢失后怎么销户
  • 善意取得虚开专票的条件包括
  • 票据和结算凭证上的签章
  • 公司向股东无息借款要交哪些税
  • 企业搬迁补偿款发放流程
  • 抵缴以前年度多缴所得税如何做会计分录?
  • 通过无偿取得的成果
  • 小规模纳税人核定征收怎么报税
  • 没有开通对公账户
  • 无偿赠送要交税吗
  • 滞纳金入什么会计科目
  • 实际出资和名义出资
  • 劳务费的现金流量是什么
  • 成本核算的基本方法及适用范围
  • 如何能屏蔽自动扣费服务
  • linux连接windows的服务redis
  • 设备的折旧率是什么意思
  • 在win10中怎么从edge旧ie浏览器
  • 浏览器备份文件在哪里
  • 苹果官网iPhone12
  • silent.exe - silent是什么进程 有什么用
  • mac 查看当前用户
  • uni-app实例教程
  • 银行本票存款和银行存款的区别
  • 企业员工的工资设定标准
  • symfony2.4的twig中date用法分析
  • 睡在海面上
  • clh锅
  • phpsession和cookie
  • windowsserver2019产品密钥
  • 什么情况下需要异地预缴增值税
  • 无偿调入的固定资产怎么记账
  • 法定公益金和法定保险金
  • 质押发票
  • 支付到期承兑汇票属于什么现金流量项目
  • 查账征收与核定征收在哪里看
  • 分红做什么会计分录
  • 对存在标的资产的亏损合同,企业应首先对标的资产
  • 红字冲销表示负数吗
  • 应交税费中应交税金包含个税吗
  • 公司租的房子电费发票怎么开
  • 资产负债表负债率怎么计算
  • 资产评估费怎么收
  • 会计凭证的审核的注意事项有哪些
  • 私对公可以转账怎么转
  • mysql如何输入数据
  • Windows Server 2008如何设置自动获取ip?设置自动获取ip教程
  • Windows 2003 SP2 简体中文版下载地址
  • windowsaudio服务不存在或已删除
  • 把mac屏幕切换到桌面desktop
  • win10桌面图标无法正常显示
  • win7 ctrl+alt+del
  • bash 数值比较
  • css如何控制图片位置
  • pycharm如何使用
  • unity手机游戏开发教程
  • nodejs实战
  • android 属性动画改变view大小
  • linux反弹shell方法
  • android退出功能
  • 延时加载js文件
  • 广东省电子税务局登录方式
  • 深圳社保最迟每月几号交啊多少钱
  • 职业年金利息计入哪个科目里面
  • 党建 共享
  • 朝阳银行作息时间
  • 增值税发票选择确认平台已勾选未确认的发票怎么撤销?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设